前言:

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

准备工作:

  请参考: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.  
  10. <li class="list-group-item">
  11. <div class="input-group">
  12. <span class="input-group-addon" id="basic-addon2">电话:</span>
  13. <input type="text" class="form-control" placeholder="your phone" name="mailForm.phone" aria-describedby="basic-addon1">
  14. </div>
  15. </li>
  16.  
  17. <li class="list-group-item">
  18. <div class="input-group">
  19. <span class="input-group-addon" id="basic-addon2">邮件:</span>
  20. <input type="text" class="form-control" placeholder="your e-mail" name="mailForm.e_mail" aria-describedby="basic-addon1">
  21. </div>
  22. </li>
  23.  
  24. <li class="list-group-item" style="padding-top: 20px;">
  25. <span class="label label-default blog-label-1">消息:</span>
  26. <br><br>
  27. <textarea rows="10" style="width:100%" name="mailForm.content" placeholder="请输入消息(不要超过500个字符)"></textarea>
  28. </li>
  29.  
  30. <li class="list-group-item">
  31. <center><button onclick="$('#mailFormId').submit();" type="button" class="btn btn-success">发送邮件</button></center>
  32. </li>
  33. </ul>
  34. </form>

2.首先准备一个XML的模板(<xml-body>包含的是邮件的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. 电话: {1}
  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[i]替换了。

3.写一个对XML模板的类ReaderXML

  1. public class ReaderXML {
  2. public String read(String path){
    String str=null;
    str=reader(path);
  3. return str;
  4. }
  5. private String reader(String path){
  6. SAXReader reader=new SAXReader();
  7. String str=null;
  8. try {
  9. Document d=reader.read(new File(path));
  10. Element e=d.getRootElement();
  11. Element htmle=e.element("html");
  12. str=htmle.asXML();
  13. } catch (DocumentException e) {
  14. e.printStackTrace();
  15. }
  16. return str;
  17. }
  18. }

4.最后就是我们的控制器类MailAction

  在 HTML 格式的正文中内含图片是使用MimeBodyPart类的setContentID() 方法设置对应的资源文件的唯一标识符,即 MIME 协议对于邮件的结构组织格式中的 Content-ID 头字段,对应着XML模板中的cid:{i}标识, 如<img src="cid:{8}"/>(注:{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.  
  21. public String sendMail(){
  22. try {
  23. HttpServletRequest request = ServletActionContext.getRequest();
  24. String pwd = "************";//发件人邮箱密码
  25. String mailfrom = "***********@163.com"; //网易的邮箱
  26. String wangyiFrom = mailfrom.substring(0, mailfrom.indexOf('@'));//网易邮箱的用户名
  27. String tu = "163.com"; //发件人邮箱的后缀域名
  28. String tto= "**********@qq.com"; //接收邮件的邮箱
  29. String ttitle= "有人联系你---来自胡峻峥的个人网站";
  30.  
  31. //根据其物理路径,得到XML的模板
  32. String XML_path = ServletActionContext.getServletContext().getRealPath("/mailTemplate")+"/myMailTemplete.xml";
  33. String str=new ReaderXML().read(XML_path);
  34. Object[] obj=new Object[]{mailForm.getName(), mailForm.getPhone(), mailForm.getE_mail(), mailForm.getContent(), "e_mail", "left", "right", "tw", "fb"};
  35. //MessageFormat可以格式化这样的消息,然后将格式化后的字符串插入到模式中的适当位置
  36. String tcontent = MessageFormat.format(str, obj);
  37.  
  38. Properties props=new Properties();
  39.  
  40. props.put("mail.smtp.host","smtp."+tu);//邮箱SMTP服务器地址端口
  41.  
  42. props.put("mail.smtp.auth","true");//这样才能通过验证
  43.  
  44. Session s=Session.getInstance(props);
  45.  
  46. s.setDebug(true);
  47.  
  48. MimeMessage message=new MimeMessage(s);
  49.  
  50. //给消息对象设置发件人/收件人/主题/发信时间
  51.  
  52. InternetAddress from;
  53.  
  54. from = new InternetAddress(mailfrom);//发件人的qq邮箱
  55. message.setFrom(from);
  56. InternetAddress to=new InternetAddress(tto);//收件人的邮箱
  57. message.setRecipient(Message.RecipientType.TO,to);
  58. message.setSubject(ttitle);
  59. message.setSentDate(new Date());
  60. //给消息对象设置内容
  61. BodyPart mbp=new MimeBodyPart();//新建一个存放信件内容的BodyPart对象
  62. mbp.setContent(tcontent,"text/html;charset=gb2312");//给BodyPart对象设置内容和格式/编码方式
  63. // 用于组合文本和图片,"related"型的MimeMultipart对象
  64. Multipart mm=new MimeMultipart("related");//新建一个MimeMultipart对象用来存放BodyPart对象(事实上可以存放多个)
  65. mm.addBodyPart(mbp);//将BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart)
  66.  
  67. //添加图片
  68. mm.addBodyPart(createImageMimeBodyPart("e_mail"));
  69. mm.addBodyPart(createImageMimeBodyPart("left"));
  70. mm.addBodyPart(createImageMimeBodyPart("right"));
  71. mm.addBodyPart(createImageMimeBodyPart("tw"));
  72. mm.addBodyPart(createImageMimeBodyPart("fb"));
  73.  
  74. message.setContent(mm);//把mm作为消息对象的内容
  75. message.saveChanges();
  76. Transport transport=s.getTransport("smtp");
  77. transport.connect("smtp."+tu, wangyiFrom, pwd); //这里的wangyiFrom为发件人网易账号
  78. transport.sendMessage(message,message.getAllRecipients());
  79. transport.close();
  80. ActionContext.getContext().getSession().put("operations", "邮件发送成功, 请耐心等待回复!");
  81. } catch (Exception e) {
  82. System.out.println(e.toString());
  83. ActionContext.getContext().getSession().put("errors", e.toString());
  84. return "errors";
  85. }
  86. return "sendMail";
  87. }
  88. }

最后附上前端图片:

    

参考Spring中邮件发送

  Spring各种邮件发送

java发送内嵌图片邮件的更多相关文章

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

    问题1:spring 发送带图片的html格式的邮件? 解决方法1:直接在发送内容里面添加 <img src="http://www.rgagnon.com/images/jht.gi ...

  2. 使用MailKit发送带有内嵌图片的邮件且图片不显示成附件

    使用MailKit发送带有内嵌图片的邮件且图片不显示成附件 参考文章:MailKit---发送邮件 注意 在邮件客户端中是否显示内嵌图片为附件依据不同邮件有所不同,暂经测试Outlook和qq不显示为 ...

  3. spring 5.x 系列第20篇 ——spring简单邮件、附件邮件、内嵌资源邮件、模板邮件发送 (代码配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 邮件发送配置类为com.heibaiyin ...

  4. C#发送内置图片的html格式邮件的代码

    将写内容过程经常用的内容段备份一次,下面的内容是关于C#发送内置图片的html格式邮件的内容,应该对码农们也有用处.MailMessage m = new MailMessage();m.Subjec ...

  5. spring 5.x 系列第19篇 ——spring简单邮件、附件邮件、内嵌资源邮件、模板邮件发送 (xml配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 邮件发送配置文件为springApplic ...

  6. Atitit java集成内嵌浏览器与外嵌浏览器attilax总结

    Atitit java集成内嵌浏览器与外嵌浏览器attilax总结 HTML5将颠覆原生App世界.这听起来有点危言耸听,但若认真分析HTML5的发展史,你会发现,这个世界的发展趋势确实就是这样. 熟 ...

  7. java发送带附件的邮件

    /** * java发送带附件的邮件 * 周枫 * 2013.8.10 */ package com.dsideal.Util; import javax.mail.*; import javax.m ...

  8. 原生js实现tab选项卡里内嵌图片滚动特效代码

    <!DOCTYPE HTML><html lang="en-US"><head><meta charset="UTF-8&quo ...

  9. 『Asp.Net 组件』Asp.Net 服务器组件 内嵌图片:自己的图片控件

    代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...

随机推荐

  1. jQuery插件开发(溢出滚动)

    声明:此程序仅针对手机端,简单的封装一个插件,意在记载插件的开发过程,如有错误及不足之处,还望即时指出. 移动开发的时候,我们经常会遇到滑动事件,众所周知手机端滑动主要依靠touch事件.最近接连遇到 ...

  2. 原生AJAX封装

    var ajaxHelper = { /*1.0 浏览器兼容的方式创建异步对象*/ makeXHR: function () { //声明异步对象变量 var xmlHttp = false; //声 ...

  3. 【AspNet Core】Nuget代理网站

    因为访问Nuget太慢,在Dotnet Core RC2发布前,我就基于Asp.Net做了一个Nuget代理网站 这是网站地址:http://nuget.lzzy.net/ Nuget源:http:/ ...

  4. Dictionary Learning(字典学习、稀疏表示以及其他)

    第一部分 字典学习以及稀疏表示的概要 字典学习(Dictionary Learning)和稀疏表示(Sparse Representation)在学术界的正式称谓应该是稀疏字典学习(Sparse Di ...

  5. bootstrap之排版类

    bootstrap之排版类

  6. phone 调试三种工具

    1. Phonegap桌面开发工具 Phonegap Desktop-App与 手机客户端调试工具PhoneGap Developer App 此工具方便.快捷.自动.可以在真机中查看 无法设置断点. ...

  7. 偶遇STM32 JTAG和SWD口(调试)被禁用无法下载,已经粗暴解决!

    处女座,为了板子走线美观,拉线方便,在项目量产前,还更改了原来外设的IO口,埋头苦干一天,移植ok,发现PB3一直不听使唤,好,加班检查代码,检查初始化,时钟,IO对应,然后试PCB板,是否短路,断路 ...

  8. shell去除换行和空格2

    #!/bin/bash if [ -f str.txt ] ## 如果str.txt存在,则返回true then strval=$(cat str.txt|awk '{printf "%s ...

  9. mysql添加一个用户

    对于添加mysql的远程访问用户,一定要记得刷新刷新系统权限表不然你怎么弄都是不成功的. insert into mysql.user(Host,User,Password) values(" ...

  10. SQL Server 求结果

    ;with cte as ( select  CONVERT(DATE, DATEADD(DAY, -9, GETDATE())) as paytime union all select datead ...