前言:

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

准备工作:

  请参考: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各种邮件发送

java发送内嵌图片邮件相关推荐

  1. Java发送内嵌图片的邮件

    使用Java发送邮件时,既需要发送html文档又需要在邮件中内嵌图片(非附件形式),这里封装了一个类使用JavaMail组织的邮件发送,支持多张图片发送,并指定图片位置.注意img标签src要如下写& ...

  2. java smtp 内嵌图片,SMTP 发送内嵌图片 邮件

    本文实验用QQ邮箱发不了,网易163能发文字不能发img标签的内容 在新浪邮箱实验成功: public bool sendEmailto(List   shoujianren,string biaot ...

  3. 邮件中html内嵌图片,邮件内嵌html

    一般的HTML格式电子邮件,都可以使用内建有HTML编辑器的电子邮件程序(如:Outlook Express)编写发送.我们以Outlook Express 5.0(简称OE 5.0)为例,点击工具栏 ...

  4. JavaMail(四)——发送HTML格式、内嵌图片、带附件的邮件

    代码如下: package com.company;import javax.activation.DataHandler; import javax.activation.FileDataSourc ...

  5. WPS内嵌图片怎样使用Java获取图片?

    wps表格中,将图片如图设置为内嵌图片格式时,Java后端的POI无法读取图片,有其他的解决办法吗?(图片设置为浮动图片时可正常读取)

  6. SpringBoot Zxing _ Java 生成二维码(可内嵌图片)

    前提 jdk 要求:1.8:会 SpringBoot.Maven: 以下代码可以直接复制粘贴到项目中,可以直接使用~ 一.pom 准备 <?xml version="1.0" ...

  7. java 枚举内嵌枚举_高度有用的Java ChronoUnit枚举

    java 枚举内嵌枚举 几年前,我发表了博客文章" The Highly有用的Java TimeUnit Enum ",其中介绍了JDK 5引入的TimeUnit枚举. JDK 8 ...

  8. java 枚举内嵌枚举_Java枚举益智游戏

    java 枚举内嵌枚举 假设我们有以下代码: enum Case {CASE_ONE,CASE_TWO,CASE_THREE;private static final int counter;priv ...

  9. Markdown内嵌图片的解决方法

    Markdown内嵌图片的解决方法 文章目录 Markdown内嵌图片的解决方法 问题与解决方案 一.实现功能 二.脚本制作 1.利用文件选择框选择文件或者从剪贴板读取图像 2.将图片转为Base64 ...

最新文章

  1. linux shell中 if else以及大于、小于、等于逻辑表达式介绍
  2. Spring Cloud Alibaba 新版本发布:众多期待内容整合打包加入!
  3. PetShop 中的字符串过滤
  4. python api 示例_Python简单接口测试实例
  5. struts2被淘汰的原因
  6. CNN看清世界——浅谈四个经典网络的差异
  7. Web项目--------原Oracle数据库的项目同时兼容MySql
  8. 基于战舰V3的NRF24L01模块的原理剖析及应用
  9. Android Studio与夜神模拟器联合调试
  10. gcd函数(C/C++)
  11. SAP MM 固定资产采购订单
  12. Git Clone时报错解决方法
  13. 个人对系统拆分的理解
  14. 【Uniapp框架】快速开发自己一款APP应用,如何将Uniapp项目快速打包成APP应用
  15. 火遍全网的chatGPT怎么使用
  16. 遇到 *.7z001 *.7z.002 *.7z.003 如何用winrar解压缩
  17. 理论力学知识要点归纳(一)
  18. 暨大 c语言复试 2015,暨南大学历年复试真题合集.pdf
  19. 基于具体实验对脑部分区的具体调研
  20. 京东双11热爱环游记,使用AUTO.JS脚本自动领汪汪币(2021.10.29最新)

热门文章

  1. unslider调用配置选项
  2. Socket网络协议之一
  3. iphone网络交互json实现
  4. memcached 安装小结-1
  5. C# 数据类型映射 (SQLite,MySQL,MSSQL,Oracle)
  6. aspectj xml
  7. Ninject之旅之十一:Ninject动态工厂(附程序下载)
  8. BZOJ1795 : [Ioi2008]Pyramid Base 金字塔地基
  9. NGINX前端代理TOMCAT取真实客户端IP
  10. C#后台调用前台javascript的五种方法