blog迁移至:
http://www.micmiu.com
J2EE JavaMail
http://java.sun.com/products/javamail
JavaMail API是一种可选的、能用于读取、编写和发送电子消息的包(标准扩展)。您可使用这种包创建邮件用户代理(Mail User Agent ,MUA) 类型的程序,它类似于Eudora、Pine及Microsoft Outlook这些邮件程序。其主要目的不是像发送邮件或其他邮件传输代理(Mail Transfer Agent,MTA)类型的程序那样用于传输、发送和转发消息。换句话说,用户可以与MUA类型的程序交互,以阅读和撰写电子邮件。MUA依靠MTA处理实际的发送任务。
常用的四种协议:
- ·SMTP
简单邮件传输协议(SMTP)是用于传送电子邮件的机制。在JavaMail API环境中,您的基于JavaMail的程序将与您公司或Internet服务提供商(ISP)的SMTP服务器通信。该SMTP服务器将会把消息转发给用作接收消息的SMTP服务器,最后用户可通过POP或IMAP协议获取该消息。由于支持身份验证,所以不需要SMTP服务器是一种开放的转发器,但需要确保SMTP服务器配置正确。JavaMail API中没有集成用于处理诸如配置服务器以转发消息或添加/删除电子邮件帐户这一类任务的功能。
- ·POP
POP的含义是邮局协议,当前的版本为3,也称作POP3,该协议是在RFC 1939中定义的。POP是Internet上的大多数人用来接收邮件的机制。它为每个用户的每个邮箱定义支持,这是它所做的全部工作,也是大多数问题的根源。在使用POP协议时,人们熟悉的很多功能,如查看收到了多少新邮件消息的功能,POP根本不支持。这些功能都内置到诸如Eudora或Microsoft Outlook之类的邮件程序中,能为您记住接收的上一封邮件,以及计算有多少新邮件这类信息。因此,使用JavaMail API时,如果想获取这类信息,将需要由自己进行计算。
- ·IMAP
IMAP是用于接收消息的更加高级的协议,它是在RFC 2060中定义的。IMAP的含义是“Internet消息访问协议”,当前版本是第4版,也称作IMAP4。使用IMAP时,您的邮件服务器必须支持该协议。您不能只是简单地把程序转变为支持IMAP,而不是支持POP,就指望能支持IMAP中的一切。假定您的邮件服务器支持IMAP,那么基于JavaMail的程序就可利用在服务器上拥有多个文件夹的用户,并且这些文件夹可以被多个用户共享的功能。
由于IMAP协议具有更高级的功能,您也许会想IMAP应该被每一个人使用,但事实不是这样。因为IMAP会加重邮件服务器的负荷,它需要服务器接收新消息,发送消息给请求的用户,并在多个文件夹中为每个用户维护这些消息。而这要集中备份,因而长期下去用户的文件夹会变得越来越大,当磁盘空间用光了时,每个人都会遭受损失。而使用POP协议时,已保存消息可以解除服务器的重负。
- ·MIME
MIME的含义是“多用途的网际邮件扩充协议”。它不是一种邮件传输协议,相反,它定义传输的内容:消息的格式、附件等。许多文档都定义了MIME协议,包含:RFC 822、RFC 2045、RFC 2046和RFC 2047。作为JavaMail API的用户,一般不需要担心这些格式。但是,这些格式确实存在,并为您的程序所用。
NNP和其他协议
由于JavaMail API分开了提供程序和其他部分,所以您可以轻松地为附加协议添加支持。Sun公司提供第3方提供程序清单,这些提供程序要利用 Sun公司不支持的少见的协议。在这份清单中,您将会看到对NNTP(网络新闻传输协议)[新闻组]、S/MIME(安全多用途的网际邮件扩充协议)及其他协议的提供支持的第3方提供程序。
下面为发送Email的具体实例代码:
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
/**
* java send mail demo
* @author Michael sun
*/
public class JavaMailSend {
/**
* send mail
* @param subject
* @param from
* @param to
* @param text
* @param filenames
* @param mimeType
*/
private void sendmail(String subject, String from, String[] to,
String text, String[] filenames, String mimeType) {
try {
Properties props = new Properties();
String smtp = "smtp.163.com"; // 设置发送邮件所用到的smtp
String servername = "xxxx";
String serverpaswd = "xxxx";
javax.mail.Session mailSession = null; // 邮件会话对象
javax.mail.internet.MimeMessage mimeMsg = null; // MIME邮件对象
props = java.lang.System.getProperties(); // 获得系统属性对象
props.put("mail.smtp.host", smtp); // 设置SMTP主机
props.put("mail.smtp.auth", "true"); // 是否到服务器用户名和密码验证
// 到服务器验证发送的用户名和密码是否正确
SmtpAuthenticator myEmailAuther = new SmtpAuthenticator(servername,
serverpaswd);
// 设置邮件会话 注意这里将认证信息放进了Session的创建参数里
mailSession = javax.mail.Session.getInstance(props,
(Authenticator) myEmailAuther);
// 设置传输协议
javax.mail.Transport transport = mailSession.getTransport("smtp");
// 设置from、to等信息
mimeMsg = new javax.mail.internet.MimeMessage(mailSession);
if (null != from && !"".equals(from)) {
InternetAddress sentFrom = new InternetAddress(from);
mimeMsg.setFrom(sentFrom); // 设置发送人地址
}
InternetAddress[] sendTo = new InternetAddress[to.length];
for (int i = 0; i < to.length; i++) {
System.out.println("发送到:" + to[i]);
sendTo[i] = new InternetAddress(to[i]);
}
mimeMsg.setRecipients(
javax.mail.internet.MimeMessage.RecipientType.TO, sendTo);
mimeMsg.setSubject(subject, "gb2312");
MimeBodyPart messageBodyPart1 = new MimeBodyPart();
// messageBodyPart.setText(UnicodeToChinese(text));
messageBodyPart1.setContent(text, mimeType);
// 附件传输格式
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart1);
for (int i = 0; i < filenames.length; i++) {
MimeBodyPart messageBodyPart2 = new MimeBodyPart();
String filename = filenames[i].split(";")[0];
String displayname = filenames[i].split(";")[1];
// 得到数据源
FileDataSource fds = new FileDataSource(filename);
// BodyPart添加附件本身
messageBodyPart2.setDataHandler(new DataHandler(fds));
// BodyPart添加附件文件名
messageBodyPart2.setFileName(MimeUtility
.encodeText(displayname));
multipart.addBodyPart(messageBodyPart2);
}
mimeMsg.setContent(multipart);
// 设置信件头的发送日期
mimeMsg.setSentDate(new Date());
mimeMsg.saveChanges();
// 发送邮件
transport.send(mimeMsg);
transport.close();
System.out.println("发送到成功!!!");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) throws Exception {
String title = "title";// 所发送邮件的标题
String from = "[email protected]";// 从那里发送
String sendTo[] = { "[email protected]" };// 发送到那里
// 邮件的文本内容,可以包含html标记则显示为html页面
String content = "test java send mail !!!!!!<br><a href=\"http://sjsky.iteye.com/\">My blog</a>";
// 所包含的附件,及附件的重新命名
String fileNames[] = { "d:\\test\\test.png;test.png" };
JavaMailSend test = new JavaMailSend();
try {
// MailSender mailsender = new MailSender();
test.sendmail(title, from, sendTo, content, fileNames,
"text/html;charset=gb2312");
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* Smtp认证
*/
class SmtpAuthenticator extends Authenticator {
String username = null;
String password = null;
/**
* SMTP身份验证
* @param username
* @param password
*/
public SmtpAuthenticator(String username, String password) {
super();
this.username = username;
this.password = password;
}
/**
* @return pass
*/
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(this.username, this.password);
}
}
}