当前位置:   article > 正文

smtp邮件发送功能_smtp发信

smtp发信

前言:

邮件发送功能学习实践笔记
关于pop、imap、smtp的知识可自行百度了解
此文为smtp邮件发送的工具类总结,其中包含两种方法
1、未开启安全机制的默认端口发送邮件,单个邮箱发送、多个邮箱发送(包含两种传参形式)。
2、开启ssl安全机制更改端口的邮件发送。
这两种方式第一种适用于没有端口限制的环境,第二种适用于像阿里云服务器等限制端口的环境。

一、授权码获取

关于每个邮箱平台查看授权码的方式可百度
这里以126邮箱为例
登陆后—>设置—>POP3/SMTP/IMAP
在这里插入图片描述
在这里插入图片描述
在此界面可开启/关闭smtp服务以及获取授权码
选择新增授权密码,通过验证即可获取授权码
后面代码中配置需要用到授权码
在这里插入图片描述

二、依赖引入

所需依赖:

        <!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.2</version>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

三、工具类SmtpEmailUtils.java

package com.smtp.email;

import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.List;
import java.util.Properties;

/**
 * @Author:李白
 * @Date:2023/1/8 12:57
 */
public class SmtpEmailUtils {



    /**
     * 1发送邮件(单条发送纯文本邮件)
     * @param mailSend 发件人
     * @param mailSendAuthCode 发件人邮箱授权码
     * @param mailReceive 收件人
     * @param subject 邮件主题
     * @param content 邮件内容
     * @throws AddressException
     */
    public static void sendMail(String mailSend, String mailSendAuthCode, String mailReceive, String subject, String content) throws MessagingException {
        //配置发送邮件的属性
        Properties properties = new Properties();
        //是否需要身份验证
        properties.put("mail.smtp.auth","true");
        //服务器地址
//        properties.put("mail.smtp.host","smtp.qq.com");
        properties.put("mail.smtp.host","smtp.126.com");
        //登陆账号密码,需开启smtp
//        properties.put("mail.user","发件人邮箱");
        properties.put("mail.user",mailSend);
        //smtp提供的授权码(非密码)
//        properties.put("mail.password","发件人邮箱授权码");//qq
//        properties.put("mail.password","发件人邮箱授权码");//126
        properties.put("mail.password",mailSendAuthCode);

        //构建授权信息,用于进行SMTP身份验证
        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //用户名,密码
                String userName = properties.getProperty("mail.user");
                String password = properties.getProperty("mail.password");
                return new PasswordAuthentication(userName, password);
            }
        };

        //使用环境属性和授权信息,创建邮件会话
        Session session = Session.getInstance(properties, authenticator);
        //创建邮件消息
        MimeMessage mimeMessage = new MimeMessage(session);
        //设置发件人
        InternetAddress from = new InternetAddress(properties.getProperty("mail.user"));
        mimeMessage.setFrom(from);

        //设置收件人
        InternetAddress to = new InternetAddress(mailReceive);
        mimeMessage.setRecipient(Message.RecipientType.TO,to);

        //设置抄送
//        InternetAddress cc = new InternetAddress("ssss@yahoo.com");
//        mimeMessage.setRecipient(Message.RecipientType.CC,cc);

        //设置秘密抄送,其他收件人不能看到密送的邮件地址
//        InternetAddress bcc = new InternetAddress("yyyy@163.com");
//        mimeMessage.setRecipient(Message.RecipientType.BCC,bcc);

        //设置邮件标题
        mimeMessage.setSubject(subject);
        //邮件内容
        mimeMessage.setContent(content,"text/html;charset = UTF-8");
        //发送邮件
        Transport.send(mimeMessage);

    }


    /**
     * 2发送邮件(群发1)
     * @param mailSend 发件人
     * @param mailSendAuthCode 发件人邮箱授权码
     * @param mailReceiveList 收件人列表(多个邮箱)
     * @param subject 邮件主题
     * @param content 邮件内容
     * @throws AddressException
     */
    public static void sendMails(String mailSend, String mailSendAuthCode, List mailReceiveList, String subject, String content) throws MessagingException {
        //配置发送邮件的属性
        Properties properties = new Properties();
        //是否需要身份验证
        properties.put("mail.smtp.auth","true");
        //服务器地址
//        properties.put("mail.smtp.host","smtp.qq.com");
        properties.put("mail.smtp.host","smtp.126.com");
        //登陆账号密码,需开启smtp
//        properties.put("mail.user","发件人邮箱");
        properties.put("mail.user",mailSend);
        //smtp提供的授权码(非密码)
//        properties.put("mail.password","发件人邮箱授权码");//qq
//        properties.put("mail.password","发件人邮箱授权码");//126
        properties.put("mail.password",mailSendAuthCode);

        //构建授权信息,用于进行SMTP身份验证
        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //用户名,密码
                String userName = properties.getProperty("mail.user");
                String password = properties.getProperty("mail.password");
                return new PasswordAuthentication(userName, password);
            }
        };

        //使用环境属性和授权信息,创建邮件会话
        Session session = Session.getInstance(properties, authenticator);
        //创建邮件消息
        MimeMessage mimeMessage = new MimeMessage(session);
        //设置发件人
        InternetAddress from = new InternetAddress(properties.getProperty("mail.user"));
        mimeMessage.setFrom(from);

        //设置收件人(多人收--群发)
//        InternetAddress to = new InternetAddress(mailReceive);
//        mimeMessage.setRecipient(Message.RecipientType.TO,to);
        InternetAddress[] tos = new InternetAddress[mailReceiveList.size()];
        for (int i = 0; i < mailReceiveList.size(); i++) {
            tos[i] = new InternetAddress(mailReceiveList.get(i).toString());
        }
        mimeMessage.setRecipients(Message.RecipientType.TO,tos);

        //设置抄送
//        InternetAddress cc = new InternetAddress("ssss@yahoo.com");
//        mimeMessage.setRecipient(Message.RecipientType.CC,cc);

        //设置秘密抄送,其他收件人不能看到密送的邮件地址
//        InternetAddress bcc = new InternetAddress("yyyy@163.com");
//        mimeMessage.setRecipient(Message.RecipientType.BCC,bcc);

        //设置邮件标题
        mimeMessage.setSubject(subject);
        //邮件内容
        mimeMessage.setContent(content,"text/html;charset = UTF-8");
        //发送邮件
        Transport.send(mimeMessage);

    }



    /**
     * 3发送邮件(群发2)
     * @param mailSend 发件人
     * @param mailSendAuthCode 发件人邮箱授权码
     * @param mailReceives 收件人(群发,多个邮箱以逗号隔开)
     * @param subject 邮件主题
     * @param content 邮件内容
     * @throws AddressException
     */
    public static void sendMails(String mailSend, String mailSendAuthCode, String mailReceives, String subject, String content) throws MessagingException {
        //配置发送邮件的属性环境
        Properties properties = new Properties();
        //是否需要身份验证
        properties.put("mail.smtp.auth","true");
        //服务器地址
//        properties.put("mail.smtp.host","smtp.qq.com");
        properties.put("mail.smtp.host","smtp.126.com");
//        properties.put("mail.smtp.port",465);
        //登陆账号密码,需开启smtp
//        properties.put("mail.user","发件人邮箱");
        properties.put("mail.user",mailSend);
        //smtp提供的授权码(非密码)
//        properties.put("mail.password","发件人邮箱授权码");//qq
//        properties.put("mail.password","发件人邮箱授权码");//126
        properties.put("mail.password",mailSendAuthCode);

        //构建授权信息,用于进行SMTP身份验证
        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //用户名,密码
                String userName = properties.getProperty("mail.user");
                String password = properties.getProperty("mail.password");
                return new PasswordAuthentication(userName, password);
            }
        };

        //使用环境属性和授权信息,创建邮件会话
        Session session = Session.getInstance(properties, authenticator);
        //创建邮件消息
        MimeMessage mimeMessage = new MimeMessage(session);
        //设置发件人
        InternetAddress from = new InternetAddress(properties.getProperty("mail.user"));
        mimeMessage.setFrom(from);

        //设置收件人(多个收件人,群发,收件人之间以逗号隔开)
//        InternetAddress tos = new InternetAddress(mailReceives);
        mimeMessage.setRecipients(Message.RecipientType.TO,mailReceives);

        //设置抄送
//        InternetAddress cc = new InternetAddress("ssss@yahoo.com");
//        mimeMessage.setRecipient(Message.RecipientType.CC,cc);

        //设置秘密抄送,其他收件人不能看到密送的邮件地址
//        InternetAddress bcc = new InternetAddress("yyyy@163.com");
//        mimeMessage.setRecipient(Message.RecipientType.BCC,bcc);

        //设置邮件标题
        mimeMessage.setSubject(subject);
        //邮件内容
        mimeMessage.setContent(content,"text/html;charset = UTF-8");
        //发送邮件
        Transport.send(mimeMessage);

    }


    /**
     * 适配服务器
     * 开启ssl安全机制,全局打印邮件发送者和内容相关信息
     * 该方法开启ssl并改端口为465后,解决了阿里云服务器中运行发送邮件报错问题(连接超时)
     * @param sender 发件人
     * @param senderAuthCode 发件人授权码
     * @param receivers 收件人(单个收件人或多个收件人,多个邮箱则用逗号隔开)
     * @param emailSubject 邮件主题
     * @param emailContent 邮件内容
     * @throws MessagingException
     */
    public static void sendSslEmail(String sender, String senderAuthCode, String receivers, String emailSubject, String emailContent) throws MessagingException {
        //配置发送邮件配置的属性环境
        Properties properties = new Properties();
        //配置邮件服务器地址
        properties.setProperty("mail.smtp.host", "smtp.126.com");
        //开启授权
        properties.setProperty("mail.smtp.auth","true");
        //配置端口号
        properties.setProperty("mail.smtp.port","465");
//        properties.setProperty("mail.smtp.starttls.enable","true");
        //开启ssl安全机制
        properties.setProperty("mail.smtp.ssl.enable","true");

        //构建授权信息,用于smtp身份验证
        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(sender,senderAuthCode);
            }
        };

        //使用邮件属性和授权信息,创建会话
        Session session = Session.getDefaultInstance(properties, authenticator);
        //开启debug模式,将信息打印控制台
        session.setDebug(true);
        //构建邮件消息体
        Message message = new MimeMessage(session);
        //设置发件人
        message.setFrom(new InternetAddress(sender));
        //发送邮件的方式(直发,抄送,秘密抄送等)收件人如果为多个,可在收件人邮箱与邮箱之间用逗号隔开
        message.setRecipients(Message.RecipientType.TO,InternetAddress.parse(receivers));
        //设置邮件主题
        message.setSubject(emailSubject);
        //设置邮件内容
        message.setContent(emailContent,"text/html;charset=UTF-8");
        //发送邮件
        Transport.send(message);

    }



}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278

注1:代码中的一些函数导包必须是引入依赖中的包,如果用内置包可能会报错
注2:功能放在阿里云服务器上使用报错(连接超时)原因是阿里云服务器出于安全问题(避免垃圾邮件)关闭了smtp默认使用的25端口,所以才有了开启ssl更改端口为465的这个方法,可以在阿里云服务器上使用

四、测试类SmtpEmailTestController.java

package com.smtp.email;

import javax.mail.MessagingException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author:寒山李白
 * @Date:2023/1/8 13:02
 */
public class SmtpEmailTestController {

    public static void main(String[] args) throws MessagingException {
    
        //1 单一邮箱发送----126发给qq
        SmtpEmailUtils.sendMail("发件人邮箱", "发件人邮箱的授权码", "收件人邮箱","邮件主题名称","邮件内容");

        //2 多邮箱发送,名单列表传参
        List tosList = new ArrayList();
        tosList.add("收件人邮箱1");
        tosList.add("收件人邮箱2");
        //SmtpEmailUtils.sendMails("发件人邮箱", "发件人邮箱的授权码", tosList,"邮件主题名称","邮件内容");

        //3 多邮箱发送,字符串传参,每个邮箱之间用逗号隔开
        String tosList2 = "收件人邮箱1,收件人邮箱2";
//        SmtpEmailUtils.sendMails("发件人邮箱", "发件人邮箱的授权码", tosList2,"邮件主题名称","邮件内容");

        //4 开启ssl,单个邮箱或多个邮箱发送
//        SmtpEmailUtils.sendSslEmail("发件人邮箱","发件人邮箱的授权码","收件人邮箱","邮件主题名称","邮件内容");
        //开启ssl,单个邮箱或多个邮箱发送
//        SmtpEmailUtils.sendSslEmail("发件人邮箱","发件人邮箱的授权码","收件人邮箱1,收件人邮箱2","邮件主题名称","邮件内容");



    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/549091
推荐阅读
相关标签
  

闽ICP备14008679号