首页 > 其他分享 >Spring 邮件发送

Spring 邮件发送

时间:2023-03-13 20:22:05浏览次数:28  
标签:Spring new 发送 mail import message 邮件

Spring邮件发送

1.主要内容

2.JavaMail概述

     JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。JavaMail 是由 Sun 定义的一套收

发电子邮件的 API,它可以方便地执行一些常用的邮件传输,不同的厂商可以提供自己的实现类。但它

并没有包含在 JDK 中,而是作为 JavaEE 的一部分。

厂商所提供的 JavaMail 服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括:

  • SMTP:简单邮件传输协议,用于发送电子邮件的传输协议;

  • POP3:用于接收电子邮件的标准协议;

  • IMAP:互联网消息协议,是 POP3 的替代协议。

这三种协议都有对应 SSL 加密传输的协议,分别是 SMTPS,POP3S 和 IMAPS。除 JavaMail 服务提供程序之外,

JavaMail 还需要 JAF(JavaBeans Activation Framework)来处理不是纯文本的邮件内容,这包括 MIME(多用途互联网邮件

扩展)、URL 页面和文件附件等内容。另外,JavaMail 依赖JAF(JavaBeans Activation Framework),JAF 在 Java6 之后已

经合并到 JDK 中,而 JDK5 之前需要另外下载 JAF 的类库。

 

2.1.协议介绍

在研究 JavaMail API 的细则之前,首先需要对于 API 用到的协议有个认识。对于 java mail 来说用到

的协议有常见的几种: SMTP、POP、IMAP、MIME

2.1.1. SMTP

简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)由 RFC 821 定义。它定义了发送电子

邮件的机制。在 JavaMail API 环境中,您基于 JavaMail 的程序将和您的公司或因特网服务供应商的

(Internet Service

Provider's,ISP's)SMTP 服务器通信。SMTP 服务器会中转消息给接收方 SMTP 服务器以便最终让用

户经由 POP 或 IMAP 获得。

2.1.2. POP

     POP 代表邮局协议(Post Office Protocol)。目前用的是版本 3,也称 POP3,RFC 1939 定义了这

个协议。POP 是一种机制,因特网上大多数人用它得到邮件。它规定每个用户一个邮箱的支持。这就是

它所能做的,而这也造成了许多混淆。使用 POP3 时,用户熟悉的许多性能并不是由 POP 协议支持的,

如查看有几封新邮件消息这一性能。这些性能内建于如 Eudora 或 Microsoft Outlook 之类的程序中,

它们能记住一些事,诸如最近一次收到的邮件,还能计算出有多少是新的。所以当使用 JavaMail API

时,如果您想要这类信息,您就必须自己算。

2.1.3. IMAP

IMAP 是更高级的用于接收消息的协议。在 RFC 2060 中被定义,IMAP 代表因特网消息访问协议

(Internet Message Access Protocol),目前用的是版本 4,也称 IMAP4。在用到 IMAP 时,邮件服

务器必需支持这个协议。不能仅仅把使用 POP 的程序用于 IMAP,并指望它支持 IMAP 所有性能。假设

邮件服务器支持 IMAP,基于 JavaMail 的程序可以利用这种情况 — 用户在服务器上有多个文件夹

(folder),并且这些文件夹可以被多个用户共享。因为有这一更高级的性能,您也许会认为所有用户

都会使用 IMAP。事实并不是这样。要求服务器接收新消息,在用户请求时发送到用户手中,还要在每

个用户的多个文件夹中维护消息。这样虽然能将消息集中备份,但随着用户长期的邮件夹越来越大,到

磁盘空间耗尽时,每个用户都会受到损失。使用 POP,就能卸载邮件服务器上保存的消息了。

2.1.4. MIME

     MIME 代表多用途因特网邮件扩展标准(Multipurpose Internet Mail Extensions)。它不是邮件传

输协议。但对传输内容的消息、附件及其它的内容定义了格式。这里有很多不同的有效文档:RFC

822、RFC 2045、RFC

2046 和 RFC 2047。作为一个 JavaMail API 的用户,您通常不必对这些格式操心。无论如何,一定存在

这些格式而且程序会用到它。

 

2.2. JavaMail的关键对象

     JavaMail 对收发邮件进行了高级的抽象,形成了一些关键的的接口和类,它们构成了程序的基础,下

面我们分别来了解一下这些最常见的对象。

2.2.1. Properties属性对象

由于 JavaMail 需要和邮件服务器进行通信,这就要求程序提供许多诸如服务器地址、端口、用户名、

密码等信息,JavaMail 通过 Properties 对象封装这些属性信息。如下面的代码封装了两个属性信息:

 

 Properties props = new Properties();
 props.put("mail.smtp.host", "smtp.sina.com.cn");
 props.put("mail.smtp.auth", "true");

针对不同的的邮件协议,JavaMail 规定了服务提供者必须支持一系列属性,下表是针对 SMTP 协议的

一些常见属性(属性值都以 String 类型进行设置,属性类型栏仅表示属性是如何被解析的):

属性名 类型 说明
mail.smtp.host String SMTP服务器地址,如smtp.sina.com.cn
mail.smtp.port int SMTP服务器端口号,默认为25
mail.smtp.auth boolean SMTP服务器是否需要用户认证,默认为false
mail.smtp.user String SMTP默认的登录用户名
mail.smtp.from String 默认的邮件发送源地址
mail.smtp.socketFactory.class String socket工厂类类名,通过设置该属性可以覆盖提供者默认的实现,必须实现javax.NET.SocketFactory接口
mail.smtp.socketFactory.port int 指定socket工厂类所用的端口号,如果没有规定,则使用默认的端口号
mail.smtp.socketFactory.fallback boolean 设置为true时,当使用指定的socket 类创建socket 失败后,将使用 Java.net.Socket 创建,默认为 true
mail.smtp.timeout int I/O连接超时时间,单位为毫秒,默认为永不

其他几个协议也有类似的一系列属性,如 POP3 的 mail.pop3.host、mail.pop3.port 以及IMAP 的

mail.imap.host、mail.imap.host 等。

2.2.2. Session会话对象

Session 是一个很容易被误解的类,这归咎于混淆视听的类名。千万不要以为这里的 Session 像

HttpSession 一样代表真实的交互会话,但创建 Session 对象时,并没有对应的物理连接,它只不过是

一对配置信息的集合。

Session 的主要作用,包括两个方面:

1.接收各种配置属性信息:通过 Properties 对象设置的属性信息;

2.初始化 JavaMail 环境:根据 JavaMail 的配置文件,初始化 JavaMail 环境,以便通过 Session 对象

创建其他重要类的实例。

2.2.3. Transport 和Store传输和存储

邮件操作只有发送或接收两种处理方式,JavaMail 将这两种不同操作描述为传输

(javax.mail.Transport)和存储(javax.mail.Store),传输对应邮件的发送,而存储对应邮件的接

收。

2.2.4. Message消息对象

一旦获得 Session 对象,就可以继续创建要发送的消息。这由 Message 类来完成。因为 Message 是

个抽象类,您必需用一个子类,多数情况下为 javax.mail.internet.MimeMessage。MimeMessage 是

个能理解 MIME 类型和头的电子邮件消息,正如不同 RFC 中所定义的。虽然在某些头部域非 ASCII 字符

也能被译码,但 Message 头只能被限制为用 US-ASCII 字符。

2.2.5. Address地址

一旦您创建了 Session 和 Message,并将内容填入消息后,就可以用 Address 确定信件地址了。和

Message 一样,Address 也是个抽象类。您用的是 javax.mail.internet.InternetAddress 类。若创建的

地址只包含电子邮件地址,只要传递电子邮件地址到构造器就行了。

2.2.6. Authenticator认证者

与 java 类一样,JavaMail API 也可以利用 Authenticator 通过用户名和密码访问受保护的资源。对于

JavaMail API 来说,这些资源就是邮件服务器。JavaMail Authenticator 在 javax.mail 包中,而且它和

java.net 中同名的类 Authenticator 不同。两者并不共享同一个 Authenticator,因为 JavaMail API 用

于 Java 1.1,它没有 java.net 类别。要使用 Authenticator,先创建一个抽象类的子类,并从

getPasswordAuthentication() 方法中返回 PasswordAuthentication 实例。创建完成后,您必需向

session 注册 Authenticator。然后,在需要认证的时候,就会通知 Authenticator。您可以弹出窗口,

也可以从配置文件中(虽然没有加密是不安全的)读取用户名和密码,将它们作为

PasswordAuthentication 对象返回给调用程序。

3.Java Mail环境准备

3.1.设置邮箱服务

这里是以163邮箱为例

 

 

注册 163 邮箱,登录 163 邮箱后,设置邮箱账户开通 smtp 服务

 

 

 

 

需要根据注册时的手机号发送的验证码来开通获取邮箱客户端授权码。开通成功后,会显示个人授权

访问码,该授权码是后面通过 Java mail 发送邮件的认证密码,非常重要。

3.2.添加依赖

创建 Maven 项目,在 pom.xml 配置文件中添加 mail 的所需的依赖

 <!-- Java Mail -->
     <dependency>
       <groupId>com.sun.mail</groupId>
       <artifactId>javax.mail</artifactId>
       <version>1.6.2</version>
     </dependency>
     <dependency>
       <groupId>javax.mail</groupId>
       <artifactId>javax.mail-api</artifactId>
       <version>1.6.2</version>
     </dependency>

4.Java Mail发送邮件

4.1.发送普通文本的邮件

 package com.xxx.mail;
 ​
 import javax.mail.*;
 import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeMessage;
 import java.util.Date;
 import java.util.Properties;
 ​
 /**
  * 发送普通文本的邮件
  *      使用javamail发送邮件的步骤
  *          1.创建session对象,加载Properties对象
  *          2.通过session对象得到transport对象
  *          3.使用邮箱的用户名和密码链接邮件服务器
  *          4.设置message邮件对象
  *          5.发送邮件
  */
 public class MailTest01 {
 ​
     public static void main(String[] args) throws MessagingException {
         //设置邮箱服务器的相关配置
         Properties properties = new Properties();
         //设置邮箱服务器的主机名
         properties.setProperty("mail.smtp.host","smtp.163.com");
         //设置邮箱服务器的端口
         properties.setProperty("mail.smtp.port","25");
         //设置邮箱服务器是否需要身份认证(设置为true表示身份认证)
         properties.setProperty("mail.smtp.auth","true");
 ​
 ​
         /*使用javamail发送邮件*/
         //1.创建session对象,加载Properties对象
         Session session = Session.getInstance(properties);
         //开启session的debug模式,可以在控制台看到邮件发送的运行状态
         session.setDebug(true);
         //2.通过session对象得到transport对象
         Transport transport =session.getTransport();
         //3.使用邮箱的用户名和密码链接邮件服务器(用户名:@符号前面的内容  密码:授权码)
         transport.connect("smtp.163.com","zxl2937164587","HKHOLMNKXATHIXBD");
         //4.设置message邮件对象
         Message message = createSimpleMail(session);
         //5.发送邮件
         // 发送给多个收件人
         // message.setRecipients(Message.RecipientType.TO, new InternetAddress[] {});
         // Cc: 抄送(可选)
         // message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress(""));
         // Bcc: 密送(可选)
         // message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress(""));
         transport.sendMessage(message,message.getAllRecipients());
         //关闭transport对象
         transport.close();
     }
 ​
     /**
      * 普通文本的邮件
      *      创建一封普通文本的邮件
      * @param session
      * @return
      */
     private static Message createSimpleMail(Session session) throws MessagingException {
 ​
         //创建邮件对象
         MimeMessage message = new MimeMessage(session);
 ​
         //设置邮件的发送人
         message.setFrom("[email protected]");
 ​
         //设置邮件的接收人(发件人和收件人是同一个账户,邮箱也是一样)
         message.setRecipient(Message.RecipientType.TO,new InternetAddress("[email protected]"));
 ​
         //设置邮件的主题
         message.setSubject("测试文本邮件");
 ​
         //设置发送日期
         message.setSentDate(new Date());
 ​
         //设置邮件的文本内容
         message.setText("你好,这是一封测试文本的邮件");
         //返回封装好的邮箱对象
         return message;
     }
 }
 ​

效果如下:

 

4.2.发送HTML内容的邮件

 package com.xxx.mail;
 ​
 import javax.mail.Message;
 import javax.mail.MessagingException;
 import javax.mail.Session;
 import javax.mail.Transport;
 import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeBodyPart;
 import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
 import java.util.Date;
 import java.util.Properties;
 ​
 /**
  * 发送HTML的邮件
  *      使用javamail发送邮件的步骤
  *          1.创建session对象,加载Properties对象
  *          2.通过session对象得到transport对象
  *          3.使用邮箱的用户名和密码链接邮件服务器
  *          4.设置message邮件对象
  *          5.发送邮件
  */
 public class MailTest02 {
 ​
     public static void main(String[] args) throws MessagingException {
         //设置邮箱服务器的相关配置
         Properties properties = new Properties();
         //设置邮箱服务器的主机名
         properties.setProperty("mail.smtp.host","smtp.163.com");
         //设置邮箱服务器的端口
         properties.setProperty("mail.smtp.port","25");
         //设置邮箱服务器是否需要身份认证(设置为true表示身份认证)
         properties.setProperty("mail.smtp.auth","true");
 ​
 ​
         /*使用javamail发送邮件*/
         //1.创建session对象,加载Properties对象
         Session session = Session.getInstance(properties);
         //开启session的debug模式,可以在控制台看到邮件发送的运行状态
         session.setDebug(true);
         //2.通过session对象得到transport对象
         Transport transport =session.getTransport();
         //3.使用邮箱的用户名和密码链接邮件服务器(用户名:@符号前面的内容  密码:授权码)
         transport.connect("smtp.163.com","zxl2937164587","HKHOLMNKXATHIXBD");
         //4.设置message邮件对象
         Message message = createHtmlMail(session);
         //5.发送邮件
         transport.sendMessage(message,message.getAllRecipients());
         //关闭transport对象
         transport.close();
     }
 ​
     /**
      * 发送html内容的邮件
      *      创建一封html内容的邮件
      * @param session
      * @return
      */
     private static Message createHtmlMail(Session session) throws MessagingException {
 ​
         //创建邮件对象
         MimeMessage message = new MimeMessage(session);
 ​
         //设置邮件的发送人
         message.setFrom("[email protected]");
 ​
         //设置邮件的接收人(发件人和收件人是同一个账户,邮箱也是一样)
         message.setRecipient(Message.RecipientType.TO,new InternetAddress("[email protected]"));
 ​
         //设置邮件的主题
         message.setSubject("测试html邮件");
 ​
         //设置发送日期
         message.setSentDate(new Date());
 ​
         /*准备邮件数据*/
         //设置多媒体对象(MultiPart对象可以包含一个或者多个BodyPart对象)
         MimeMultipart multipart = new MimeMultipart();
         //设置邮件体对象
         MimeBodyPart bodyPart = new MimeBodyPart();
         //设置对应的HTML内容
         StringBuffer sb = new StringBuffer();
         sb.append("<html><body><a href='http://www.baidu.com'>百度一下</a></body></html>");
         //将html内容设置到邮件体对象中
         bodyPart.setContent(sb.toString(),"text/html;charset=UTF-8");
         //将邮件体对象设置到多媒体容器中
         multipart.addBodyPart(bodyPart);
         //将多媒体容器设置到message邮件对象中
         message.setContent(multipart);
         //返回封装好的邮箱对象
         return message;
     }
 }
 ​

效果如下:

 

4.3.发送包含附件的邮件

package com.xxx.mail;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Date;
import java.util.Properties;

/**
 * 发送HTML的邮件
 *      使用javamail发送邮件的步骤
 *          1.创建session对象,加载Properties对象
 *          2.通过session对象得到transport对象
 *          3.使用邮箱的用户名和密码链接邮件服务器
 *          4.设置message邮件对象
 *          5.发送邮件
 */
public class MailTest03 {

    public static void main(String[] args) throws MessagingException {
        //设置邮箱服务器的相关配置
        Properties properties = new Properties();
        //设置邮箱服务器的主机名
        properties.setProperty("mail.smtp.host","smtp.163.com");
        //设置邮箱服务器的端口
        properties.setProperty("mail.smtp.port","25");
        //设置邮箱服务器是否需要身份认证(设置为true表示身份认证)
        properties.setProperty("mail.smtp.auth","true");


        /*使用javamail发送邮件*/
        //1.创建session对象,加载Properties对象
        Session session = Session.getInstance(properties);
        //开启session的debug模式,可以在控制台看到邮件发送的运行状态
        session.setDebug(true);
        //2.通过session对象得到transport对象
        Transport transport =session.getTransport();
        //3.使用邮箱的用户名和密码链接邮件服务器(用户名:@符号前面的内容  密码:授权码)
        transport.connect("smtp.163.com","zxl2937164587","HKHOLMNKXATHIXBD");
        //4.设置message邮件对象
        Message message = createAttachMail(session);
        //5.发送邮件
        transport.sendMessage(message,message.getAllRecipients());
        //关闭transport对象
        transport.close();
    }

    /**
     * 发送包含附件的邮件
     *      创建一封包含附件的邮件
     * @param session
     * @return
     */
    private static Message createAttachMail(Session session) throws MessagingException {

        //创建邮件对象
        MimeMessage message = new MimeMessage(session);

        //设置邮件的发送人
        message.setFrom("[email protected]");

        //设置邮件的接收人(发件人和收件人是同一个账户,邮箱也是一样)
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("[email protected]"));

        //设置邮件的主题
        message.setSubject("测试包含附件的邮件");

        //设置发送日期
        message.setSentDate(new Date());

        /*创建邮件内容*/

        //创建邮件正文
        MimeBodyPart bodyPart = new MimeBodyPart();
        bodyPart.setContent("<h2>这是一封包含附件的邮件</h2>","text/html;charset=UTF-8");

        //创建附件对象
        MimeBodyPart attachPart = new MimeBodyPart();
        //本地文件
        DataHandler df = new DataHandler(new FileDataSource("F:\\乐字节\\day11_SpringJDBC_事务_邮箱(Java005c)\\006_document\\17-Spring 邮件发送.xlsx"));
        //将本地文件设置到附件对象中
        attachPart.setDataHandler(df);
        //设置附件文件名
        attachPart.setFileName(df.getName());
        //创建多媒体容器对象
        MimeMultipart multipart = new MimeMultipart();
        //添加正文
        multipart.addBodyPart(bodyPart);
        //添加附件
        multipart.addBodyPart(attachPart);
        //如果邮件中要添加附件,设置为mixed
        multipart.setSubType("mixed");

        //将多媒体对象设置到邮件对象中
        message.setContent(multipart);
        //返回创建好的邮件对象
        return message;
    }
}

效果如下:

 

 

4.4. Java Mail邮件发送封装

4.4.1.创建邮件发送信息类

 package com.xxx.mail;
 ​
 import java.util.List;
 ​
 /**
  * 邮件发送信息类
  *   定义发送邮件时 邮件服务器 端口 发送方用户名 密码等字段
  */
 public class MailSendInfo {
     private String serverHost;      //服务器主机
     private String serverPort;      //服务器端口
 ​
     private String fromAddress;     //发送方的邮箱地址
     private List<String> toAddress; //接收方的邮箱地址集合
 ​
     private String userName;        //邮箱的用户名
     private String userPwd;         //邮箱密码(授权码)
 ​
     private String subject;         //邮件主题
     private String content;         //邮件内容
 ​
     private Boolean flag = true;    //是否需要身份认证
     private List<String> attachFileName; //附件名称集合
 ​
     public String getServerHost() {
         return serverHost;
     }
 ​
     public void setServerHost(String serverHost) {
         this.serverHost = serverHost;
     }
 ​
     public String getServerPort() {
         return serverPort;
     }
 ​
     public void setServerPort(String serverPort) {
         this.serverPort = serverPort;
     }
 ​
     public String getFromAddress() {
         return fromAddress;
     }
 ​
     public void setFromAddress(String fromAddress) {
         this.fromAddress = fromAddress;
     }
 ​
     public List<String> getToAddress() {
         return toAddress;
     }
 ​
     public void setToAddress(List<String> toAddress) {
         this.toAddress = toAddress;
     }
 ​
     public String getUserName() {
         return userName;
     }
 ​
     public void setUserName(String userName) {
         this.userName = userName;
     }
 ​
     public String getUserPwd() {
         return userPwd;
     }
 ​
     public void setUserPwd(String userPwd) {
         this.userPwd = userPwd;
     }
 ​
     public String getSubject() {
         return subject;
     }
 ​
     public void setSubject(String subject) {
         this.subject = subject;
     }
 ​
     public String getContent() {
         return content;
     }
 ​
     public void setContent(String content) {
         this.content = content;
     }
 ​
     public Boolean getFlag() {
         return flag;
     }
 ​
     public void setFlag(Boolean flag) {
         this.flag = flag;
     }
 ​
     public List<String> getAttachFileName() {
         return attachFileName;
     }
 ​
     public void setAttachFileName(List<String> attachFileName) {
         this.attachFileName = attachFileName;
     }
 }
 ​

 

4.4.2.创建认证类

package com.xxx.mail;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

/**
 * 认证类
 */
public class MyAuthenticator extends Authenticator {
    private String userName;
    private String userPwd;

    public MyAuthenticator(String userName, String userPwd) {
        this.userName = userName;
        this.userPwd = userPwd;
    }

    /**
     * 邮件服务器发送邮件,进行身份认证
     * @return
     */
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName,userPwd);
    }
}

4.4.3.创建邮件发送器

package com.xxx.mail;


import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;
import javax.xml.crypto.Data;
import java.io.File;
import java.lang.reflect.Array;
import java.util.Date;
import java.util.List;
import java.util.Properties;

/**
 * 邮件发送器
 */
public class MailSender {
    /**
     * 发送邮件
     * @param mailSendInfo
     */
    public void sendMail(MailSendInfo mailSendInfo){

        try{
            //设置邮箱服务器的相关配置
            Properties properties = new Properties();
            //设置邮箱服务器的主机名
            properties.setProperty("mail.smtp.host",mailSendInfo.getServerHost());
            //设置邮箱服务器的端口
            properties.setProperty("mail.smtp.port",mailSendInfo.getServerPort());
            //设置邮箱服务器是否需要身份认证(设置为true表示身份认证)
            properties.setProperty("mail.smtp.auth",mailSendInfo.getFlag().toString());


            //身份认证
            MyAuthenticator myAuthenticator =new MyAuthenticator(mailSendInfo.getUserName(),mailSendInfo.getUserPwd());

            //创建Session对象
            Session session = Session.getDefaultInstance(properties,myAuthenticator);//身份验证
            //开启session的debug模式,可以在控制台看到邮件发送的运行状态
            session.setDebug(true);
            /*邮件内容*/
            //创建message对象
            Message message = new MimeMessage(session);

            //设置发送方的邮箱地址
            Address from =new InternetAddress(mailSendInfo.getFromAddress());
            message.setFrom(from);
            //设置邮件主题
            message.setSubject(mailSendInfo.getSubject());
            //设置邮件发送时间
            message.setSentDate(new Date());
            //设置收件人邮箱地址
            //判断收件方的集合是否为空
            if(null != mailSendInfo.getToAddress()&& mailSendInfo.getToAddress().size() >0){
                //定义地址数组
                Address[] addresses = new Address[mailSendInfo.getToAddress().size()];
                //遍历地址集合
                for(int i=0;i<mailSendInfo.getToAddress().size();i++){
                    //得到每一个地址对象
                    Address address =new InternetAddress(mailSendInfo.getToAddress().get(i));
                    //将地址设置到数组中
                    addresses[i] = address;
                }
                //将接收到的邮箱地址设置到message邮件对象中
                message.setRecipients(Message.RecipientType.TO,addresses);
            }
            //设置多媒体对象容器
            MimeMultipart multipart =new MimeMultipart();

            //创建正文内容
            MimeBodyPart bodyPart = new MimeBodyPart();
            bodyPart.setContent(mailSendInfo.getContent(),"text/html;charset=UTF-8");
            //将正文内容bodyPart对象设置到多媒体容器中
            multipart.addBodyPart(bodyPart);
            //获取所有的附件文件名
            List<String> files =mailSendInfo.getAttachFileName();
            //判断文件是否存在
            if(null != files && files.size()>0){
                //遍历,获取对应的附件对象
                for(int i=0;i<files.size();i++){
                    //附件对象
                    File file =new File(files.get(i));
                    //判断附件对象是否存在
                    if(file.exists()) {
                        //如果附件对象存在,创建附件对象
                        MimeBodyPart attachPart = new MimeBodyPart();
                        DataHandler df = new DataHandler(new FileDataSource((file)));
                        attachPart.setDataHandler(df);
                        //设置附件文件名(解决附件名乱码)
                        attachPart.setFileName(MimeUtility.encodeText(df.getName()));
                        //添加附件(将attachPart对象设置到MultiPart对象中)
                        multipart.addBodyPart(attachPart);
                    }
                }
            }
            //设置邮件对象(将多媒体对象容器设置到message对象中)
            message.setContent(multipart);

            //发送邮件
            Transport.send(message);

        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

4.4.4.邮件发送测试

4.4.4.1.发送HTML内容的邮件

 package com.xxx.mail;
 ​
 import java.util.ArrayList;
 import java.util.List;
 ​
 public class MailTest04 {
     public static void main(String[] args) {
         //发送Html邮件
         testHtmlMail();
     }
     /**
       * 发送HTML内容的邮件
       */
     public static void testHtmlMail() {
          MailSendInfo mailSendInfo = new MailSendInfo();
          mailSendInfo.setServerHost("smtp.163.com");
          mailSendInfo.setServerPort("25");
          mailSendInfo.setUserName("zxl2937164587");
          mailSendInfo.setUserPwd("HKHOLMNKXATHIXBD");
          mailSendInfo.setSubject("邮件封装");
          mailSendInfo.setFromAddress("[email protected]");
          mailSendInfo.setContent("<h2>这是封装后发送的邮件</h2>");
          List<String> users = new ArrayList<>();
          users.add("[email protected]");
          mailSendInfo.setToAddress(users);
          MailSender mailSender=new MailSender();
          mailSender.sendMail(mailSendInfo);
     }
 }
 ​

效果如下:

4.4.4.2.发送包含附件的邮件

 package com.xxx.mail;
 ​
 import java.util.ArrayList;
 import java.util.List;
 ​
 public class MailTest04 {
     public static void main(String[] args) {
         //发送Html邮件
         //testHtmlMail();
         testAttachMail();
     }
     /**
       * 发送包含附件的邮件
       */
     public static void testAttachMail() {
          MailSendInfo mailSendInfo = new MailSendInfo();
          mailSendInfo.setServerHost("smtp.163.com");
          mailSendInfo.setServerPort("25");
          mailSendInfo.setUserName("zxl2937164587");
          mailSendInfo.setUserPwd("HKHOLMNKXATHIXBD");
          mailSendInfo.setSubject("邮件封装");
          mailSendInfo.setFromAddress("[email protected]");
          mailSendInfo.setContent("<h2>包含附件的邮件</h2>");
          List<String> users = new ArrayList<>();
          users.add("[email protected]");
          mailSendInfo.setToAddress(users);
          // 添加附件
          List<String> files=new ArrayList<String>();
          files.add("F:\\乐字节\\day11_SpringJDBC_事务_邮箱(Java005c)\\006_document\\17-Spring 邮件发送.pdf");
          files.add("F:\\乐字节\\day11_SpringJDBC_事务_邮箱(Java005c)\\006_document\\17-Spring 邮件发送.xlsx");
          mailSendInfo.setAttachFileName(files);
          MailSender mailSender=new MailSender();
          mailSender.sendMail(mailSendInfo);
     }
 }
 ​

5.使用Spring API实现邮件发送

5.1.环境准备

创建 Maven 项目,在 pom.xml 文件中添加依赖

 <!-- Java Mail -->
     <dependency>
       <groupId>com.sun.mail</groupId>
       <artifactId>javax.mail</artifactId>
       <version>1.6.2</version>
     </dependency>
     <dependency>
       <groupId>javax.mail</groupId>
       <artifactId>javax.mail-api</artifactId>
       <version>1.6.2</version>
     </dependency>
 ​
     <!-- spring核心 jar 依赖 -->
     <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-context</artifactId>
       <version>5.2.4.RELEASE</version>
     </dependency>
     <!--spring 上下文环境 支持-->
     <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-context-support</artifactId>
       <version>5.2.4.RELEASE</version>
     </dependency>
 ​

 

5.2.配置邮件发送bean

在 spring.xml 配置文件中设置邮件发送对应的bean标签

 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd">
 ​
 ​
 ​
 ​
     <!-- 开启自动化扫描 -->
     <context:component-scan base-package="com.xxx"/>
     <!-- 邮件发送器(提供了邮件发送接口、透明创建Java Mail的MimeMessage、及邮件发送的配置)-->
     <!-- 邮件发送器(提供了邮件发送接口、透明创建Java Mail的MimeMessage、及邮件发送的配置)-->
     <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
         <property name="host" value="smtp.163.com"></property>
         <property name="port" value="25"></property>
         <property name="defaultEncoding" value="utf-8"></property>
         <property name="username" value="zxl2937164587"></property>
         <property name="password" value="HKHOLMNKXATHIXBD"></property>
     </bean>
 ​
     <!-- 普通文本邮件对象 -->
     <bean id="templateMessage" class="org.springframework.mail.SimpleMailMessage">
         <property name="from" value="[email protected]"></property>
         <property name="subject" value="spring_mail"></property>
     </bean>
         
         
         
         
 </beans>

5.3.定义接口与实现类

定义接口

 package com.xxx.mail.springMail;
 ​
 /**
  * 定义接口
  */
 public interface OrderManager {
     void placeOrder();
 }
 ​

定义实现类

 package com.xxx.mail.springMail;
 ​
 import org.springframework.mail.MailException;
 import org.springframework.mail.MailSender;
 import org.springframework.mail.SimpleMailMessage;
 import org.springframework.stereotype.Service;
 ​
 import javax.annotation.Resource;
 ​
 @Service
 public class SimpleOrderManager implements OrderManager {
 ​
     @Resource
     private MailSender mailSender;
     @Resource
     private SimpleMailMessage templateMessage;
 ​
     @Override
     public void placeOrder() {
         // 获取邮件对象
         SimpleMailMessage msg = new SimpleMailMessage(this.templateMessage);
         // 设置邮件收件人的邮箱地址
         msg.setTo("[email protected]");
         // 设置邮件内容
         msg.setText("Hello Spring Mail");
         try{
             // 发送邮件
             this.mailSender.send(msg);
         } catch (MailException ex) {
             System.err.println(ex.getMessage());
         }
     }
 }
 ​

5.4.邮件发送测试

 package com.xxx.mail.springMail;
 ​
 import org.springframework.beans.factory.BeanFactory;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 import org.springframework.mail.SimpleMailMessage;
 ​
 public class MailTest {
     public static void main(String[] args) {
         //加载spring的上下文环境
         BeanFactory factory = new ClassPathXmlApplicationContext("spring.xml");
 ​
         SimpleOrderManager simpleOrderManager = (SimpleOrderManager) factory.getBean("simpleOrderManager");
 ​
         simpleOrderManager.placeOrder();
     }
 }
 ​

5.5.发送附件

 /**
   * 发送包含附件的邮件
   * @param args
   * @throws MessagingException
   */
 public static void main(String[] args) throws MessagingException {
     ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
     JavaMailSender mailSender= (JavaMailSender) ac.getBean("mailSender");
     MimeMessage message= mailSender.createMimeMessage();
     message.setSubject("spring_mail"); // 邮件主题
     // 创建带有附件的消息帮组类
     MimeMessageHelper helper = new MimeMessageHelper(message,true,"utf-8");
     helper.setTo(new InternetAddress("收件人的邮箱地址"));//设置接收人
     helper.setText("Thank you for ordering!"); // 邮件内容
     helper.setFrom("发件人的邮箱地址"); // 发件人
     // 设置附件
     File file = new File("C:\\work\\邮件附件.txt");
     // 添加附件
     helper.addAttachment(file.getName(), file);
     // 发送邮件
     mailSender.send(message);
 }
 

标签:Spring,new,发送,mail,import,message,邮件
From: https://www.cnblogs.com/MeltSky/p/17212734.html

相关文章