在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

java发送内嵌图片邮件

2017-2-7 13:41| 发布者: zhangjf| 查看: 490| 评论: 0

摘要: 前言: 博客系统中需要邮件服务的功能,以前写过类似的功能,不过功能太简单了,仅仅是发送文本内容,现在尝试一下发送内嵌图片邮件! 准备工作: 请参考: http://www.cnblogs.com/hujunzheng/p/4792831.html 整体 ...
前言:

博客系统中需要邮件服务的功能,以前写过类似的功能,不过功能太简单了,仅仅是发送文本内容,现在尝试一下发送内嵌图片邮件!

准备工作:

请参考: http://www.cnblogs.com/hujunzheng/p/4792831.html

整体效果:

发送端:网易邮箱;接收端:qq邮箱。

1.web前端

2.在网易邮箱“已发送”中可以看见通过java代码发送的邮件

3.同样在qq邮箱中也可以看到这样的效果

实现过程: 1.web前端(bootstrap布局)
  1. <form action="mailAction!sendMail" method="post" name="mailForm" id="mailFormId">
  2. <ul class="list-group">
  3. <li class="list-group-item">
  4. <div class="input-group">
  5. <span class="input-group-addon" id="basic-addon1">姓名:</span>
  6. <input type="text" class="form-control" placeholder="your name" name="mailForm.name" aria-describedby="basic-addon1">
  7. </div>
  8. </li>
  9. <li class="list-group-item">
  10. <div class="input-group">
  11. <span class="input-group-addon" id="basic-addon2">电话:</span>
  12. <input type="text" class="form-control" placeholder="your phone" name="mailForm.phone" aria-describedby="basic-addon1">
  13. </div>
  14. </li>
  15. <li class="list-group-item">
  16. <div class="input-group">
  17. <span class="input-group-addon" id="basic-addon2">邮件:</span>
  18. <input type="text" class="form-control" placeholder="your e-mail" name="mailForm.e_mail" aria-describedby="basic-addon1">
  19. </div>
  20. </li>
  21. <li class="list-group-item" style="padding-top: 20px;">
  22. <span class="label label-default blog-label-1">消息:</span>
  23. <br><br>
  24. <textarea rows="10" style="width:100%" name="mailForm.content" placeholder="请输入消息(不要超过500个字符)"></textarea>
  25. </li>
  26. <li class="list-group-item">
  27. <center><button onclick="$('#mailFormId').submit();" type="button" class="btn btn-success">发送邮件</button></center>
  28. </li>
  29. </ul>
  30. </form>
复制代码
2.首先准备一个XML的模板(包含的是邮件的html格式的文本)。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- 将空格换成全角的空格,就可以保证html不会将空格过滤掉 -->
  3. <xml-body>
  4. <html>
  5. <head>
  6. </head>
  7. <body style="margin: 0; padding: 0;">
  8. <table border="0" cellpadding="0" cellspacing="0" width="100%">
  9. <tbody><tr>
  10. <td style="padding: 10px 0 30px 0;">
  11. <table align="center" border="0" cellpadding="0" cellspacing="0" width="600" style="border: 1px solid #cccccc; border-collapse: collapse;">
  12. <tbody><tr>
  13. <td align="center" bgcolor="#70bbd9" style="padding: 40px 0 30px 0; color: #153643; font-size: 28px; font-weight: bold; font-family: Arial, sans-serif;">
  14. <img src="cid:{4}" alt="Creating Email Magic" width="300" height="230" style="display: block;"/>
  15. </td>
  16. </tr>
  17. <tr>
  18. <td bgcolor="#ffffff" style="padding: 40px 30px 40px 30px;">
  19. <table border="0" cellpadding="0" cellspacing="0" width="100%">
  20. <tbody><tr>
  21. <td style="color: #153643; font-family: Arial, sans-serif; font-size: 24px;">
  22. <b>
  23. 发件人: {0}
  24. <br/>
  25. 电话: 小贝
  26. <br/>
  27. 邮箱: {2}
  28. <br/>
  29. 内容:<br/>
  30. </b>
  31. </td>
  32. </tr>
  33. <tr>
  34. <td style="padding: 20px 0 30px 0; color: #153643; font-family: Arial, sans-serif; font-size: 16px; line-height: 20px;">
  35.    {3}
  36. </td>
  37. </tr>
  38. <tr>
  39. <td>
  40. <table border="0" cellpadding="0" cellspacing="0" width="100%">
  41. <tbody><tr>
  42. <td width="260" valign="top">
  43. <table border="0" cellpadding="0" cellspacing="0" width="100%">
  44. <tbody><tr>
  45. <td>
  46. <img src="cid:{5}" alt="" width="100%" height="140" style="display: block;"/>
  47. </td>
  48. </tr>
  49. </tbody></table>
  50. </td>
  51. <td style="font-size: 0; line-height: 0;" width="20">
  52. </td>
  53. <td width="260" valign="top">
  54. <table border="0" cellpadding="0" cellspacing="0" width="100%">
  55. <tbody><tr>
  56. <td>
  57. <img src="cid:{6}" alt="" width="100%" height="140" style="display: block;"/>
  58. </td>
  59. </tr>
  60. </tbody></table>
  61. </td>
  62. </tr>
  63. </tbody></table>
  64. </td>
  65. </tr>
  66. </tbody></table>
  67. </td>
  68. </tr>
  69. <tr>
  70. <td bgcolor="#ee4c50" style="padding: 30px 30px 30px 30px;">
  71. <table border="0" cellpadding="0" cellspacing="0" width="100%">
  72. <tbody><tr>
  73. <td align="right" width="25%">
  74. <table border="0" cellpadding="0" cellspacing="0">
  75. <tbody><tr>
  76. <td style="font-family: Arial, sans-serif; font-size: 12px; font-weight: bold;">
  77. <img src="cid:{7}" alt="Twitter" width="38" height="38" style="display: block;" border="0"/>
  78. </td>
  79. <td style="font-family: Arial, sans-serif; font-size: 12px; font-weight: bold;">
  80. <img src="cid:{8}" alt="Facebook" width="38" height="38" style="display: block;" border="0"/>
  81. </td>
  82. </tr>
  83. </tbody></table>
  84. </td>
  85. </tr>
  86. </tbody></table>
  87. </td>
  88. </tr>
  89. </tbody></table>
  90. </td>
  91. </tr>
  92. </tbody></table>
  93. </body>
  94. </html>
  95. </xml-body>
复制代码

其中模板中会有一些标识符,如 {i},表还是字符串的预留位置,然后通过MessageFormat格式化这样的消息,然后将格式化后的字符串插入到模式中的适当位置。

  1. //得到XML的模板
  2. String XML_path = ServletActionContext.getServletContext().getRealPath("/mailTemplate")+"/myMailTemplete.xml";
  3. String str=new ReaderXML().read(XML_path);
  4. Object[] obj=new Object[]{mailForm.getName(), mailForm.getPhone(), mailForm.getE_mail(), mailForm.getContent(), "e_mail", "left", "right", "tw", "fb"};
  5. //MessageFormat可以格式化这样的消息,然后将格式化后的字符串插入到模式中的适当位置
  6. String tcontent = MessageFormat.format(str, obj);
复制代码

最终XML模板中的{i}分别被obj替换了。

3.写一个对XML模板的类ReaderXML
  1. public class ReaderXML {
  2. public String read(String path){
  3. String str=null;
  4. str=reader(path);
  5. return str;
  6. }
  7. private String reader(String path){
  8. SAXReader reader=new SAXReader();
  9. String str=null;
  10. try {
  11. Document d=reader.read(new File(path));
  12. Element e=d.getRootElement();
  13. Element htmle=e.element("html");
  14. str=htmle.asXML();
  15. } catch (DocumentException e) {
  16. e.printStackTrace();
  17. }
  18. return str;
  19. }
  20. }
复制代码
4.最后就是我们的控制器类MailAction

在 HTML 格式的正文中内含图片是使用MimeBodyPart类的setContentID() 方法设置对应的资源文件的唯一标识符,即 MIME 协议对于邮件的结构组织格式中的 Content-ID 头字段,对应着XML模板中的cid:{i}标识, 如(注: {i}会通过MessageFormat.format替换成对应的字符串 )

  1. public class MailAction extends ActionSupport{
  2. private MailForm mailForm;
  3. public MailForm getMailForm() {
  4. return mailForm;
  5. }
  6. public void setMailForm(MailForm mailForm) {
  7. this.mailForm = mailForm;
  8. }
  9. //添加内嵌图片
  10. private MimeBodyPart createImageMimeBodyPart(String imageName) throws MessagingException, UnsupportedEncodingException{
  11. FileDataSource fds=new FileDataSource(ServletActionContext.getServletContext().getRealPath("/image")+"/" + imageName + ".gif");
  12. MimeBodyPart mbp=new MimeBodyPart();
  13. DataHandler dh=new DataHandler(fds);
  14. mbp.setDataHandler(dh);
  15. //设置对应的资源文件的唯一标识符,即 MIME 协议对于邮件的结构组织格式中的 Content-ID 头字段;
  16. mbp.setHeader("Content-ID", imageName);
  17. mbp.setFileName(MimeUtility.encodeText(fds.getName()));
  18. return mbp;
  19. }
  20. public String sendMail(){
  21. try {
  22. HttpServletRequest request = ServletActionContext.getRequest();
  23. String pwd = "************";//发件人邮箱密码
  24. String mailfrom = "***********@163.com"; //网易的邮箱
  25. String wangyiFrom = mailfrom.substring(0, mailfrom.indexOf('@'));//网易邮箱的用户名
  26. String tu = "163.com"; //发件人邮箱的后缀域名
  27. String tto= "**********@qq.com"; //接收邮件的邮箱
  28. String ttitle= "有人联系你---来自胡峻峥的个人网站";
  29. //根据其物理路径,得到XML的模板
  30. String XML_path = ServletActionContext.getServletContext().getRealPath("/mailTemplate")+"/myMailTemplete.xml";
  31. String str=new ReaderXML().read(XML_path);
  32. Object[] obj=new Object[]{mailForm.getName(), mailForm.getPhone(), mailForm.getE_mail(), mailForm.getContent(), "e_mail", "left", "right", "tw", "fb"};
  33. //MessageFormat可以格式化这样的消息,然后将格式化后的字符串插入到模式中的适当位置
  34. String tcontent = MessageFormat.format(str, obj);
  35. Properties props=new Properties();
  36. props.put("mail.smtp.host","smtp."+tu);//邮箱SMTP服务器地址端口
  37. props.put("mail.smtp.auth","true");//这样才能通过验证
  38. Session s=Session.getInstance(props);
  39. s.setDebug(true);
  40. MimeMessage message=new MimeMessage(s);
  41. //给消息对象设置发件人/收件人/主题/发信时间
  42. InternetAddress from;
  43. from = new InternetAddress(mailfrom);//发件人的qq邮箱
  44. message.setFrom(from);
  45. InternetAddress to=new InternetAddress(tto);//收件人的邮箱
  46. message.setRecipient(Message.RecipientType.TO,to);
  47. message.setSubject(ttitle);
  48. message.setSentDate(new Date());
  49. //给消息对象设置内容
  50. BodyPart mbp=new MimeBodyPart();//新建一个存放信件内容的BodyPart对象
  51. mbp.setContent(tcontent,"text/html;charset=gb2312");//给BodyPart对象设置内容和格式/编码方式
  52. // 用于组合文本和图片,"related"型的MimeMultipart对象
  53. Multipart mm=new MimeMultipart("related");//新建一个MimeMultipart对象用来存放BodyPart对象(事实上可以存放多个)
  54. mm.addBodyPart(mbp);//将BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart)
  55. //添加图片
  56. mm.addBodyPart(createImageMimeBodyPart("e_mail"));
  57. mm.addBodyPart(createImageMimeBodyPart("left"));
  58. mm.addBodyPart(createImageMimeBodyPart("right"));
  59. mm.addBodyPart(createImageMimeBodyPart("tw"));
  60. mm.addBodyPart(createImageMimeBodyPart("fb"));
  61. message.setContent(mm);//把mm作为消息对象的内容
  62. message.saveChanges();
  63. Transport transport=s.getTransport("smtp");
  64. transport.connect("smtp."+tu, wangyiFrom, pwd); //这里的wangyiFrom为发件人网易账号
  65. transport.sendMessage(message,message.getAllRecipients());
  66. transport.close();
  67. ActionContext.getContext().getSession().put("operations", "邮件发送成功, 请耐心等待回复!");
  68. } catch (Exception e) {
  69. System.out.println(e.toString());
  70. ActionContext.getContext().getSession().put("errors", e.toString());
  71. return "errors";
  72. }
  73. return "sendMail";
  74. }
  75. }
复制代码
最后附上前端图片:

来自: http://www.cnblogs.com/hujunzheng/p/5093496.html

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-9 09:11

Copyright 2015-2025 djqfx

返回顶部