java發送內嵌圖片郵件

前言:

  博客系統中需要郵件服務的功能,以前寫過類似的功能,不過功能太簡單了,僅僅是發送文本內容,現在嘗試一下發送內嵌圖片郵件!

準備工作:

  請參考:http://www.cnblogs.com/hujunzheng/p/4792831.html

整體效果:

  發送端:網易郵箱;接收端:qq郵箱。

1.web前端

2.在網易郵箱“已發送”中可以看見通過java代碼發送的郵件

3.同樣在qq郵箱中也可以看到這樣的效果

實現過程:

1.web前端(bootstrap布局)

<form action="mailAction!sendMail" method="post" name="mailForm" id="mailFormId"><ul class="list-group"><li class="list-group-item"><div class="input-group"><span class="input-group-addon" id="basic-addon1">姓名:</span><input type="text" class="form-control" placeholder="your name" name="mailForm.name" aria-describedby="basic-addon1"></div></li><li class="list-group-item"><div class="input-group"><span class="input-group-addon" id="basic-addon2">電話:</span><input type="text" class="form-control" placeholder="your phone" name="mailForm.phone" aria-describedby="basic-addon1"></div></li><li class="list-group-item"><div class="input-group"><span class="input-group-addon" id="basic-addon2">郵件:</span><input type="text" class="form-control" placeholder="your e-mail" name="mailForm.e_mail" aria-describedby="basic-addon1"></div></li><li class="list-group-item" style="padding-top: 20px;"><span class="label label-default blog-label-1">消息:</span><br><br><textarea rows="10" style="width:100%" name="mailForm.content" placeholder="請輸入消息(不要超過500個字符)"></textarea></li><li class="list-group-item"><center><button onclick="$('#mailFormId').submit();" type="button" class="btn btn-success">發送郵件</button></center></li></ul>
</form>

2.首先準備一個XML的模板(<xml-body>包含的是郵件的html格式的文本)。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 將空格換成全角的空格,就可以保證html不會將空格過濾掉 -->
<xml-body><html><head></head><body style="margin: 0; padding: 0;"><table border="0" cellpadding="0" cellspacing="0" width="100%">    <tbody><tr><td style="padding: 10px 0 30px 0;"><table align="center" border="0" cellpadding="0" cellspacing="0" width="600" style="border: 1px solid #cccccc; border-collapse: collapse;"><tbody><tr><td align="center" bgcolor="#70bbd9" style="padding: 40px 0 30px 0; color: #153643; font-size: 28px; font-weight: bold; font-family: Arial, sans-serif;"><img src="cid:{4}" alt="Creating Email Magic" width="300" height="230" style="display: block;"/></td></tr><tr><td bgcolor="#ffffff" style="padding: 40px 30px 40px 30px;"><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td style="color: #153643; font-family: Arial, sans-serif; font-size: 24px;"><b>發件人: {0}<br/>電話: {1}<br/>郵箱: {2}<br/>內容:<br/></b></td></tr><tr><td style="padding: 20px 0 30px 0; color: #153643; font-family: Arial, sans-serif; font-size: 16px; line-height: 20px;">{3}</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td width="260" valign="top"><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="cid:{5}" alt="" width="100%" height="140" style="display: block;"/></td></tr></tbody></table></td><td style="font-size: 0; line-height: 0;" width="20"></td><td width="260" valign="top"><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="cid:{6}" alt="" width="100%" height="140" style="display: block;"/></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td bgcolor="#ee4c50" style="padding: 30px 30px 30px 30px;"><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td align="right" width="25%"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td style="font-family: Arial, sans-serif; font-size: 12px; font-weight: bold;"><img src="cid:{7}" alt="Twitter" width="38" height="38" style="display: block;" border="0"/></td><td style="font-family: Arial, sans-serif; font-size: 12px; font-weight: bold;"><img src="cid:{8}" alt="Facebook" width="38" height="38" style="display: block;" border="0"/></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></body></html>
</xml-body>

  其中模板中會有一些標識符,如{i},表還是字符串的預留位置,然后通過MessageFormat格式化這樣的消息,然后將格式化后的字符串插入到模式中的適當位置。

//得到XML的模板
String XML_path = ServletActionContext.getServletContext().getRealPath("/mailTemplate")+"/myMailTemplete.xml";  
String str=new ReaderXML().read(XML_path);  
Object[] obj=new Object[]{mailForm.getName(), mailForm.getPhone(), mailForm.getE_mail(), mailForm.getContent(), "e_mail", "left", "right", "tw", "fb"};  
//MessageFormat可以格式化這樣的消息,然后將格式化后的字符串插入到模式中的適當位置
String tcontent = MessageFormat.format(str, obj);

  最終XML模板中的{i}分別被obj[i]替換了。

3.寫一個對XML模板的類ReaderXML?

public class ReaderXML {public String read(String path){
String str
=null;
str
=reader(path); return str;} private String reader(String path){ SAXReader reader=new SAXReader();String str=null; try { Document d=reader.read(new File(path));Element e=d.getRootElement();Element htmle=e.element("html");str=htmle.asXML();} catch (DocumentException e) {e.printStackTrace();}return str;} }

4.最后就是我們的控制器類MailAction?

  在 HTML 格式的正文中內含圖片是使用MimeBodyPart類的setContentID() 方法設置對應的資源文件的唯一標識符,即 MIME 協議對于郵件的結構組織格式中的 Content-ID 頭字段,對應著XML模板中的cid:{i}標識, 如<img src="cid:{8}"/>(注:{i}會通過MessageFormat.format替換成對應的字符串

public class MailAction extends ActionSupport{private MailForm mailForm;public MailForm getMailForm() {return mailForm;}public void setMailForm(MailForm mailForm) {this.mailForm = mailForm;}//添加內嵌圖片private MimeBodyPart createImageMimeBodyPart(String imageName) throws MessagingException, UnsupportedEncodingException{FileDataSource fds=new FileDataSource(ServletActionContext.getServletContext().getRealPath("/image")+"/" + imageName + ".gif");  MimeBodyPart mbp=new MimeBodyPart();  DataHandler dh=new DataHandler(fds);  mbp.setDataHandler(dh);  //設置對應的資源文件的唯一標識符,即 MIME 協議對于郵件的結構組織格式中的 Content-ID 頭字段;mbp.setHeader("Content-ID", imageName);mbp.setFileName(MimeUtility.encodeText(fds.getName()));  return mbp;}public String sendMail(){try {HttpServletRequest request = ServletActionContext.getRequest();String pwd = "************";//發件人郵箱密碼String mailfrom = "***********@163.com"; //網易的郵箱String wangyiFrom = mailfrom.substring(0, mailfrom.indexOf('@'));//網易郵箱的用戶名String tu = "163.com"; //發件人郵箱的后綴域名String tto= "**********@qq.com"; //接收郵件的郵箱String ttitle= "有人聯系你---來自胡峻崢的個人網站";//根據其物理路徑,得到XML的模板String XML_path = ServletActionContext.getServletContext().getRealPath("/mailTemplate")+"/myMailTemplete.xml";  String str=new ReaderXML().read(XML_path);  Object[] obj=new Object[]{mailForm.getName(), mailForm.getPhone(), mailForm.getE_mail(), mailForm.getContent(), "e_mail", "left", "right", "tw", "fb"};  //MessageFormat可以格式化這樣的消息,然后將格式化后的字符串插入到模式中的適當位置String tcontent = MessageFormat.format(str, obj);Properties props=new Properties();props.put("mail.smtp.host","smtp."+tu);//郵箱SMTP服務器地址端口
    props.put("mail.smtp.auth","true");//這樣才能通過驗證
    Session s=Session.getInstance(props);s.setDebug(true);MimeMessage message=new MimeMessage(s);//給消息對象設置發件人/收件人/主題/發信時間
    InternetAddress from;from = new InternetAddress(mailfrom);//發件人的qq郵箱
            message.setFrom(from);InternetAddress to=new InternetAddress(tto);//收件人的郵箱
            message.setRecipient(Message.RecipientType.TO,to);message.setSubject(ttitle);message.setSentDate(new Date());//給消息對象設置內容BodyPart mbp=new MimeBodyPart();//新建一個存放信件內容的BodyPart對象mbp.setContent(tcontent,"text/html;charset=gb2312");//給BodyPart對象設置內容和格式/編碼方式// 用于組合文本和圖片,"related"型的MimeMultipart對象  Multipart mm=new MimeMultipart("related");//新建一個MimeMultipart對象用來存放BodyPart對象(事實上可以存放多個)mm.addBodyPart(mbp);//將BodyPart加入到MimeMultipart對象中(可以加入多個BodyPart)//添加圖片mm.addBodyPart(createImageMimeBodyPart("e_mail"));mm.addBodyPart(createImageMimeBodyPart("left"));mm.addBodyPart(createImageMimeBodyPart("right"));mm.addBodyPart(createImageMimeBodyPart("tw"));mm.addBodyPart(createImageMimeBodyPart("fb"));message.setContent(mm);//把mm作為消息對象的內容
            message.saveChanges();Transport transport=s.getTransport("smtp");transport.connect("smtp."+tu, wangyiFrom, pwd); //這里的wangyiFrom為發件人網易賬號
            transport.sendMessage(message,message.getAllRecipients());transport.close();ActionContext.getContext().getSession().put("operations", "郵件發送成功, 請耐心等待回復!");} catch (Exception e) {System.out.println(e.toString());ActionContext.getContext().getSession().put("errors",  e.toString());return "errors";} return "sendMail";}
}

?最后附上前端圖片:

????

參考Spring中郵件發送

  Spring各種郵件發送

轉載于:https://www.cnblogs.com/hujunzheng/p/5093496.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531354.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531354.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531354.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

調試跟蹤利器---strace

通過這篇文章你會學習到strace的用法&#xff0c;strace可以幫助你高效地定位進程中的一些錯誤&#xff0c;關于strace的用處有很多&#xff0c;可以自行發掘 前面我們講解了gdb調試程序,這篇文章介紹另一個調試跟蹤工具strace&#xff0c;同樣你可以在linux下執行man strace查…

MBR、DBR、FAT32基礎小知識

MBR-------主引導記錄 1.創建時間&#xff1a;由分區軟件&#xff08;Fdisk/PartitionMagic/Windows 2000/Windows XP安裝 工具等&#xff09;給 硬盤分區時建立的。 2.功能 &#xff1a;存放硬盤分區信息和引導系統時檢查分區。 3.作用范圍&#xff1a;MBR和虛擬MBR控制著整個…

java使用Executor(執行器)管理線程

一.一個實現了Runnable接口的類 class MyThread implements Runnable{private static int num 0;Overridepublic void run() {while(true){synchronized(MyThread.class){num;try{Thread.sleep(500);} catch(Exception e){System.out.println(e.toString());}System.out.print…

JMM和happens-before原則

JMM&#xff1a; Java Memory Model(Java內存模型)&#xff0c;圍繞著在并發過程中如何處理可見性、原子性、有序性這三個特性而建立的模型。 可見性&#xff1a; JMM提供了volatile變量定義、final、synchronized塊來保證可見性。  例如&#xff1a;線程a在將共享變量x1寫入…

SD卡移植FAT32文件系統無MBR

問題&#xff1a;在研究SD卡和FAT32文件系統的時候&#xff0c;發現SD卡有的有MBR&#xff0c;有的沒有MBR&#xff0c;這個為什么呢&#xff1f; 分析&#xff1a;MBR是主引導記錄&#xff0c;是在給磁盤分區的時候建立的&#xff0c;我們的SD卡沒有這個可能就是沒有進行過分區…

java獲取類的信息

關鍵技術剖析 1.java.lang.reflect包實現了java的反射機制&#xff0c;在使用反射機制時&#xff0c;需要導入該包。 2.Class類的forName方法能夠根據類名加載類&#xff0c;獲得類的Class對象。 Class類的getSuperclass方法獲得父類的Class對象&#xff1b;getDeclaredFields方…

FAT32文件系統介紹

FAT32文件系統&#xff08;一&#xff09;為什么要有文件系統&#xff08;二&#xff09;FAT32文件系統組成&#xff08;三&#xff09;分步介紹各部分(1) 首先介紹一下MBR(2)DBR介紹(3)FAT表介紹(4) 數據區&#xff08;一&#xff09;為什么要有文件系統 文件系統是操作系統用…

java中動態代理實現機制

前言&#xff1a; 代理模式是常用的java設計模式&#xff0c;它的特征是代理類與委托類有同樣的接口&#xff0c;代理類主要負責為委托類預處理消息、過濾消息、把消息轉發給委托類&#xff0c;以及事后處理消息等。代理類與委托類之間通常會存在關聯關系&#xff0c;一個代理類…

libiconv庫簡單裁剪支持CP437編碼

有許多人在做項目的時候都會遇到字符編碼的不一致導致的亂碼問題&#xff0c;那如何去解決呢&#xff1f;在Linux系統上可以通過iconv函數族來進行編碼轉換&#xff0c;但有時候我們并不需要全部的字符集&#xff0c;因為可能會占用比較大的空間&#xff0c;本文主要支持CP437編…

簡單java在線測評程序

簡單java程序在線測評程序 一&#xff0e;前言 大家過年好&#xff01;今年的第一篇博客啊&#xff01;家里沒有網&#xff0c;到處蹭無線&#xff01;日子過得真糾結&#xff01;因為畢設的需求&#xff0c;簡單寫了一個java程序在線測評程序&#xff0c;當然也可以在本地測試…

指針強制類型轉換觸發內存自動對齊

C語言的指針是我們操作很靈活&#xff0c;但是也留下了不少坑&#xff0c;今天工作遇到了一個指針的坑&#xff0c;這里復現一下&#xff1a; 指針類型強制轉換,并進行解引用,引起的內存對齊問題.&#xff08;一&#xff09;問題復現&#xff1a; 運行環境&#xff1a;Ubuntu …

簡單文本編輯器

一、前言 聚天地之靈氣&#xff0c;集日月之精華&#xff01;一個簡單的java文本編輯器由此而生。畢設所需&#xff0c;很是無奈&#xff01; 二、界面預覽 三、實現思路 1.字體選擇器的實現 (1).字體類 class MyFont{private Font font;private Color color;public Font getFo…

u-boot新增命令后出現data abort

&#xff08;一&#xff09;問題描述 u-boot下新增了一條update的命令&#xff0c;直接輸入update沒有報錯&#xff0c;但是輸入up按TAB鍵補全時發現出現data abort&#xff0c;而且輸入不支持的命令也會有data abort &#xff08;二&#xff09;解決方法 最開始我包含的頭…

sublime text學習

Ctrl / ---------------------注釋 Ctrl 滾動 --------------字體變大/縮小 Ctrl N-------------------新建 軟件右下角可以選擇文檔語法模式 Ctrl Shift P ------------------命令模式 命令&#xff1a; sshtml模糊匹配-----語法切換到html模式&#xff0c;同理所得&am…

core文件如何分析

目錄(一&#xff09;什么是coredump(二)coredump產生的條件&#xff08;1&#xff09;coredump產生主要原因&#xff1a;&#xff08;2&#xff09;如何生成coredump(三&#xff09;gdb使用(四&#xff09;實例調試coredump文件(五&#xff09;總結(一&#xff09;什么是coredu…

SpringMVC+FreeMarker

前言&#xff1a; 最近在學習SpringMVC&#xff0c;模板引擎用的是FreeMarker&#xff0c;之前沒有接觸過。利用SpringMVC開發其實還有許多的步驟&#xff0c;比如控制層&#xff0c;服務層&#xff0c;持久化層&#xff0c;實體等等&#xff0c;先弄了一個小demo來總結一下Spr…

SpringMVC那點事

一、SpringMVC返回json數據的三種方式 1、第一種方式是spring2時代的產物&#xff0c;也就是每個json視圖controller配置一個Jsoniew。 如&#xff1a;<bean id"defaultJsonView" class"org.springframework.web.servlet.view.json.MappingJacksonJsonView&q…

js學習內容的整理

1、jquery動態添加Table中的一行 function addTableRow(tableId){var html <tr>\......\</tr>";//行首插入一行if($(#tableId).find(tr).length 1){$(html).insertAfter($(#tableId).find(tr).eq(0));} else { $(html).insertBefore($(#tableId).find(tr).e…

(一)最鄰近插值python實現

這里寫目錄標題&#xff08;一&#xff09;原始圖像&#xff08;二&#xff09;最鄰近插值實現&#xff08;三&#xff09;python實現1. 安裝庫2. python程序編寫3. 效果4. 工程文件&#xff08;一&#xff09;原始圖像 &#xff08;二&#xff09;最鄰近插值實現 一般情況下我…

(二)雙線性插值python實現

這里寫目錄標題&#xff08;一&#xff09;原始圖像&#xff08;二&#xff09;雙線性插值原理&#xff08;三&#xff09;python實現1. 安裝庫2. python程序編寫3. 效果4. 工程文件&#xff08;一&#xff09;原始圖像 &#xff08;二&#xff09;雙線性插值原理 一般情況下我…