java发送内嵌图片邮件

网友投稿 196 2023-07-22


java发送内嵌图片邮件

整体效果:

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

1.web前端

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

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

实现过程:

1.web前端(bootstrap布局)

姓名:

电话:

邮件:

消息:



2.首先准备一个XML的模板(包含的是邮件的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}标识, 如(注:{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);

//给消息对象设置发件人/收件wwuSdAWl人/主题/发信时间

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(creawwuSdAWlteImageMimeBodyPart("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";

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:鼠标悬停小图标显示大图标
下一篇:Java的Swing编程中使用SwingWorker线程模式及顶层容器
相关文章

 发表评论

暂时没有评论,来抢沙发吧~