【编程开发】之 Java 实现邮件发送

一、邮件简介


1、邮件服务器与传输协议

  • 邮件服务器:要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
  • SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。
  • SMTP服务器:通常把处理用户 smtp 请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
  • POP3服务器:通常把处理用户 pop3 请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

2、SMTP、POP3 和 IMAP 三大协议

1)、SMTP 协议

SMTP 的全称是 Simple Mail Transfer Protocol,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。

SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。

2)、POP3 协议

POP3 是 Post Office Protocol 3 的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3 允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而 POP3 服务器则是遵循 POP3 协议的接收邮件服务器,用来接收电子邮件的。

3)、IMAP 协议

IMAP 全称是 Internet Mail Access Protocol,即交互式邮件存取协议,它是跟 POP3 类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。

4)、POP3 和 IMAP 的区别

  • POP3 协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。
  • 而 IMAP 提供 webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。
  • 同时,IMAP 像 POP3 那样提供了方便的邮件下载服务,让用户能进行离线阅读。IMAP 提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后才作出是否下载的决定。此外,IMAP 更好地支持了从多个不同设备中随时访问新邮件。

在这里插入图片描述

总之:IMAP 整体上为用户带来更为便捷和可靠的体验。POP3 更易丢失邮件或多次下载相同的邮件,但 IMAP 通过邮件客户端与webmail 之间的双向同步功能很好地避免了这些问题。


3、开通邮箱的 SMTP 服务

想要通过代码实现 SMTP 邮件的发送,需要在开启邮箱的 SMTP 服务,我们以网易的 163 邮箱为例,介绍如何开启 SMTP 服务。

1)、引入 SMTP 设置页面

首先登录进入 163 邮箱网页,在设置下选择 POP3/SMTP/IMAP 选项,进入 SMTP 服务设置页面:

在这里插入图片描述

2)、选择开启相关服务

在开启服务选项中选择想要开启的服务,这里,我选择开启的是 POP3/SMTP 服务,大家可以根据上面提到的协议区别来开启对应的服务。

在这里插入图片描述

3)、授权码管理

成功开启服务后,可以在页面下方的授权密码管理中添加、删除和修改授权密码,这个授权密码就是我们通过代码发送邮件时的授权密码,注意保存不要泄露。

在这里插入图片描述

4)、邮箱服务器地址

在页面的最下面我们可以看到 163 邮箱各个协议对应的服务器地址:

在这里插入图片描述

5)、邮箱各协议相关端口

下面列举了 163 邮箱各个协议的端口,包括加密的 SSL 协议端口和非 SSL 协议端口:
在这里插入图片描述


4、Java 发送邮件原理

通过 Java 发送邮件实际就是通过代码来实现邮件的发送,通常我们发送邮件时都是通过登录邮箱平台进去进行邮件的发送,而代码发送邮箱实际上就是充当了一个客户端的作用,代理了我们的界面操作而已,换句话说,由界面操作换成了代码操作。

下面是 Java 发送邮件的过程图:

在这里插入图片描述


二、Java 邮件发送实战


1、使用原生的 Javax-Mail-Api

1)、引入 JavaMail 依赖

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.6</version>
</dependency>

2)、发送普通文本邮件

下面是发送普通文本邮件的代码示例:

import org.junit.Test;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.Properties;

public class JavaMailDemo {
    // 163邮箱的SMTP服务地址
    private String smtpHost = "smtp.163.com";
    // 邮箱用户(填写自己的邮箱)
    private String userName = "xxxxxxxx@163.com";
    // 邮箱授权码(填写自己的邮箱授权码)
    private String authKey = "xxxxxxxxxxxx";
    // 收件人
    private String receiver = "xxxxxxxxx@qq.com";

    /**
 	 * 发送普通文本消息的邮件
 	 */
    @Test
    public void sendSimpleMail() throws Exception {
        // 创建参数配置, 用于连接邮件服务器的参数配置
        Properties properties = new Properties();
        properties.put("mail.transport.protocol", "smtp");  // 设置协议(JavaMail规范要求)
        properties.put("mail.smtp.host", smtpHost);         // SMTP 邮箱服务地址
        properties.put("mail.smtp.auth", "true");           // 需求请求认证

        // 根据配置创建会话对象, 用于和邮件服务器进行交互
        Session session = Session.getInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                // 使用邮箱用户和邮箱授权码进行认证
                return new PasswordAuthentication(userName, authKey);
            }
        });

        // 开启debug模式,可以查看详细的发送log
        session.setDebug(true);

        // 根据Session获取邮件传输对象
        Transport transport = session.getTransport();

        // 连接邮件服务器,使用邮箱用户和邮箱授权码进行认证
        transport.connect(smtpHost, userName, authKey);

        // 创建邮件对象
        MimeMessage message = new MimeMessage(session);
        // 发送人
        message.setFrom(new InternetAddress(userName));
        // 收件人
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));
        // 邮件主题
        message.setSubject("这是邮件主题");
        // 发送日期
        message.setSentDate(new Date());
        // 邮件正文
        message.setContent("这是一封邮件", "text/html; charset=utf-8");

        // 发送邮件,message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
        transport.sendMessage(message, message.getAllRecipients());

        // 关闭连接
        transport.close();
    }

}

注意

  • 有些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性,邮箱支持 SSL 连接,也可以自己开启);
  • 如果果无法连接邮件服务器,仔细查看控制台打印的 log,如果有有类似 连接失败, 要求 SSL 安全连接 等错误信息,则需要设置开启 SSL 安全连接:
// 设置 SSL 安全连接属性
String smtpSSLPort = "465";	// 指定 SSL 端口
properties.put("mail.smtp.port", smtpSSLPort);
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.socketFactory.fallback", "false");
properties.put("mail.smtp.socketFactory.port", smtpSSLPort);

关于 SMTP 服务的端口:

  • 对于非 SSL 连接的端口一般默认为 25,默认可以不进行设置;
  • 如果开启了 SSL 连接,需要改为对应邮箱的 SMTP 服务器的端口,,具体可查看对应邮箱服务的帮助,比如 QQ 邮箱的 SMTP(SLL) 端口为 465587,而 163 邮箱的 SMTP(SSL) 端口为 465994

SSL 端口可以不用设置,如果不指定 SSL 端口的话,此时会使用默认的 465 端口,我们可以从邮件的 DEBUG 日志打印中查看邮箱服务连接过程中的端口信息:

# 非 SSL 连接,走的是 25 端口
DEBUG: setDebug: JavaMail version 1.4.6
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.163.com", port 25, isSSL false
220 newxmesmtplogicsvrszc5.qq.com XMail Esmtp QQ Mail Server.
DEBUG SMTP: connected to host "smtp.163.com", port: 25

# SSL 连接,默认走的是 465 端口
DEBUG: setDebug: JavaMail version 1.4.6
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.163.com", port 465, isSSL true
220 163.com Anti-spam GT for Coremail System (163com[20141201])
DEBUG SMTP: connected to host "smtp.163.com", port: 465

在设置邮件发送人的时候,其中 InternetAddress 的三个参数分别为:

  • (1)邮箱,这个邮箱必须和用户邮箱一致,否则报错;
  • (2)显示的昵称,如果设置了,收件人看到的发送人将是这个昵称,如果不设置则使用用户邮箱显示发送人;
  • (3)昵称的字符集编码

完整的发送人设置如下(收件人设置相同):

// 发送人:用户邮箱,发送人昵称,编码
message.setFrom(new InternetAddress(userName, "王廷云", "UTF-8"));

除了可以设置接收人以外,还可以增加收件人或者设置抄送人:

// To: 收件人
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiver));
// To: 增加收件人(可选)
message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiver));
// Cc: 抄送(可选)
message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress(receiver));
// Bcc: 密送(可选)
message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress(receiver));

这些设置的所有收件人、抄送人、密送人,都会被 message.getAllRecipients() 获取到。

使用 邮箱账号授权码 连接邮箱服务器过程中,如果失败的话,会在控制台输出相应失败原因的 log 信息,仔细查看失败原因,有些邮箱服务器会返回错误码或查看错误类型的链接,根据给出的错误类型到对应邮件服务器的帮助网站上查看具体失败原因。

连接失败的原因通常为以下几点:

  • (1)邮箱没有开启 SMTP 服务;
  • (2)邮箱密码错误, 例如某些邮箱开启了独立密码;
  • (3)邮箱服务器要求必须要使用 SSL 安全连接;
  • (4)请求过于频繁或其他原因, 被邮件服务器拒绝服务;
  • (5)如果以上几点都确定无误, 到邮件服务器网站查找帮助。

3)、发送带图片和附件的邮件

下面是带附件的邮件发送实例代码:

/**
 * 发送带附件的邮件
 */
public void sendAttachmentMail() throws Exception {
    // 创建参数配置, 用于连接邮件服务器的参数配置
    Properties properties = new Properties();
    properties.put("mail.transport.protocol", "smtp");  // 设置协议(JavaMail规范要求)
    properties.put("mail.smtp.host", smtpHost);         // SMTP 邮箱服务地址
    properties.put("mail.smtp.auth", "true");           // 需求请求认证

    // 设置SSL
    MailSSLSocketFactory sf = new MailSSLSocketFactory();
    sf.setTrustAllHosts(true);
    properties.put("mail.smtp.ssl.enable", "true");
    properties.put("mail.smtp.ssl.socketFactory", sf);

    // 根据配置创建会话对象, 用于和邮件服务器进行交互
    Session session = Session.getInstance(properties, new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            // 使用邮箱用户和邮箱授权码进行认证
            return new PasswordAuthentication(userName, authKey);
        }
    });

    // 开启debug模式,可以查看详细的发送log
    session.setDebug(true);

    // 根据Session获取邮件传输对象
    Transport transport = session.getTransport();

    // 连接邮件服务器,使用邮箱用户和邮箱授权码进行认证
    transport.connect(smtpHost, userName, authKey);

    // 创建带图片和附件的邮件,传入session对象
    MimeMessage message = createMimeMessage(session);

    // 发送邮件
    transport.sendMessage(message, message.getAllRecipients());

    // 关闭连接
    transport.close();

}

/**
 * 创建带附件的邮件消息
 */
private MimeMessage createMimeMessage(Session session) throws Exception {
    // 创建邮件消息对象
    MimeMessage message = new MimeMessage(session);

    // 发件人
    message.setFrom(new InternetAddress(userName, "王廷云", "UTF-8"));
    // 收件人
    message.setRecipient(Message.RecipientType.TO, new InternetAddress(userName));
    // 邮件主题
    message.setSubject("带图片和附件的邮件");

    // 邮件文本内容
    MimeBodyPart contentPart = new MimeBodyPart();
    contentPart.setContent("<p>这是邮件的正文内容</p>", "text/html;charset=utf-8");

    // 附件资源
    MimeBodyPart appendix = new MimeBodyPart();
    FileDataSource fileSource = new FileDataSource("D:\\demo.jpg");
    DataHandler fileHandler = new DataHandler(fileSource);
    appendix.setDataHandler(fileHandler);
    appendix.setFileName("demo.jpg");

    // 封装邮件所有内容
    MimeMultipart allFile = new MimeMultipart();
    allFile.addBodyPart(contentPart);
    allFile.addBodyPart(appendix);
    allFile.setSubType("mixed");

    // 放到message消息中
    message.setContent(allFile);
    message.saveChanges(); // 保存修改

    return message;
}

设置邮件服务器属性配置时,使用了另一种设置 SSL 的方式:

// 设置SSL
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.ssl.socketFactory", sf);

这种方式和第一种方式差不多,都可以使用,一般没什么问题就选第一种方式吧。

实例中的附件文件是存放在本地的文件,如果附件文件是网络文件的话,比如阿里云OSS文件存储路径,需要使用另一个文件资源加载方式:

// 附件资源:网络文件
MimeBodyPart appendix = new MimeBodyPart();
URL url = new URL("https://malltestenv.oss-cn-shenzhen.aliyuncs.com/testnormal/demo.jpeg");
URLDataSource fileSource = new URLDataSource(url);
DataHandler fileHandler = new DataHandler(fileSource);
appendix.setDataHandler(fileHandler);
appendix.setFileName("demo.jpg");

2、使用 SpringBoot 工程

JavaMail 提供了 SpringBoot 工程中对应的 starter 版本,可以方便我们快速进行邮件功能的开发,下面介绍如何在 SpringBoot 工程中进行使用。

1)、在 SpringBoot 工程中引入相关依赖

<!-- 引入 mail 模块 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <version>2.3.4.RELEASE</version>
</dependency>

<!-- 使用 web 请求方式发送 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.2.10.RELEASE</version>
</dependency>

由于我们使用的是 web 请求的方式进行邮件发送的调用,所以我们的依赖中需要添加 web 所需的相关依赖。

2)、添加 mail 相关配置

编辑 application.yml 文件,添加 mail 相关的配置信息:

spring:
  mail:
    default-encoding: utf-8         # 邮件编码
    host: smtp.163.com              # smtp主机地址
    username: xxxxxxxxxxxxx@163.com # 邮箱用户名,发送邮件的邮箱地址
    password: xxxxxxxxxxxxxxxx      # smtp授权密码,不是邮箱密码
    
    # 下面是一些可选的加密设置
    properties.mail.smtp.port: 994  # 465或者994
    properties.mail.smtp.starttls.enable: true
    properties.mail.smtp.starttls.required: true
    properties.mail.smtp.ssl.enable: true
    
    # 自定义配置
    from: xxxxxxxxxxxxx@163.com     # 设置邮箱发送人,必须和用户邮箱一致

配置信息需要注意的是:

  • SMTP 端口可以不设置,如果设置则需要注意:
    • 126邮箱SMTP服务器地址:smtp.126.com,端口号:465或者994
    • 163邮箱SMTP服务器地址:smtp.163.com,端口号:465或者994
    • yeah邮箱SMTP服务器地址:smtp.yeah.net,端口号:465或者994
  • 如果 QQ 企业邮箱,需要开启并设置 ssl;
  • STARTTLS,是一种明文通信协议的扩展,能够让明文的通信连线直接成为加密连线(使用 SSL 或 TLS 加密),而不需要使用另一个特别的端口来进行加密通信,属于机会性加密

3)、编写邮件发送接口

为了方便邮件的发送,我们对邮件的发送功能进行接口封装:

package com.example.demo.service;

/**
 * @author 王廷云
 * @Description: 封装邮件发送接口
 * @Date: 2020-12-10
 */
public interface MailService {

    /**
     * 发送普通文本邮件
     * @param to 收件人
     * @param subject 主题
     * @param content 邮件内容
     */
    void sendSimpleMail(String to, String subject, String content);

    /**
     * 发送邮件内容为HTML的邮件
     * @param to 收件人
     * @param subject 邮件主题
     * @param content 邮件内容
     */
    void sendHtmlMail(String to, String subject, String content);

    /**
     * 发送带有附件的邮件,附件为本地文件
     * @param to 收件人
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param filePath 本地文件路径
     */
    void sendLocalAttachmentMail(String to, String subject, String content, String filePath);

    /**
     * 发送带有附件的邮件,附件为网络文件
     * @param to 收件人
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param urlPath 文件的网络URL地址
     */
    void sendUrlAttachmentMail(String to, String subject, String content, String urlPath);

}

下面是邮件发送接口的实现类:

package com.example.demo.service.impl;

import com.example.demo.service.MailService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.UrlResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

@Service
public class MailServiceImpl implements MailService {

    // 日志工具
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    // Spring Boot 提供的一个邮件发送类
    @Autowired
    private JavaMailSender mailSender;

    // 邮件发送人
    @Value("${spring.mail.from}")
    private String from;

    /**
     * 发送普通文本邮件
     * @param to 收件人
     * @param subject 主题
     * @param content 邮件内容
     */
    @Override
    public void sendSimpleMail(String to, String subject, String content) {
        // 创建SimpleMailMessage对象
        SimpleMailMessage message = new SimpleMailMessage();
        // 邮件发送人
        message.setFrom(from);
        // 邮件接收人
        message.setTo(to);
        // 邮件主题
        message.setSubject(subject);
        // 邮件内容
        message.setText(content);
        // 发送邮件
        mailSender.send(message);
    }

    /**
     * 发送邮件内容为HTML的邮件
     * @param to 收件人
     * @param subject 邮件主题
     * @param content 邮件内容
     */
    @Override
    public void sendHtmlMail(String to, String subject, String content) {
        try {
            // 特殊邮件内容使用的是MimeMessage和MimeMessageHelper组合
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);

            // 邮件发送人
            messageHelper.setFrom(from);
            // 邮件接收人
            messageHelper.setTo(to);
            // 邮件主题
            messageHelper.setSubject(subject);
            // 邮件内容, html 格式
            messageHelper.setText(content, true);

            // 发送邮件
            mailSender.send(message);
            // 日志信息
            logger.info("邮件已发送!");
        } catch (MessagingException e) {
            // 记录错误日志
            logger.error("邮件发送发生异常!", e);
        }
    }

    /**
     * 发送带有附件的邮件,附件为本地文件
     * @param to 收件人
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param filePath 本地文件路径
     */
    @Override
    public void sendLocalAttachmentMail(String to, String subject, String content, String filePath) {
        try {
            // 特殊邮件内容使用的是MimeMessage和MimeMessageHelper组合
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);

            // 邮件发送人
            messageHelper.setFrom(from);
            // 邮件接收人
            messageHelper.setTo(to);
            // 邮件主题
            messageHelper.setSubject(subject);
            // 邮件内容, 支持 html 格式
            messageHelper.setText(content, true);

            // 创建附件: 附件为本地文件
            FileSystemResource file = new FileSystemResource(new File(filePath));
            String fileName = filePath.substring(filePath.lastIndexOf(File.separator)+1);
            messageHelper.addAttachment(fileName, file);

            // 发送邮件
            mailSender.send(message);
            // 日志信息
            logger.info("邮件已发送!");
        } catch (MessagingException e) {
            // 记录错误日志
            logger.error("邮件发送发生异常!", e);
        }
    }

    /**
     * 发送带有附件的邮件,附件为网络文件
     * @param to 收件人
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param urlPath 文件的网络URL地址
     */
    @Override
    public void sendUrlAttachmentMail(String to, String subject, String content, String urlPath) {
        try {
            // 特殊邮件内容使用的是MimeMessage和MimeMessageHelper组合
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);

            // 邮件发送人
            messageHelper.setFrom(from);
            // 邮件接收人
            messageHelper.setTo(to);
            // 邮件主题
            messageHelper.setSubject(subject);
            // 邮件内容, 支持 html 格式
            messageHelper.setText(content, true);

            // 创建附件: 附件为网络文件
            UrlResource dataSource = new UrlResource(new URL(urlPath));
            String fileName = urlPath.substring(urlPath.lastIndexOf('/')+1);
            messageHelper.addAttachment(fileName, dataSource);

            // 发送邮件
            mailSender.send(message);
            // 日志信息
            logger.info("邮件已发送!");
        } catch (MessagingException me) {
            logger.error("邮件发送发生异常!", me);
        } catch (MalformedURLException mue) {
            logger.error("url格式异常", mue);
        }
    }
}

注意messageHelp.setText() 的第二参数为是否把发送内容设置为 HTML 文本,发送普通文本和 HTML 文本的区别在于:

  • 如果内容为普通文本则设置内容类型为:text/plain
  • 如果内容为HTML文本的话则设置内容类型为:text/html
  • HTML文本内容可以兼容普通文本内容

下面是邮件发送功能的测试用例:

package com.example.demo;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.example.demo.service.MailService;

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

    // 注入邮件发送的接口
    @Autowired
    private MailService mailService;

    // 邮件接收者
    private String to = "1793172997@qq.com";

    // 测试发送普通文本邮件
    @Test
    public void sendMail() {
        String subject = "主题:普通文本邮件";
        String content = "内容:这是一封普通文本邮件";
        mailService.sendSimpleMail(to, subject, content);
    }

    // 测试发送HTML文本邮件
    @Test
    public void sendHtmlMail() {
        String subject = "主题:HTML文本邮件";
        String content = "<h2>内容:</h2><p>这是一封HTML邮件</p>";
        mailService.sendHtmlMail(to, subject, content);
    }

    // 测试发送本地附件邮件
    @Test
    public void sendLocalAttachmentMail() {
        String subject = "主题:本地附件邮件";
        String content = "内容:这是一封本地附件的邮件";
        String filePath = "D:\\demo.jpg";   // 本地文件路径
        mailService.sendLocalAttachmentMail(to, subject, content, filePath);
    }

    // 测试发送网络文件的附件邮件
    @Test
    public void sendUrlAttachmentMail() {
        String subject = "主题:网络文件的附件邮件";
        String content = "内容:这是一封网络文件的附件邮件";
        String urlPath = "https://malltestenv.oss-cn-shenzhen.aliyuncs.com/testnormal/demo.jpeg"; // 网络文件地址
        mailService.sendUrlAttachmentMail(to, subject, content, urlPath);
    }

}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值