Spring 发送内嵌图片的邮件 遇到的问题

Posted 我叫许路路,我是菜鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 发送内嵌图片的邮件 遇到的问题相关的知识,希望对你有一定的参考价值。

问题1:spring 发送带图片的html格式的邮件?

解决方法1:直接在发送内容里面添加  

<img src="http://www.rgagnon.com/images/jht.gif">

  这种方法是最简单的发送带图片的邮件的方法,但是存在一个问题:有的邮箱会把邮件中有带服务器地址的图片放到垃圾箱,导致邮件收不到,于是继续整。

解决方法2:使用Spring带的 MimeMessageHelper,说不清楚直接看代码:

 1 public class MyClass {
 2 
 3     public static void sendhtmlImgEmail(String subject, String sendHtml, String toUser, String ccUser, String bccUser,
 4             File[] attachment) {
 5         try {
 6             //【1】
 7             sendHtml = sendHtml + "<html><body><hr/><img src=\"cid:imprtant\"/></body></html>";
 8             JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
 9             // 设定mail server【2】
10             int port = 25;
11             senderImpl.setHost("邮箱host");
12             senderImpl.setPort(port);
13 
14             // 建立邮件消息,发送简单邮件和html邮件的区别
15             MimeMessage mailMessage = senderImpl.createMimeMessage();
16             // 注意这里的boolean,等于真的时候才能嵌套图片,在构建MimeMessageHelper时候,所给定的值是true表示启用multipart模式
17             // 最后一个参数“utf-8”避免邮件中文乱码  问题【3】
18             MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage, true, "utf-8");
19 
20             // 设置多个抄送地址
21             if (null != ccUser && !ccUser.isEmpty()) {
22                 @SuppressWarnings("static-access")
23                 InternetAddress[] internetAddressCC = new InternetAddress().parse(ccUser);
24                 messageHelper.setCc(internetAddressCC);
25             }
26             // 设置多个密送地址
27             if (null != bccUser && !bccUser.isEmpty()) {
28                 @SuppressWarnings("static-access")
29                 InternetAddress[] internetAddressBCC = new InternetAddress().parse(bccUser);
30                 messageHelper.setBcc(internetAddressBCC);
31             }
32             // 添加附件的内容
33             if (null != attachment && attachment.length != 0) {
34                 for (File file : attachment) {
35                     DataSource source = new FileDataSource(file);
36                     messageHelper.addAttachment(file.getName(), source);
37                 }
38             }
39             if (null != toUser && !toUser.isEmpty()) {
40                 //这里的分隔符可以自定义  发送给多人【4】
41                 String[] toUsers = toUser.split(",");
42                 messageHelper.setTo(toUsers);
43             }
44             // 设置收件人,寄件人
45             messageHelper.setFrom("发件人名称");
46             messageHelper.setSubject(subject);
47             // true 表示启动HTML格式的邮件
48             messageHelper.setText(sendHtml, true);
49             
50             //这个 直接在main方法中可以 但是部署后就不行了  报错 找不到路径【5】
51             //String imagePath="src/main/resources/config/emailTag.png";
52             
53             //这个获取项目的完整路径【6】
54             String abPath = new MyClass().getClass().getClassLoader().getResource("/").getPath();
55 
56             String imagePath=abPath+"config/emailTag.png";
57             
58             FileSystemResource img = new FileSystemResource(imagePath);
59 
60             //这个是图片的标识   对应上面image标签中的cid【7】
61             messageHelper.addInline("imprtant", img);
62             senderImpl.setUsername("邮箱用户名");
63             senderImpl.setPassword("你的邮箱密码");
64             Properties prop = new Properties();
65             //这个使用outlook 发邮件时候 必须添加 否则报错那个 ,,,忘了【8】
66             prop.put("mail.smtp.starttls.enable", "true");
67             senderImpl.setJavaMailProperties(prop);
68             // 发送邮件
69             senderImpl.send(mailMessage);
70             System.out.println("邮件发送成功!");
71         } catch (Exception e) {
72             e.printStackTrace();
73         } 
74     }
75 }

解释:

【1】:注意 cid 这个参数  指图片的标识,看【7】,必须相同

【2】:设置邮件服务器地址跟端口号  注意outlook端口号是 587

【3】:发送中文乱码,添加编码格式 utf-8

【4】:邮件发送给多人

【5】:这个在部署后 找不到路径  有知道的大侠 求赐教

【6】:这个我看了下项目部署在载服务器上的路径,然后想到这个方法获取到绝对路径在加上自己图片在的路径 成功(这个 折腾了好久,一直找不到路径)

【7】:对应【1】

【8】:这个 使用微软邮箱的时候 报错 ,com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM

    添加这个属性后就可以

 

总结:

 这个发送邮件方法,可以带附件,发送多个人,添加内嵌图片,Html内容,添加附件未测试,其他都测试通过,但是如果不设置【1】【7】,图片会自动变成附件发送。

以上是关于Spring 发送内嵌图片的邮件 遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用内嵌图像Flask-Mail发送电子邮件?

从 Spring Boot 应用程序发送电子邮件时遇到问题

javamail: UrlDataSource获取网络文件作为邮件的附件|javamail发送二进制流附件的问题

在 Windows XP 中使用 Indy 10 发送带有内嵌图像的电子邮件时出现“SMTP 传入数据超时”

Spring Boot 发送邮件,端口号大有玄机

JavaMail API 发送电子邮件