论文部分内容阅读
摘要:电子邮件是Internet上信息传递的一种重要工具,邮件的群发增加了信息发布的主动性。本文实现了基于JavaMail的电子邮件群发,并加入了多线程技术,使得发送更为快捷。
关键词:JavaMail;群发;多线程
中图分类号:TP393文献标识码:A 文章编号:1009-3044(2007)17-31285-02
E-mail group sending based on JavaMail
QU Pei,LIU Li,GE Zhen
(College of Electronic Communication, Wuhan University of Science and Engineering, Wuhan 430073,China)
Abstract:The email is an important tool for information transmission on the Internet; the email group-sending emphasizes the initiative of information issues. It realized the email group-sending based on JavaMail in this paper, and has added the multi-thread technology, which helps to realize the shortcut of transmission.
Key words:JavaMail; group sending; Multithreading;
1 引言
近年来Internet飞速发展,Internet上信息的传递方式备受关注,电子邮件是Internet上信息传递的重要方式,电子邮件的群发使信息的发布有更多的主动性和方便性。本文介绍了基于JavaMail的电子邮件群发的设计及实现,并且在发送中加入多线程大大提高了发送效率。
2 JavaMail API相关介绍
JavaMail API是一种可选的、能用于读取、编写和发送电子消息的包(标准扩展),它提供了用于读取和发送邮件的一般邮件功能,可以使用这个包来创建邮件用户代理(Mail User Agent ,MUA) 类型的程序,用户可以与MUA类型的程序交互,MUA依靠MTA(Mail Transfer Agent,MTA)处理实际的发送任务。除此之外,JavaMail 需要 JavaBeans Activation Framework(JAF)来处理不是纯文本的邮件内容。
JavaMail API的设计为收发信息提供与协议无关的访问。一方面是使用特定的协议语言,另一方面是如何让发送和接收独立于提供程序/协议的消息。特定的协议语言主要包括:SMTP、POP、IMAP、MIME。JavaMail API的核心类有:Javax.mail.Session、Javax.mail.Message、Javax.mail.Address、Javax.mail.Authenticator、Javax.mail.Transport、Javax.mail.Store、Javax.mail. Folder。这几个类封装在mail. jar中,此外要实现带附件的邮件收发功能需要加上activation. jar。
3 利用JavaMail电子邮件群发的具体实现
3.1 创建一个Bean
JavaBeans是一种Java语言写成的可重用组件,是Sun微系统的一个面向对象的编程接口。对于邮件的群发,先创建一个Bean,如下:
public class MailInfo {
private String smtpServer = null;//发送方smtp
private String userName = null;//发送方邮件用户名
private String password = null; //发送方邮件密码
private String subject = null;//发送信件主题
private String attachment = null;//发送信件附件
private String to = ""; //发送地址
private String from = null; //发送来源
private String[] MutliTo = null; //群发用户
public String[] getMutliTo() {
return MutliTo;}
public void setMutliTo(String[] mutliTo) {
MutliTo = mutliTo;}
………………
public String getAttachment() {
return attachment;}
public void setAttachment(String attachment) {
this.attachment = attachment;}}
3.2 群发的具体实现
这里分为几个步骤,分别说明群发的具体实现:
(1)连接SMTP服务器
Properties props = new Properties();//创建属性对象
props.put("mail.smtp.host", smtpServer);
//设置smtp服务器地址
props.put("mail.smtp.auth", "true");
//设置服务器smtp需要验证
(2)创建新邮件并群发
Session sendMailSession = Session.getInstance(props, null);
//创建过程对象
MimeMessage newMessage = new MimeMessage(sendMailSession);
//创建邮件对象
newMessage.setSubject(subject);
//设主题
newMessage.setSentDate(new Date());
//设发送时间
newMessage.setFrom(new InternetAddress(mail.getFrom()));
//设发信人
InternetAddress[] address = new InternetAddress[mail.getMutliTo().length];
//群发地址
for (int i = 0; i < mail.getMutliTo().length; i++) {
//循环发送
address[i] = new InternetAddress( (mail.getMutliTo())[i]);}
newMessage.setRecipients(Message.RecipientType.TO, address);
(3)处理附件
if (mail.getAttachment()= =null) {
newMessage.setDataHandler(new DataHandler(mail.getContent(),
"text/plain"));}
else {
MimeBodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setDataHandler(new DataHandler(mail.getContent(), "text/plain"));
//附件是文本用text/plain,是html格式用text/html
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(mail.getAttachment());
messageBodyPart.setDataHandler(new DataHandler(source));
File fn = new File(mail.getAttachment());
String fileName = fn.getName();
if (fileName != null && !"".equals(fileName)) {
fileName = new String(fileName.getBytes("gb2312"), "iso-8859-1");}
messageBodyPart.setFileName(fileName);
multipart.addBodyPart(messageBodyPart);
newMessage.setContent(multipart);}
(4) 连接smtp服务器,并检查是否通过smtp发信验证
Transport transport = sendMailSession.getTransport("smtp");
transport.connect(smtpServer, SmtpUser, SmtpPwd);
transport.sendMessage(newMessage, newMessage.getAllRecipients());
transport.close();
4 群发中加入多线程
多线程的核心是多个代码块并发执行,本质特点是各代码块之间代码乱序执行。综合其特点看出在群发邮件中实现多线程,将会大大提高发送效率。这里分两部分来说明多线程的实现,如下:
(1)实现Runnable接口
Runnable接口只有一个方法run(),声明自己的类实现Runnable接口并提供这一方法,将我们的线程代码写入其中,就完成了这一部分的任务。
public class MutliThread
implements Runnable {
public synchronized void run() {
MailInfo mInfo = new MailInfo();//实例化2.1的Bean
String[] usersMail = {"地址1",…, "地址n"};//群发地址
mInfo.setMutliTo(usersMail);
//得到群发地址,信件主题、内容略
MailHandle mail = new MailHandle();//群发写的类
mail.send(mInfo);//send为2.2所有内容写入此方法
}}
(2)创建Thread类的实例
Thread[] thread = new Thread[num];//num是要创建的线程数
for (int i = 0; i < num; i++) {
thread[i] = new Thread();
thread[i].start(); }
5 结束语
本文简单介绍了JavaMail API,具体实现了基于JavaMail的电子邮件群发,给信息的传递提供了一种更为方便、快捷的工具。在群发基础上加入了多线程技术,使电子邮件的群发更加高效。
参考文献:
[1]王勇,陈楠,基于Java语言的电子邮件系统的实现,现代电子技术[J],2004.(9):26-28.
[2]沈洪良,朱进国,一种使用JavaMail的邮件直接发送方法及其实现[J],东华大学学报(自然科学版),2004(30,5):74-75.
[3]周治国,李文印,万吉,等,基于Java的E-mail系统客户端的设计与实现[J],2004(22,2):169-172.
[4]Sun Microsystems.Inc JavaMail API Design SPecificationV1.2.2000.
关键词:JavaMail;群发;多线程
中图分类号:TP393文献标识码:A 文章编号:1009-3044(2007)17-31285-02
E-mail group sending based on JavaMail
QU Pei,LIU Li,GE Zhen
(College of Electronic Communication, Wuhan University of Science and Engineering, Wuhan 430073,China)
Abstract:The email is an important tool for information transmission on the Internet; the email group-sending emphasizes the initiative of information issues. It realized the email group-sending based on JavaMail in this paper, and has added the multi-thread technology, which helps to realize the shortcut of transmission.
Key words:JavaMail; group sending; Multithreading;
1 引言
近年来Internet飞速发展,Internet上信息的传递方式备受关注,电子邮件是Internet上信息传递的重要方式,电子邮件的群发使信息的发布有更多的主动性和方便性。本文介绍了基于JavaMail的电子邮件群发的设计及实现,并且在发送中加入多线程大大提高了发送效率。
2 JavaMail API相关介绍
JavaMail API是一种可选的、能用于读取、编写和发送电子消息的包(标准扩展),它提供了用于读取和发送邮件的一般邮件功能,可以使用这个包来创建邮件用户代理(Mail User Agent ,MUA) 类型的程序,用户可以与MUA类型的程序交互,MUA依靠MTA(Mail Transfer Agent,MTA)处理实际的发送任务。除此之外,JavaMail 需要 JavaBeans Activation Framework(JAF)来处理不是纯文本的邮件内容。
JavaMail API的设计为收发信息提供与协议无关的访问。一方面是使用特定的协议语言,另一方面是如何让发送和接收独立于提供程序/协议的消息。特定的协议语言主要包括:SMTP、POP、IMAP、MIME。JavaMail API的核心类有:Javax.mail.Session、Javax.mail.Message、Javax.mail.Address、Javax.mail.Authenticator、Javax.mail.Transport、Javax.mail.Store、Javax.mail. Folder。这几个类封装在mail. jar中,此外要实现带附件的邮件收发功能需要加上activation. jar。
3 利用JavaMail电子邮件群发的具体实现
3.1 创建一个Bean
JavaBeans是一种Java语言写成的可重用组件,是Sun微系统的一个面向对象的编程接口。对于邮件的群发,先创建一个Bean,如下:
public class MailInfo {
private String smtpServer = null;//发送方smtp
private String userName = null;//发送方邮件用户名
private String password = null; //发送方邮件密码
private String subject = null;//发送信件主题
private String attachment = null;//发送信件附件
private String to = ""; //发送地址
private String from = null; //发送来源
private String[] MutliTo = null; //群发用户
public String[] getMutliTo() {
return MutliTo;}
public void setMutliTo(String[] mutliTo) {
MutliTo = mutliTo;}
………………
public String getAttachment() {
return attachment;}
public void setAttachment(String attachment) {
this.attachment = attachment;}}
3.2 群发的具体实现
这里分为几个步骤,分别说明群发的具体实现:
(1)连接SMTP服务器
Properties props = new Properties();//创建属性对象
props.put("mail.smtp.host", smtpServer);
//设置smtp服务器地址
props.put("mail.smtp.auth", "true");
//设置服务器smtp需要验证
(2)创建新邮件并群发
Session sendMailSession = Session.getInstance(props, null);
//创建过程对象
MimeMessage newMessage = new MimeMessage(sendMailSession);
//创建邮件对象
newMessage.setSubject(subject);
//设主题
newMessage.setSentDate(new Date());
//设发送时间
newMessage.setFrom(new InternetAddress(mail.getFrom()));
//设发信人
InternetAddress[] address = new InternetAddress[mail.getMutliTo().length];
//群发地址
for (int i = 0; i < mail.getMutliTo().length; i++) {
//循环发送
address[i] = new InternetAddress( (mail.getMutliTo())[i]);}
newMessage.setRecipients(Message.RecipientType.TO, address);
(3)处理附件
if (mail.getAttachment()= =null) {
newMessage.setDataHandler(new DataHandler(mail.getContent(),
"text/plain"));}
else {
MimeBodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setDataHandler(new DataHandler(mail.getContent(), "text/plain"));
//附件是文本用text/plain,是html格式用text/html
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(mail.getAttachment());
messageBodyPart.setDataHandler(new DataHandler(source));
File fn = new File(mail.getAttachment());
String fileName = fn.getName();
if (fileName != null && !"".equals(fileName)) {
fileName = new String(fileName.getBytes("gb2312"), "iso-8859-1");}
messageBodyPart.setFileName(fileName);
multipart.addBodyPart(messageBodyPart);
newMessage.setContent(multipart);}
(4) 连接smtp服务器,并检查是否通过smtp发信验证
Transport transport = sendMailSession.getTransport("smtp");
transport.connect(smtpServer, SmtpUser, SmtpPwd);
transport.sendMessage(newMessage, newMessage.getAllRecipients());
transport.close();
4 群发中加入多线程
多线程的核心是多个代码块并发执行,本质特点是各代码块之间代码乱序执行。综合其特点看出在群发邮件中实现多线程,将会大大提高发送效率。这里分两部分来说明多线程的实现,如下:
(1)实现Runnable接口
Runnable接口只有一个方法run(),声明自己的类实现Runnable接口并提供这一方法,将我们的线程代码写入其中,就完成了这一部分的任务。
public class MutliThread
implements Runnable {
public synchronized void run() {
MailInfo mInfo = new MailInfo();//实例化2.1的Bean
String[] usersMail = {"地址1",…, "地址n"};//群发地址
mInfo.setMutliTo(usersMail);
//得到群发地址,信件主题、内容略
MailHandle mail = new MailHandle();//群发写的类
mail.send(mInfo);//send为2.2所有内容写入此方法
}}
(2)创建Thread类的实例
Thread[] thread = new Thread[num];//num是要创建的线程数
for (int i = 0; i < num; i++) {
thread[i] = new Thread();
thread[i].start(); }
5 结束语
本文简单介绍了JavaMail API,具体实现了基于JavaMail的电子邮件群发,给信息的传递提供了一种更为方便、快捷的工具。在群发基础上加入了多线程技术,使电子邮件的群发更加高效。
参考文献:
[1]王勇,陈楠,基于Java语言的电子邮件系统的实现,现代电子技术[J],2004.(9):26-28.
[2]沈洪良,朱进国,一种使用JavaMail的邮件直接发送方法及其实现[J],东华大学学报(自然科学版),2004(30,5):74-75.
[3]周治国,李文印,万吉,等,基于Java的E-mail系统客户端的设计与实现[J],2004(22,2):169-172.
[4]Sun Microsystems.Inc JavaMail API Design SPecificationV1.2.2000.