問題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】,圖片會自動變成附件發送。