介绍

邮件分类

  • 文本邮件  不解析内容中的html标签
  • html邮件  会解析内容中的html标签,就是说可以包含图片、视频等内容
  • 附件邮件   文本邮件、html邮件都可携带附件

 

获取授权码

以qq邮箱为例:
设置 -> 账户 -> POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 -> IMAP/SMTP服务 -> 开启

 

发送邮件

依赖

创建时勾选 I/O -> Java Mail Sender,也可以手动添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

 

application.properties

###邮箱配置###

#邮件服务器。qq是smtp.qq.com,163是smtp.163.com,阿里云是smtp.aliyun.com
spring.mail.host=smtp.qq.com
#授权邮箱
spring.mail.username=xxxxxxx@qq.com
#授权码
spring.mail.password=xxxxxxxxxxxx

#自定义的配置项,发件人邮箱。发件人邮箱必须和授权邮箱相同
spring.mail.from=xxxxxxxxx@qq.com

对应部分换为自己的

 

接口

/**
 * @Description: 发送邮件的接口
 */
public interface EmailService {

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


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


    /**
     * 发送带附件的邮件
     * @param to 收件人
     * @param subject 主题
     * @param content 内容
     * @param filePath 附件
     */
    public void sendAttachmentsHtmlMail(String to, String subject, String content, String filePath);
}

 

实现类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
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;


@Service
public class EmailServiceImpl implements EmailService {
    @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 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) {
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper messageHelper;
        try {
            messageHelper = new MimeMessageHelper(message, true);
            messageHelper.setFrom(from);
            messageHelper.setTo(to);
            message.setSubject(subject);
            messageHelper.setText(content, true); //第二个指定是否是html邮件,设置为false则不解析里面的html标签
            mailSender.send(message);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

    /**
     * 发送带附件的html邮件
     * @param to 收件人
     * @param subject 主题
     * @param content 内容
     * @param filePath 附件路径
     */
    @Override
    public void sendAttachmentsHtmlMail(String to, String subject, String content, String filePath) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);  //第二个参数指定是否是html邮件,设置为false则不解析里面的html标签

            FileSystemResource file = new FileSystemResource(new File(filePath));
            String fileName = filePath.substring(filePath.lastIndexOf(File.separator)+1);  //注意要+1,不+1会报错:StringIndexOutOfBoundsException: String index out of range: -1
            helper.addAttachment(fileName, file);
            mailSender.send(message);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

}

 

单元测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class EmailServiceTest {
    @Autowired
    private EmailService emailService;

    // 收件人邮箱
    private String toEmail = "xxxxxxx@qq.com";

    // html邮件的内容
    private String htmlContent = "<!DOCTYPE html>\n" +
            "<html lang=\"en\" xmlns:th=\"http://www.w3.org/1999/xhtml\">\n" +
            "<head>\n" +
            "    <meta charset=\"UTF-8\">\n" +
            "    <title>Title</title>\n" +
            "</head>\n" +
            "<body>\n" +
            "\n" +
            "<h1>这是一封html邮件</h1>\n" +
            "<img src=\"http://t8.baidu.com/it/u=2247852322,986532796&fm=79&app=86&size=h300&n=0&g=4n&f=jpeg\" />\n" +
            "\n" +
            "</body>\n" +
            "</html>";

    /**
     * 发送文本邮件
     */
    @Test
    public void sendSimpleMailTest() {
        emailService.sendSimpleMail(toEmail,"文本邮件测试","这是一封文本邮件");
    }

    /**
     * 发送html邮件
     */
    @Test
    public void sendHtmlEmailTest(){
        emailService.sendHtmlMail(toEmail,"html邮件测试",htmlContent);
    }

    /**
     * 发送带附件的html邮件
     */
    @Test
    public void sendAttachmentsHtmlMailTest(){
        emailService.sendAttachmentsHtmlMail(toEmail,"带附件的html邮件测试",htmlContent,"D:/hello.txt");
    }

}

注意修改收件人邮箱、附件路径

 

注意点

  • html邮件,内容中的路径,比如<img />的src,要使用远程路径
  • 附件路径,使用本地路径,是把本地文件(附件)上传到邮件服务器,收件人从邮件服务器上下载附件