JavaMail发送HTML(带图片,样式表等类型的)邮件
javaMail的应用,看网上有好多关于这个应用的示例。我上传只是算一种学习的积累吧。顺便积累一下点击数,嘿嘿。大多数在这里面的朋友都是在职人员了,我还是一学生。在这里
胡乱写写,为了在毕业时能在简历上写上,个人博客www.javazeke.iteye.com,O(∩_
∩)O哈哈~.........说明我还会一点点东西吧。。。。
搞了好长时间,处理把附件变成模板邮件的资源。最后才发现MimeBodyPart提供这种功能,
真是晕死我了。一开始我笨到自己写流去处理,看来以后要更多的看书,圣人说:博学博爱
嘛!!!
好了,废话连篇。。呵呵,,下面给大家介绍下这么去发这东西
表单:<form action="Send" method="post" name="mail" enctype="multipart/form-data">发邮件的地址:<input name="from" value="356354803@qq.com">发件箱的密码:<input name="secret">//这个是必要的,还有这个邮箱必须开通的SMTP/POP3,QQ是可以开通的,126的好像不行。接受者地址:<input name="to" value="masterjc@126.com">主题:<input name="subject" value="dsadfsdadfasdfasss">附件:<input type="file" name="file">内容:<textarea rows="10" cols="60" name="context">asfdsafsafsadfsafdasdsfafas</textarea>提交:<input type="submit"></form>
下面是处理代码(我就用servlet写的,就没用那些框框架架了,没有框架代码的侵入,下
次复制才复制的爽啊。。。)
import java.io.IOException;import java.io.PrintWriter;import java.text.MessageFormat;import java.util.Date;import java.util.Properties;import javax.activation.DataHandler;import javax.activation.FileDataSource;import javax.mail.Message;import javax.mail.Multipart;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeBodyPart;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMultipart;import javax.mail.internet.MimeUtility;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.oreilly.servlet.MultipartRequest;@SuppressWarnings("serial")public class Send extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();request.setCharacterEncoding("gbk");//封装请求,这个处理很牛,一般人做不到。。。MultipartRequest re=new MultipartRequest(request,".",1024*1024,"gbk");// 接收邮件类容String from = re.getParameter("from");String to = re.getParameter("to");String subject = re.getParameter("subject");//我把内容去掉了,为了是用模板//String context = re.getParameter("context");String secret = re.getParameter("secret");String filePath=re.getFilesystemName("file");// 邮件的服务器地址,邮件服务器的服务器名String mailServerName = "smtp.qq.com";try {// 获得系统属性Properties prop = System.getProperties();// 设置属性prop.setProperty("mail.smtp.host", mailServerName);prop.setProperty("mail.smtp.port", "25"); prop.setProperty("mail.smtp.auth", "true");String name=from.substring(0,from.indexOf("@"));MyAuthenticator au = new MyAuthenticator(name,secret);// 建立邮件发送的连接Session session = Session.getDefaultInstance(prop, au);// 创建邮件信息的载体Message message = new MimeMessage(session);// 设置邮件相关属性// 设置邮件发送地址message.setFrom(new InternetAddress(from));// 点到点的发送//一对多发送只要改一个地方如下:/** *构建一个群发地址数组*InternetAddress[] adr=new InternetAddress; *for(int i=0;i<toMore.length;i++){*adr=new InternetAddress(toMore);*}*Message的setRecipients方法支持群发。。注意:setRecipients方法是复数和点*到点不一样*message.setRecipients(Message.RecipientType.TO,adr); */message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));// 设置邮件主题message.setSubject(subject);// 邮件发送时间message.setSentDate(new Date());/* * 取得模板邮件的xml地址,这里用xml好处可大了,可以换行编写啊, * 如果你用properties文件,一个网页文件的内容都写在一行,看着都不舒服 */String path=this.getServletContext().getRealPath("/")+"mailTemplate\\MyXml.xml";//这个类下面贴,就几行代码,没什么神奇的String str=new ReaderXML().read(path);Object[] obj=new Object[]{"zeke","123456","img1"};//这个MessageFormat是个好东西,不了解的去jdk看看,在java.text下面str = MessageFormat.format(str, obj);MimeBodyPart mbp1=new MimeBodyPart();mbp1.setContent(str, "text/html;charset=gbk");/* * 附件上传的代码,相信大家附件上传都没问题,就是这么才能把它变成模板资源 呢?。。。O(∩_∩)O哈哈~。。。。很easy啦,,我也搞了好久,才发现。 */MimeBodyPart mbp2=new MimeBodyPart();FileDataSource fds=new FileDataSource(filePath);DataHandler dh=new DataHandler(fds);mbp2.setDataHandler(dh);//这里很重要,这里是如何把附件变成模板可利用资源这//相当于给这个附件绑定一个名字//他到底怎么实现的底层,有几种猜想,不知道是不是,//有一种想法,是不是把这个数据域设成一个消息头,然后在本页面类引用啊 //相当于cookie,不确定,这消息头也腻大了点啊,,O(∩_∩)O哈哈~//这里要是有前辈看到了,请告诉我一下,先谢谢了。。。mbp2.setHeader("Content-ID", "img1");mbp2.setFileName(MimeUtility.encodeText(fds.getName()));Multipart mp=new MimeMultipart();mp.addBodyPart(mbp1);mp.addBodyPart(mbp2);message.setContent(mp);// 关键。。。。发送Transport.send(message);} catch (Exception e) {e.printStackTrace();}out.write("ok");out.flush();out.close();}} 上面提到的读模板件的类
import java.io.File;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;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;}}
模板文件(.xml)<?xml version="1.0" encoding="UTF-8"?><xml-body><html><head></head><body><div id="main" style="width:966px; height:330px; text-align:left;margin:3px 26px; background-color:#F5F5F5; border:1px#E1E1E1 solid;"><b>userName:{0}<br />userPass:{1}<br /><a href="http://www.google.com">去Google看看</a></b><img src="cid:{2}" /></div></body></html></xml-body>
下面这个就不多说了,大家都知道import javax.mail.PasswordAuthentication;public class MyAuthenticator extends javax.mail.Authenticator {private String strUser;private String strPwd;public String getStrUser() {return strUser;}public void setStrUser(String strUser) {this.strUser = strUser;}public String getStrPwd() {return strPwd;}public void setStrPwd(String strPwd) {this.strPwd = strPwd;}public MyAuthenticator(String user, String password) {this.strUser = user;this.strPwd = password;}protected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(strUser, strPwd);}} 到这边所有的内容都贴上了,几个注意点
1.邮箱必须开通的SMTP/POP3,QQ是可以开通的,126的好像不行。
2.附件变成可利用资源,通过MimeBodyPart的setheader方法....上面有详细说明。
页:
[1]