SpringBoot集成邮件服务

Spring Email 抽象的核心是 MailSender 接口,MailSender 的实现能够把 Email 发送给邮件服务器,由邮件服务器实现邮件发送的功能。

Spring 自带了一个 MailSender 的实现 JavaMailSenderImpl,它会使用 JavaMail API 来发送 Email。Spring 或 SpringBoot 应用在发送 Email 之前,我们必须要 JavaMailSenderImpl 装配为 Spring 应用上下文的一个 bean

项目结构图

开始搭建

pom.xml 中增加对应的依赖

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

<!-- 我使用了lombok  -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>

配置文件修改,增加 mail 使用的配置信息

 application.properties

# QQ 邮箱 的host 为 smtp.qq.com, 网易的为 smtp.163.com
spring.mail.host=smtp.qq.com
spring.mail.username=532548957@qq.com
spring.mail.password= 这里输入自己的编码
spring.mail.default-encoding=utf-8

新建一个用于邮件发送的 Mail Bean

import lombok.Data;
import org.springframework.core.io.FileSystemResource;
import java.util.List;
@Data
public class Mail {

    private String[] to;    /*收件人列表*/
    private String subject; /*邮件主题*/
    private String text;    /*邮件内容*/
   private List<FileSystemResource> file;    /*附件*/

    /**
     * 内容ID,用于发送静态资源邮件时使用
     */
    private String contentId;

    public static Mail getMail() {
        return new Mail();
    }

}

 增加一个用于发送邮件的工具类 EmailUtils.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

/**
 * 发送邮件工具
 *
 * @author wuq
 * @create 2019-04-06 15:24
 */
@Component
public class EmailUtils {

    @Autowired
    private JavaMailSender mailSender; // 自动注入的Bean

    @Value("${spring.mail.username}")
    private String sender; // 读取配置文件中的参数

    /**
     * 发送简易邮件
     *
     * @param mail
     */
    public void sendMail(Mail mail) {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);

        try {
            helper.setFrom(sender);
            helper.setTo(mail.getTo());
            helper.setSubject(mail.getSubject());
            helper.setText(mail.getText());

            mailSender.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

    /**
     * 发送邮件-邮件正文是HTML
     *
     * @param mail
     */
    public void sendMailHtml(Mail mail) {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);

        try {
            helper.setFrom(sender);
            helper.setTo(mail.getTo());
            helper.setSubject(mail.getSubject());
            helper.setText(mail.getText(), true);

            mailSender.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

    /**
     * 发送邮件-附件邮件
     *
     * @param mail
     */
    public void sendMailAttachment(Mail mail) {
        try {
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            helper.setFrom(sender);
            helper.setTo(mail.getTo());
            helper.setSubject(mail.getSubject());
            helper.setText(mail.getText(), true);

            // 增加附件名称和附件
            for (FileSystemResource file : mail.getFile()) {
                helper.addAttachment(file.getFilename(), file);
            }
            mailSender.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

    /**
     * 内联资源(静态资源)邮件发送
     * 由于邮件服务商不同,可能有些邮件并不支持内联资源的展示
     * 在测试过程中,新浪邮件不支持,QQ邮件支持
     * 不支持不意味着邮件发送不成功,而且内联资源在邮箱内无法正确加载
     * 发送的内容格式还是 html 模式
     *
     * @param mail
     */
    public void sendMailInline(Mail mail) {
        try {
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            helper.setFrom(sender);
            helper.setTo(mail.getTo());
            helper.setSubject(mail.getSubject());

            /*
             * 内联资源邮件需要确保先设置邮件正文,再设置内联资源相关信息
             */

            // todo 只是测试发送一个图片
            helper.setText(mail.getText(), true);
            helper.addInline(mail.getContentId(), mail.getFile().get(0));

            mailSender.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

    /**
     * 模板邮件发送
     *
     * @param mailBean
     */
    public void sendMailTemplate(Mail mailBean) {
        try {
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            helper.setFrom(sender);
            helper.setTo(mailBean.getTo());
            helper.setSubject(mailBean.getSubject());
            helper.setText(mailBean.getText(), true);
            mailSender.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

}

 测试类

import com.study.demo.framework.utils.email.EmailUtils;
import com.study.demo.framework.utils.email.Mail;
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.core.io.FileSystemResource;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * 邮件测试
 *
 * @author wuq
 * @create 2019-04-10 19:29
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class EmailDemoTest {

    @Autowired
    EmailUtils emailUtils;

    @Test
    public void contextLoads() {
        Mail mail = Mail.getMail();
        mail.setSubject("SpringBoot集成JavaMail实现邮件发送");
        mail.setText("SpringBoot集成JavaMail实现简易邮件发送功能");

        String[] toList = {"wayfreem@163.com"};
        mail.setTo(toList);
        emailUtils.sendMail(mail);
    }


    @Test
    public void sendHTML(){
        Mail mail = Mail.getMail();
        mail.setSubject("SpringBoot集成JavaMail实现邮件发送");

        String[] toList = {"wayfreem@163.com"};
        mail.setTo(toList);

        String content = "<!DOCTYPE html>\n" +
                "<html>\n" +
                "<body>\n" +
                "\t<h3>这是由 spring boot 集成 mail 发送的 html 邮件</h3>\n" +
                "</body>\n" +
                "</html>";
        mail.setText(content);

        emailUtils.sendMailHtml(mail);
    }

    @Test
    public void sendAttarchment(){
        Mail mail = Mail.getMail();
        mail.setSubject("SpringBoot集成JavaMail实现邮件发送");
        mail.setText("SpringBoot集成JavaMail实现简易邮件发送功能");

        String[] toList = {"wayfreem@163.com"};
        mail.setTo(toList);

        List<FileSystemResource> list = new ArrayList<>();
        list.add(new FileSystemResource(new File("E:\\test\\img\\150A01.png")));
        list.add(new FileSystemResource(new File("E:\\test\\img\\150A01.png")));
        mail.setFile(list);

        emailUtils.sendMailAttachment(mail);
    }

    @Test
    public void sendImg(){
        Mail mail = Mail.getMail();
        mail.setSubject("SpringBoot集成JavaMail实现邮件发送");
        String[] toList = {"wayfreem@163.com"};
        mail.setTo(toList);

        // 设置图片的地址名称
        String contentId = "0001";

        String content = "<!DOCTYPE html>\n" +
                "<html>\n" +
                "<body>\n" +
                "\t<h3>这是由 spring boot 集成 mail 发送的 html 邮件</h3>\n" +
                " <div> <img src=\'cid:"+contentId+"\' /> </div> " +
                "</body>\n" +
                "</html>";
        mail.setText(content);
        mail.setContentId(contentId);

        // 添加附件
        List<FileSystemResource> list = new ArrayList<>();
        list.add(new FileSystemResource(new File("E:\\test\\img\\150A01.png")));
        mail.setFile(list);

        emailUtils.sendMailInline(mail);
    }
}

这里测试的是第一个方法,在邮箱中查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wayfreem

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值