Spring Boot发送邮件二——带附件和内容有图片的邮件

上一篇写的是关于怎么用Spring Boot发送一封只有文字的邮件,这一篇来说怎么发送有附件的邮件和内容有图的文件

搭建环境

1.发送带附件的邮件

有了上一篇的基础,带附件的邮件直接上代码

@SpringBootTest
class MailApplicationTests {
    @Autowired
    JavaMailSender javaMailSender;//配置好后,Spring Boot自动生成的邮件发送对象
    @Test
    public void test2() throws MessagingException {
        MimeMessage msg = javaMailSender.createMimeMessage();//创建模拟的消息
        MimeMessageHelper helper = new MimeMessageHelper(msg,true);//创建模拟的消息工具
        helper.setFrom("[email protected]");//发件人
        helper.setSentDate(new Date());//发送日期
        helper.setSubject("这是测试主题(带附件)");//发送主题
        helper.setText("这是测试内容(带附件)");//发送内容
        helper.setTo("[email protected]");//收件人
        helper.addAttachment("气质美女.jpg",new File("C:\\Users\\Administrator\\Desktop\\气质美女.jpg"));//添加附件,发送的是一张图片
        javaMailSender.send(msg);//发送
    }
    }
  • 不能用SimpleMailMessage来处理附件了,Spring Boot 提供了一个模拟消息对象
    MimeMessage对象,它也是javaMailSender创建出来的。并进一步封装成一个模拟消息工具MimeMessageHelper来处理要发送的信息
  • Attachment代表附件,Attach是黏贴的意思,Attachment黏贴的东西,就是附件的意思;源码有两个参数,一个是附件文件名称,还有一个是File对象:
 public void addAttachment(String attachmentFilename, File file) throws MessagingException {
        Assert.notNull(file, "File must not be null");
        FileDataSource dataSource = new FileDataSource(file);
        dataSource.setFileTypeMap(this.getFileTypeMap());
        this.addAttachment(attachmentFilename, (DataSource)dataSource);
    }

运行 @Test 方法后登陆139邮箱发现刚才发送的邮件
在这里插入图片描述
在线预览一下,发送成功,感觉真不错
在这里插入图片描述

2.如何发送内容带图片的邮件

  • 意思就是我如何一打开邮箱就能看见图片,而不是在附件里,还是直接上代码:

@SpringBootTest
class MailApplicationTests {
    @Autowired
    JavaMailSender javaMailSender;

    @Test
    public void test3() throws MessagingException {
        MimeMessage msg = javaMailSender.createMimeMessage();//创建模拟的消息
        MimeMessageHelper helper = new MimeMessageHelper(msg, true);//创建模拟的消息工具
        helper.setFrom("[email protected]");//发件人
        helper.setSentDate(new Date());//发送日期
        helper.setSubject("这是测试主题(带图片)");//发送主题
        helper.setText("这是测试内容(带图片)<br/>第一张图片<div><img src='cid:p01'/></div>\n第二张图片\n<div><img src='cid:p02'/></div>",true);//发送内容,第二个参数代表是否设置成html,true代表是
        helper.setTo("[email protected]");//收件人
        helper.addInline("p01", new FileSystemResource(new File("C:\\Users\\Administrator\\Desktop\\气质美女.jpg")));//在行里P01的地方加入图片
        helper.addInline("p02", new FileSystemResource(new File("C:\\Users\\Administrator\\Desktop\\气质美女2.jpg")));//在行里P02的地方加入
        javaMailSender.send(msg);
    }
  • 看这个代码,是在 p01 或者 p02 地方替换成图片,这点大家比较直观的理解,那么出现两次 cid 是什么意思呢,先别急,稍后再解答;
  • helper.setText("这是测试内容(带图片)<br/>第一张图片<div><img src='cid:p01'/></div>\n第二张图片\n<div><img src='cid:p02'/></div>",true);这个方法的第二个参数是布尔类型,代表是否要将文本处理成 HTML,它的源码是
public void setText(String text, boolean html) throws MessagingException {
        Assert.notNull(text, "Text must not be null");
        Object partToUse;
        if (this.isMultipart()) {
            partToUse = this.getMainPart();
        } else {
            partToUse = this.mimeMessage;
        }

        if (html) {
            this.setHtmlTextToMimePart((MimePart)partToUse, text);
        } else {
            this.setPlainTextToMimePart((MimePart)partToUse, text);
        }

    }
  • 执行@Test方法发送邮件
  • 发送后打开邮箱:
    在这里插入图片描述
  • 带图片内容的邮件发送成功了,8行代码就搞定了;接下来看刚才的 cid问题,点击“倒三角”后,点击“显示邮件原文”
    在这里插入图片描述
    在这里插入图片描述
  • 这张图上 Content-ID: <p01> 代表的就是\<img src='cid:p01'/>片段,cid就是Content-ID的简称
  • 标红框的上边一行 Content-Disposition: inline 翻译一下是内容的位置 冒号 在行里
  • 标红框的上边两行 Content-Transfer-Encoding: base64 翻译一下是内容转换编码 冒号 base64(专门处理图片)
  • 标红框的上边三行 Content-Type:image/jpeg 翻译一下是内容类型 冒号 jpeg图片
    这些内容就是 helper.setText() 和 helper.addInline() 两个方法做的事,只不过 Java和邮箱处理成打开邮件时优雅的样子

结束

好了,这篇带附件和内容带图片的介绍就写到这里,又有了新问题,每次发邮件如果想改动内容就要动 Java 代码,有没有html一样的模板呢,有的,下一篇介绍如何用Spring Boot 中Thymeleaf 做模板来发送邮件。
Spring Boot发送邮件三——Thymeleaf做模板的邮件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章