javaMail的应用,看网上有好多关于这个应用的示例。我上传只是算一种学习的积累吧。顺
便积累一下点击数,嘿嘿。大多数在这里面的朋友都是在职人员了,我还是一学生。在这里
胡乱写写,为了在毕业时能在简历上写上,个人博客www.javazeke.iteye.com,O(∩_
∩)O哈哈~.........说明我还会一点点东西吧。。。。
搞了好长时间,处理把附件变成模板邮件的资源。最后才发现MimeBodyPart提供这种功能,
真是晕死我了。一开始我笨到自己写流去处理,看来以后要更多的看书,圣人说:博学博爱
嘛!!!
好了,废话连篇。。呵呵,,下面给大家介绍下这么去发这东西
- 发邮件的地址:<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>
表单:
<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.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[toMore.length];
- *for(int i=0;i<toMore.length;i++){
- * adr[i]=new InternetAddress(toMore[i]);
- *}
- *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);
- <SPAN style="COLOR: #ff0000">Object[] obj=new Object[]{"zeke","123456","img1"};
- //这个MessageFormat是个好东西,不了解的去jdk看看,在java.text下面
- str = MessageFormat.format(str, obj);</SPAN>
- 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哈哈~
- //这里要是有前辈看到了,请告诉我一下,先谢谢了。。。
- <SPAN style="COLOR: #ff0000">mbp2.setHeader("Content-ID", "img1");</SPAN>
- 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.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[toMore.length];
*for(int i=0;i<toMore.length;i++){
* adr[i]=new InternetAddress(toMore[i]);
*}
*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 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;
- }
- }
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 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>
- <SPAN style="COLOR: #ff0000"><img src="cid:{2}" /></SPAN>
- </div>
- </body>
- </html>
- </xml-body>
模板文件(.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);
- }
- }