前言:

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

准备工作:

  请参考: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. 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. BZOJ‘s Usaco 奶牛题集锦

    1230 线段树 1231 状压DP 1232 最小生成树 1527 贪心 1600 打表找规律 1601 最小生成树 1602 prime 1606 DP 1607 筛法 1609 DP 1610 ...

  2. js兼容总结之获取非行间样式

    非行间样式案例 #div1 { width: 200px; height: 200px; background: red; } IE获取非行间样式 var oDiv = document.getEle ...

  3. Oracle Database 创建HR模式

    其实Oracle是自带演示模式的,我还一直在跪舔外面的培训机构的sql文件 首先以system 用户登陆SQL 输入: alter user hr account unlock identified ...

  4. fatal error

    1.   fatal error C1083: 无法打开源文件 编译报此错误:  1>c1xx : fatal error C1083: 无法打开源文件:“Projects\XXXCCCC\VB ...

  5. Ubuntu创建桌面快捷方式

    默认情况下,ubuntu会将自动安装的软件快捷方式保存在/usr/share/applications目录下,如果我们要创建桌面快捷方式,只需要右键-复制-桌面 就Ok,如图: 上面的方法是通过系统自 ...

  6. 谷歌浏览器允许ajax跨域以非安全模式打开

    最近使用ajax的时候,因为是在本地测试调用 后台时一直会报错. 解决方案:用谷歌浏览器 以非安全的模式打开 在cmd命令行中 cd 到谷歌的安装目录下 (右键 属性 复制路径) 然后在 运行如下命令 ...

  7. ASP.NET TextBox 当鼠标点击后清空默认提示文字

    ASP.NET TextBox 当鼠标点击后清空默认提示文字 [ 方法一] 前台代码: <div>    <asp:TextBox ID="txtName" ru ...

  8. 如何让Maple中的数学引擎进入你的桌面应用程序和网站

    MapleNET数学服务套件将Maple 2015强大的数学引擎引入您的应用程序和网站.使用MapleNET,您可以添加数学计算和可视化功能到网页和桌面程序中,通过互联网/局域网分享“活”的Maple ...

  9. 如何将Eclipse中的项目迁移到Android Studio 中

    如何将Eclipse中的项目迁移到Android Studio 中 如果你之前有用Eclipse做过安卓开发,现在想要把Eclipse中的项目导入到Android Studio的环境中,那么首先要做的 ...

  10. PHP文件相关的操作函数——文件操作

    1.文件的代开与关闭 1.1 fopen() 作用:该函数用于打开一个文件 具体使用访问:http://www.w3school.com.cn/php/func_filesystem_fopen.as ...