博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java发送内嵌图片邮件
阅读量:6198 次
发布时间:2019-06-21

本文共 6182 字,大约阅读时间需要 20 分钟。

前言:

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

准备工作:

  请参考:

整体效果:

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

1.web前端

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

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

实现过程:

1.web前端(bootstrap布局)

  • 姓名:
  • 电话:
  • 邮件:
  • 消息:

2.首先准备一个XML的模板(<xml-body>包含的是邮件的html格式的文本)。

Creating Email Magic
发件人: {0}
电话: {1}
邮箱: {2}
内容:
   {3}
Twitter Facebook

  其中模板中会有一些标识符,如{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中邮件发送

  

转载地址:http://umnca.baihongyu.com/

你可能感兴趣的文章
Vue子传父,父组件事件处理函数中arguments的使用
查看>>
DispatchSemaphore & DispatchGroup
查看>>
使用Netty三分钟手写一个RPC
查看>>
前端导出数据表格(jpg、csv)
查看>>
少编码多思考:代码越多 问题越多
查看>>
反思一次羞愧的阿里面试经历
查看>>
Vue笔记——项目中设置mock数据
查看>>
# 【vue基础篇】一看就懂的vue环境变量配置
查看>>
你真的了解String吗?(修正版)
查看>>
## HTTP系列之Accept-Encoding和Content-Encoding
查看>>
深入理解redux源码
查看>>
适配器设计模式
查看>>
什么是翻译平台最重要的地方?
查看>>
web前端开发必学知识点 你都掌握了吗
查看>>
叽里呱啦G客沙龙,5月18日,上海
查看>>
基于Spring Cloud Gateway的路由实践
查看>>
程序猿生存指南-40 爱上野马
查看>>
智能小程序档案馆——搜索流量接入(一)
查看>>
Leetcode PHP题解--D19 867. Transpose Matrix
查看>>
第一章:nginx环境搭建
查看>>