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.mzph.cn/news/531354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SD卡移植FAT32文件系统无MBR

问题&#xff1a;在研究SD卡和FAT32文件系统的时候&#xff0c;发现SD卡有的有MBR&#xff0c;有的没有MBR&#xff0c;这个为什么呢&#xff1f; 分析&#xff1a;MBR是主引导记录&#xff0c;是在给磁盘分区的时候建立的&#xff0c;我们的SD卡没有这个可能就是没有进行过分区…

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;当然也可以在本地测试…

简单文本编辑器

一、前言 聚天地之灵气&#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;解决方法 最开始我包含的头…

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…

(一)最邻近插值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;双线性插值原理 一般情况下我…

(三)图像转灰度图Python实现

这里写目录标题&#xff08;一&#xff09;原始图像&#xff08;二&#xff09;转换原理&#xff08;三&#xff09;python实现1. 安装库2. python程序编写3. 效果4. 工程文件&#xff08;一&#xff09;原始图像 &#xff08;二&#xff09;转换原理 &#xff08;三&#xff…

java泛型上下限

前言&#xff1a; java的泛型上下限不是很好理解&#xff0c;尤其像我这种菜鸡。反反复复看了好几遍了...&#xff0c;真是... 一、简单的继承体系 class Person{}class Student extends Person{}class Worker extends Person{} 二、泛型上限&#xff08;extends 关键字&#x…

基于matlab的步进电机仿真(一)

这里写目录标题环境准备基础准备模型参数输入和输出仿真原理图仿真资源环境准备 MatLab2021b 基础准备 打开Matlab&#xff0c;在帮助文档里面搜索step motor,我们这里选择如下模型 该模型实现了一个通用的步进电机模型&#xff1a; 可变磁阻步进电机永磁或混合步进电机 …

java自定义类加载器

前言 java反射&#xff0c;最常用的Class.forName()方法。做毕设的时候&#xff0c;接收到代码字符串&#xff0c;通过 JavaCompiler将代码字符串生成A.class文件&#xff08;存放在classpath下&#xff0c;也就是eclipse项目中的bin目录里&#xff09;&#xff0c;然后通过jav…

repo介绍(一)

repo简介 Repo 是我们以 Git 为基础构建的代码库管理工具,可以组织多个仓库的上传和下载。它是由一系列的Python脚本组成&#xff0c;封装了一系列的Git命令&#xff0c;用来统一管理多个Git仓库 一个大型的项目可能由很多小的仓库组合而成的&#xff0c;为了方便统一管理各个…

hash长度扩展攻击

作为一个信息安全的人&#xff0c;打各个学校的CTF比赛是比较重要的&#xff01; 最近一个朋友发了道题目过来&#xff0c;发现有道题目比较有意思&#xff0c;这里跟大家分享下 这串代码的大致意思是&#xff1a; 这段代码首先引入了一个名为"flag.php"的文件&am…

repo介绍(二)

这篇文章来实例操作 安装repo&#xff0c;参考repo介绍这一节创建repo存放default.xml 的git仓库 初始化repo&#xff0c;repo init -u https://gitee.com/angerial/repo-test.git 这个时候会在当前目录生成如下文件 参考repo组成&#xff0c;修改.repo/manifest.xml,这里我的…

springmvc环境搭建以及常见问题解决

1.新建maven工程 a) 打开eclipse&#xff0c;file->new->project->Maven->Maven Project b) 下一步 c) 选择创建的工程为webapp&#xff0c;下一步 d) 填写项目的group id和artifact id。一般情况下&#xff0c;group id写域名的倒序&#xff0c;artifact id…