springboot系列(十四):如何实现发送图片doc文档等附件邮件?你一定得会|超级详细,建议收藏

Posted bug菌¹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot系列(十四):如何实现发送图片doc文档等附件邮件?你一定得会|超级详细,建议收藏相关的知识,希望对你有一定的参考价值。

👨‍🎓作者:bug菌

🎉简介:在CSDN、掘金等社区优质创作者,全网合计6w粉+,对一切技术都感兴趣,重心偏java方向,目前运营公众号[猿圈奇妙屋],欢迎小伙伴们的加入,一起秃头。

🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。

🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。

【开发云】年年都是折扣价,不用四处薅羊毛

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

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

一、前言🔥

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

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

二、业务场景🔥

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

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

package com.example.demo.component.mail.model;

import io.swagger.annotations.ApiModelProperty;

/**
 * 发送带附件的邮件参数
 *
 * @author luoYong
 * @version 1.0
 * @date 2022/1/18 10:57
 */
public class AccessoryMail extends Mail 

    @ApiModelProperty("附件地址")
    private String attachmentPath;

    @ApiModelProperty("附件名")
    private String attachmentName;

    public String getAttachmentPath() 
        return attachmentPath;
    

    public void setAttachmentPath(String attachmentPath) 
        this.attachmentPath = attachmentPath;
    

    public String getAttachmentName() 
        return attachmentName;
    

    public void setAttachmentName(String attachmentName) 
        this.attachmentName = attachmentName;
    


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

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!

        最后送大家两句我很喜欢的话,与诸君共勉!


☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以start。

🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。


​​​​

💌如果文章对您有所帮助,就请留下您的吧!(#^.^#);

💝如果喜欢bug菌分享的文章,就请给bug菌点个关注吧!(๑′ᴗ‵๑)づ╭❤~;

💗如果对文章有任何疑问,还请文末留言或者加群吧;

💞鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复参与讨论(请勿发表攻击言论,谢谢);

💕版权声明:原创不易,转载请附上原文出处链接和本文声明,版权所有,盗版必究!!!谢谢。

以上是关于springboot系列(十四):如何实现发送图片doc文档等附件邮件?你一定得会|超级详细,建议收藏的主要内容,如果未能解决你的问题,请参考以下文章

springboot系列(二十四):如何实现Excel文件导出?这你得会 | 超级详细,建议收藏

springboot系列(二十四):如何实现Excel文件导出?这你得会 | 超级详细,建议收藏

springboot系列(二十四):如何实现Excel文件导出?这你得会 | 超级详细,建议收藏

springboot系列(十六):如何实现发送邮件提醒,附完整源码(完结篇)

springboot系列:如何实现邮件发送提醒,你一定得会(准备篇)

springboot系列(十三):如何实现发送普通邮件?你一定得会|超级详细,建议收藏