java中的接口是类吗
223
2023-07-22
java发送内嵌图片邮件
整体效果:
发送端:网易邮箱;接收端:qq邮箱。
1.web前端
2.在网易邮箱“已发送”中可以看见通过java代码发送的邮件
3.同样在qq邮箱中也可以看到这样的效果
实现过程:
1.web前端(bootstrap布局)
姓名:
电话:
邮件:
消息:
2.首先准备一个XML的模板(
发件人: {0}
电话: {1}
邮箱: {2}
内容:
{3}
其中模板中会有一些标识符,如{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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~