Java 通过 JavaMail 发送邮件

Java 通过 JavaMail 发送邮件

文章目录

  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。


环境介绍

  • Java 版本:1.8.0_191
  • JavaMail 版本:1.6.2

一、配置邮箱

为了设置发件邮箱能有发送邮件权限,请先设置邮箱开启 POP3/SMPT/IMAP 等选项。

这里用的是 163 邮箱

二、Maven 引入包

1<dependency>
2    <groupId>com.sun.mail</groupId>
3    <artifactId>javax.mail</artifactId>
4    <version>1.6.2</version>
5</dependency>

三、邮件实体类

邮件内容实体类,定义一些发送邮件的属性。

注意,为了简化实体类写法,这里使用了 lombok 工具。实体类

 1import lombok.Data;
 2
 3@Data
 4public class SimpleMail {
 5    private String[] to;
 6    private String[] cc;
 7    private String[] bcc;
 8    private String from;
 9    private String host;
10    private String port;
11    private String subject;
12    private String body;
13    private String[] attachment;
14    private String username;
15    private String password;
16    private Boolean isHtml;
17}

四、发送邮件工具类

发送邮件工具类,用词工具调用 JavaMail 发送邮件。

 1import javax.activation.DataHandler;
 2import javax.activation.DataSource;
 3import javax.activation.FileDataSource;
 4import javax.mail.*;
 5import javax.mail.internet.*;
 6import java.io.UnsupportedEncodingException;
 7import java.util.*;
 8
 9public class MailUtils {
10    
11    /**
12     * 发送邮件
13     * @param simpleMail
14     */
15    public static void sendMail(SimpleMail simpleMail) {
16        /** 获取系统属性 **/
17        Properties properties = System.getProperties();
18        /** 设置邮件服务器 **/
19        properties.setProperty("mail.smtp.host", simpleMail.getHost());
20        /** 设置邮件服务器端口 **/
21        properties.setProperty("mail.smtp.port", simpleMail.getPort());
22        /** 设置服务器验证为true **/
23        properties.put("mail.smtp.auth", "true");
24        /** 获取默认session对象 **/
25        Session session = Session.getDefaultInstance(properties, new Authenticator() {
26            // 设置提供的发件邮箱与给的邮箱授权码
27            public PasswordAuthentication getPasswordAuthentication() {
28                return new PasswordAuthentication(simpleMail.getUsername(), simpleMail.getPassword());
29            }
30        });
31        try {
32            /** 创建默认的 MimeMessage 对象 **/
33            MimeMessage message = new MimeMessage(session);
34            /** 设置发件人 **/
35            message.setFrom(new InternetAddress(simpleMail.getFrom()));
36            /** 设置收件人、抄送、密送 **/
37            List<InternetAddress> toList = new ArrayList<>();
38            List<InternetAddress> ccList = new ArrayList<>();
39            List<InternetAddress> bccList = new ArrayList<>();
40            if (simpleMail.getTo() != null) {
41                for (String str : simpleMail.getTo()) {
42                    toList.add(new InternetAddress(str));
43                }
44                message.addRecipients(Message.RecipientType.TO, toList.toArray(new InternetAddress[]{}));
45            }
46            if (simpleMail.getCc() != null) {
47                for (String str : simpleMail.getCc()) {
48                    toList.add(new InternetAddress(str));
49                }
50                message.addRecipients(Message.RecipientType.CC, ccList.toArray(new InternetAddress[]{}));
51            }
52            if (simpleMail.getBcc() != null) {
53                for (String str : simpleMail.getBcc()) {
54                    toList.add(new InternetAddress(str));
55                }
56                message.addRecipients(Message.RecipientType.BCC, bccList.toArray(new InternetAddress[]{}));
57            }
58            // 设置标题Subject
59            message.setSubject(simpleMail.getSubject());
60            //message.setText(simpleMail.getBody());
61            /** 创建消息部分 **/
62            // 创建消息体对象
63            BodyPart messageBodyPart = new MimeBodyPart();
64            // 创建多重消息对象
65            Multipart multipart = new MimeMultipart();
66            /** 设置消息 **/
67            //messageBodyPart.setText(simpleMail.getBody());
68            if (simpleMail.getIsHtml()) {
69                messageBodyPart.setContent(simpleMail.getBody(), "text/html;charset=utf-8");
70            } else {
71                messageBodyPart.setContent(simpleMail.getBody(), "text/plain;charset=utf-8");
72            }
73            // 添加到 multipart
74            multipart.addBodyPart(messageBodyPart);
75            /** 设置附件 **/
76            if (simpleMail.getAttachment()!=null){
77                for (String str:simpleMail.getAttachment()){
78                    messageBodyPart = new MimeBodyPart();
79                    DataSource source = new FileDataSource(str);
80                    messageBodyPart.setDataHandler(new DataHandler(source));
81                    // 设置文件名
82                    System.out.println(str);
83                    messageBodyPart.setFileName(MimeUtility.encodeText(str.substring(str.lastIndexOf("/")+1)));
84                    // 添加到 multipart
85                    multipart.addBodyPart(messageBodyPart);
86                }
87            }
88            /** 设置消息内容与附件 **/
89            message.setContent(multipart);
90            /** 发送消息 **/
91            Transport.send(message);
92            System.out.println("发送成功!");
93        } catch (MessagingException | UnsupportedEncodingException mex) {
94            mex.printStackTrace();
95        }
96    }
97
98}

五、测试的 Main 方法

先编写自定义的实体对象,将邮件内容、收件人、发件人等等定义好,在用此实体对象当参数调用邮件发送工具类发送邮件。

 1    public static void main(String[] args) {
 2        /** 1、设置发送邮件内容对象 **/
 3        SimpleMail simpleMail = new SimpleMail();
 4        // 指定发送邮件的服务器地址
 5        simpleMail.setHost("smtp.163.com");
 6        // 指定发送邮件服务器的端口
 7 		simpleMail.setPort("25");
 8        // 收件人电子邮箱
 9        simpleMail.setTo(new String[]{"32******7@qq.com", "mydlq.club@gmail.com"});
10        // 收件人抄送
11        simpleMail.setCc(new String[]{"123456789@qq.com"});
12        // 收件人密送
13        simpleMail.setTo(new String[]{"111111111@qq.com"});
14        // 发件人电子邮箱
15        simpleMail.setFrom("m*******lq@163.com");
16        // 邮件主题
17        simpleMail.setSubject("测试邮件");
18        // 邮件内容
19        //simpleMail.setBody("这是一封测试邮件");
20        simpleMail.setBody("<html>" +
21                              "<p>主题:测试</p>" +
22                              "<p>结果:签到人数:xxx</p>" +
23                           "</html>");
24        // 是否为 HTML 格式邮件
25        simpleMail.setIsHtml(true);
26        // 邮件附件
27        simpleMail.setAttachment(new String[]{"d://非签到表.xlsx", "d://签到表.xlsx"});
28        // 设置发件邮箱的用户名、验证码
29        simpleMail.setUsername("m******lq@163.com");
30        simpleMail.setPassword("a*******0");
31
32        /** 2、调用方法发送邮件 **/
33        // 发送邮件测试
34        sendMail(simpleMail);
35    }

六、查看收到的邮件效果

上面代码执行成功后邮箱就会收到一条邮件信息,如下:


  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。