Springboot系列(十二):如何代码实现发送邮件提醒,你一定得会!(中篇)

1,769 阅读5分钟

👨‍🎓作者:bug菌
✏️博客:CSDN掘金infoQ51CTO
🎉简介:CSDN博客专家,C站历届博客之星Top50,掘金/InfoQ/51CTO等社区优质创作者,全网合计8w粉+,对一切技术感兴趣,重心偏Java方向;硬核公众号「 猿圈奇妙屋」,欢迎小伙伴们的加入,一起秃头,一起变强。
...
✍️温馨提醒:本文字数:1999字, 阅读完需:约 5 分钟

嗨,家人们,我是bug菌呀,我又来啦。今天我们来聊点什么咧,OK,接着为大家更《springboot零基础入门教学》系列文章吧。希望能帮助更多的初学者们快速入门!

小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐+关注👨‍🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻‍♀️,创作不停💕,加油☘️

一、前言🔥

环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE

        续上篇,我们已经成功实现了邮件发送提醒,对吧,小伙伴跟着我一路看过来,是不是感觉轻松多了,毕竟篇幅我都不会很长。这样下去,每天学习一个知识点,一个月下来就是三十个知识点,日积月累,你就是下一个大佬啦。如果有小伙伴直接中途插入,还请麻烦先去看上几期的内容,要不然贸然跟着学,肯定要吃大亏,去我的专栏《SpringBoot零基础入门》从头开始跟进。

       今天我就给大家带来点稍微花哨的知识点,通常邮件除了正文内容,也有添加附件或者正文出现图片,像这种需求,我们应该怎么实现呢?好啦,废话不多说,请接招!

二、业务场景

1、如何实现发送带附件的邮件?

a、首先我们先定义一个[发送带图片资源邮件参数]model pojo吧,代码需规范,能封装就尽量封装,日后维护成本也低些。然后都继承下mail这个pojo,需要的小伙伴可以去上篇取哈,这里就不多重复了哈,省的被有的小伙伴吐槽说凑字数。

package com.example.demo.component.mail.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.List;

/**
 * 发送带图片资源邮件参数
 *
 * @author luoYong
 * @version 1.0
 * @date 2022/1/18 10:54
 */
@ApiModel(value = "发送带图片资源邮件参数",description = "发送带图片资源邮件参数")
public class ImgResMail extends Mail{

    @ApiModelProperty("对于的图片标记id")
    private List<String> contentIds; 

    @ApiModelProperty("图片地址")
    private List<String> paths;

    public List<String> getContentIds() {
        return contentIds;
    }
    public void setContentIds(List<String> contentIds) {
        this.contentIds = contentIds;
    }
    public List<String> getPaths() {
        return paths;
    }
    public void setPaths(List<String> paths) {
        this.paths = paths;
    }
}

       由于发送带附近的邮件,基本邮件内容就还是原来那些,唯独与发送普通邮件不一样的地方就是发附件邮件还需要有附件存放地址、附件标识这两个信息的前提下,附件邮件才能被发送出去,这也是必需要做的。所以就按要求来,如果你想实现发送附件邮件的话。

b、定义发送带有附件邮件的方法

       我们使用JavaMailSenderImpl配置邮件发送器,MimeMessage构建邮件,MimeMessageHelper构建邮件收发信息。

/** * 发送带附件的邮件 */
public void sendAccessoryMail(AccessoryMail model) throws MessagingException {

    MimeMessage mimeMessage = javaMailSender.createMimeMessage();

    MimeMessageHelper msg = new MimeMessageHelper(mimeMessage, true);    //邮件发送者
    msg.setFrom(model.getSendMailAccount());    //邮件接收者
    msg.setTo(model.getAcceptMailAccount());    //邮件主题
    msg.setSubject(model.getTheme());    //邮件正文
    msg.setText(model.getMailText());    //邮件发送时间
    msg.setSentDate(model.getSendTime());    //添加附件
    msg.addAttachment(model.getAttachmentName(), new File(model.getAttachmentPath()));

    javaMailSender.send(mimeMessage);
}

解读一下:

1、javax.mail.internet.MimeMessage该对象是实际发送的电子邮件的信息,邮件对象通常使用MimeMessage创建,创建该对象时应传入一个邮件会话参数。
2、new MimeMessageHelper(mimeMessage, true) 其中第二个参数必需传ture。

c、接下来,就是进行测试了,还是老地方,去MailTest测试类中,写一个testcese,测试该方法是否有报错等逻辑问题。

/** * 发送带附件的邮件 */
@Testvoid sendSimpleMailForDoc() throws MessagingException {

   AccessoryMail mailModel = new AccessoryMail(); 

   mailModel.setTheme("这是一封测试邮件"); // 设置邮件主题 
   mailModel.setSendMailAccount("xxx@foxmail.com"); // 设置邮箱发送者
   mailModel.setAcceptMailAccount("xxx@foxmail.com"); // 设置邮件接收者,可以有多个接收者
   mailModel.setSendTime(new Date());    // 设置邮件发送日期
   mailModel.setMailText("这是测试邮件的正文");// 设置邮件的正文
   mailModel.setAttachmentName("2022.png");//附件名
   mailModel.setAttachmentPath("C:\\Users\\Administrator\\Desktop\\2022.png");//附件地址

   //测试方法
   sendMailBuild.sendAccessoryMail(mailModel);
}

注入参数必须要注意的是:

  • 附件名必须是完整的(包括文件后缀,比如:2022.png,test.doc等)
  • 附件地址要对应真实存在的附件地址,如果找不到,则无法附件发送

d、运行testcase ,可见,邮件发送成功啦,附件也接收成功!如下图:

       我传的附件是一张图片,你们也可以试试,文档doc啊,txt等文件看看是否也能成功。

图片作为附件进行邮件发送,你们测试通过了么?

2、如何实现发送带正文存在图片的邮件?

      与上一场景不同的是,一个是附件图片,一个是正文图片,这二者得区别开。

a、我们也是定义一个参数体:ImgResMail

package com.example.demo.component.mail.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.List;

/**
 * 发送带图片资源邮件参数
 *
 * @author luoYong
 * @version 1.0
 * @date 2022/1/18 10:54
 */
@ApiModel(value = "发送带图片资源邮件参数",description = "发送带图片资源邮件参数")
public class ImgResMail extends Mail {

    @ApiModelProperty("对于的图片标记id")
    private List<String> contentIds;

    @ApiModelProperty("图片地址")
    private List<String> paths;

    public List<String> getContentIds() {
        return contentIds;
    }
    public void setContentIds(List<String> contentIds) {
        this.contentIds = contentIds;
    }
    public List<String> getPaths() {
        return paths;
    }
    public void setPaths(List<String> paths) {
        this.paths = paths;
    }
}

b、定义方法

/**
 * 发送带图片资源的邮件
 */
public void sendImgResMail(ImgResMail model) throws MessagingException {

    MimeMessage mimeMessage = javaMailSender.createMimeMessage();

    MimeMessageHelper msg = new MimeMessageHelper(mimeMessage, true);    //邮件发送者
    msg.setFrom(model.getSendMailAccount());    //邮件接收者
    msg.setTo(model.getAcceptMailAccount());    //邮件主题
    msg.setSubject(model.getTheme());    //邮件发送时间
    msg.setSentDate(model.getSendTime());    //邮件正文
    msg.setText(model.getMailText(),true);    //添加图片链接
    for (int i = 0; i < model.getContentIds().size(); i++) {
        msg.addInline(model.getContentIds().get(i), new FileSystemResource(new File(model.getPaths().get(i))));
    }

    javaMailSender.send(mimeMessage);
}

c、接下来,就是进行测试了,还是老地方,去MailTest测试类中,写一个testcese,测试该方法是否有报错等逻辑问题。

@Test
public void sendImgResMail() throws MessagingException {

    ImgResMail mailModel = new ImgResMail();
    mailModel.setTheme("这是一封测试邮件"); // 设置邮件主题
    mailModel.setSendMailAccount("xxx@foxmail.com"); // 设置邮箱发送者
    mailModel.setAcceptMailAccount("xxx@foxmail.com"); // 设置邮件接收者,可以有多个接收者
    mailModel.setSendTime(new Date());    // 设置邮件发送日期
    mailModel.setMailText("<p>hello 大家好,我是一封测试邮件,我包含了两张图片,分别如下</p><p>第一张图片:</p><img src='cid:img1'/><p>第二张图片:</p><img src='cid:img2'/>");
    
    List<String> paths = new ArrayList<>();
    //举例添加两张图片
    paths.add("C:\\Users\\Administrator\\Desktop\\2022.png");
    paths.add("C:\\Users\\Administrator\\Desktop\\test.png");
    mailModel.setPaths(paths);

    List<String> contentIds = new ArrayList<>();
    //如下的与你邮件正文text匹配图片名,必须一样,要不然图片无法找到进行展示。
    contentIds.add("img1");
    contentIds.add("img2");
    mailModel.setContentIds(contentIds);

    sendMailBuild.sendImgResMail(mailModel);
}

d、运行testcase ,可见,邮件发送成功,邮件成功接收!如下图:

       如果需要既要有带附件又要求正文带图片展示,那你就无非把两个发送方法组合到一起就可以了,发送方法还是原来的,但是你在进行组合邮件发送,分别调用这两个方法即可。

... ...

       OK,以上就是这期所有的内容啦,如果有任何问题欢迎评论区批评指正,咱们下期见。

三、往期热门推荐

文末🔥

如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《springboot零基础入门教学》,从无到有,从零到一!希望能帮助到更多小伙伴们。

我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

感谢认真读完我博客的铁子萌,在这里呢送给大家一句话,不管你是在职还是在读,绝对终身受用。
时刻警醒自己:
抱怨没有用,一切靠自己;
想要过更好的生活,那就要逼着自己变的更强,生活加油!!!