JavaMail(1)——使用SMTP协议发送简单邮件
关键技术:
javax.mail.Session:定义了一个基本邮件回话,是JavaMail API最高层入口类。所有其他类都是经由这个Session才得以生效。Session对象用java.util.Properties对象获取信息,如邮件服务器、用户名、密码及整个应用程序中共享的其他信息。
java.mail.Message:存储邮件的消息内容,因为它是抽象类,必须用一个子类,最常用的子类是javax.mail.internet.MimeMessage,它支持MIME格式的邮件,MIME是多用途Internet邮件扩充协议,扩充基本的面向文本的Internet邮件系统,可以再消息中包含二进制附件。
javax.mail.Address:用于确定邮件的地址。Address是个抽象类,一般使用javax.mail.internet.InternetAddress类。
javax.mail.Authenticator:JavaMail API可以利用Authenticator通过用户名和密码访问邮件服务器。Authenticator是抽象类,需要先定义它的子类,并重写它的getPasswordAuthentication方法,在方法中返回PasswordAuthentication实例。子类对象创建后,需要向Sesstion注册Authenticator。在需要身份认证的时候,Session就会通知Authenticator。
javax.mail.Transport:调用Transport的send静态方法可以发送邮件,参数为一个Message对象。?
import?java.util.Properties;
/**
?*?发送邮件需要使用的基本信息
?*/
public?class?MailSenderInfo?{
????//?发送邮件的服务器的IP和端口
????private?String?mailServerHost;
????private?String?mailServerPort?=?"25";
????//?邮件发送者的地址
????private?String?fromAddress;
????//?邮件接收者的地址
????private?String?toAddress;
????//?登陆邮件发送服务器的用户名和密码
????private?String?userName;
????private?String?password;
????//?是否需要身份验证
????private?boolean?validate?=?true;
????
????//?邮件主题
????private?String?subject;
????//?邮件的文本内容
????private?String?content;
????
????//?邮件附件的文件名
????private?String[]?attachFileNames;
????
????
????/**
?????*?获得邮件会话属性
?????*/
????public?Properties?getProperties(){
????????Properties?p?=?new?Properties();
????????p.put("mail.smtp.host",?this.mailServerHost);
????????p.put("mail.smtp.port",?this.mailServerPort);
????????p.put("mail.smtp.auth",?validate???"true"?:?"false");
????????return?p;
????}
????
????public?String?getMailServerHost()?{
????????return?mailServerHost;
????}
????public?void?setMailServerHost(String?mailServerHost)?{
????????this.mailServerHost?=?mailServerHost;
????}
????public?String?getMailServerPort()?{
????????return?mailServerPort;
????}
????public?void?setMailServerPort(String?mailServerPort)?{
????????this.mailServerPort?=?mailServerPort;
????}
????public?boolean?isValidate()?{
????????return?validate;
????}
????public?void?setValidate(boolean?validate)?{
????????this.validate?=?validate;
????}
????public?String[]?getAttachFileNames()?{
????????return?attachFileNames;
????}
????public?void?setAttachFileNames(String[]?fileNames)?{
????????this.attachFileNames?=?fileNames;
????}
????public?String?getFromAddress()?{
????????return?fromAddress;
????}
????public?void?setFromAddress(String?fromAddress)?{
????????this.fromAddress?=?fromAddress;
????}
????public?String?getPassword()?{
????????return?password;
????}
????public?void?setPassword(String?password)?{
????????this.password?=?password;
????}
????public?String?getToAddress()?{
????????return?toAddress;
????}
????public?void?setToAddress(String?toAddress)?{
????????this.toAddress?=?toAddress;
????}
????public?String?getUserName()?{
????????return?userName;
????}
????public?void?setUserName(String?userName)?{
????????this.userName?=?userName;
????}
????public?String?getSubject()?{
????????return?subject;
????}
????public?void?setSubject(String?subject)?{
????????this.subject?=?subject;
????}
????public?String?getContent()?{
????????return?content;
????}
????public?void?setContent(String?textContent)?{
????????this.content?=?textContent;
????}?
????
}
import?javax.mail.Authenticator;
import?javax.mail.PasswordAuthentication;
/**
?*?邮件身份认证器,在发送邮件时使用
?*/
public?class?MyAuthenticator?extends?Authenticator{
????//?登陆发送邮件服务器的用户名
????private?String?userName;
????//?登陆发送邮件服务器的密码
????private?String?password;
????public?MyAuthenticator(String?userName,?String?password){
????????this.userName?=?userName;
????????this.password?=?password;
????}
????/**
?????*?覆盖父类的该方法,获得密码认证器
?????*/
????protected?PasswordAuthentication?getPasswordAuthentication()?{
????????return?new?PasswordAuthentication(userName,?password);
????}
????
????public?String?getPassword()?{
????????return?password;
????}
????public?void?setPassword(String?password)?{
????????this.password?=?password;
????}
????public?String?getUserName()?{
????????return?userName;
????}
????public?void?setUserName(String?userName)?{
????????this.userName?=?userName;
????}
}
import?java.util.Date;
import?javax.mail.Address;
import?javax.mail.BodyPart;
import?javax.mail.Message;
import?javax.mail.MessagingException;
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;
/**
?*?简单邮件(不带附件的邮件)发送器
?*/
public?class?SimpleMailSender?{
????/**
?????*?以文本格式发送邮件
?????*?@param?mailInfo????待发送的邮件的信息
?????*/
????public?static?boolean?sendTextMail(MailSenderInfo?mailInfo)?{
????????//?判断是否需要身份认证
????????MyAuthenticator?authenticator?=?null;
????????if?(mailInfo.isValidate())?{
????????????//?如果需要身份认证,则创建一个密码验证器
????????????authenticator?=?new?MyAuthenticator(mailInfo.getUserName(),
????????????????????mailInfo.getPassword());
????????}
????????//?根据邮件会话属性和密码验证器构造一个发送邮件的session
????????Session?sendMailSession?=?Session.getInstance(mailInfo
????????????????.getProperties(),?authenticator);
????????try?{
????????????//?根据session创建一个邮件消息
????????????Message?mailMessage?=?new?MimeMessage(sendMailSession);
????????????//?创建邮件发送者地址
????????????Address?from?=?new?InternetAddress(mailInfo.getFromAddress());
????????????//?设置邮件消息的发送者
????????????mailMessage.setFrom(from);
????????????//?创建邮件的接收者地址,并设置到邮件消息中
????????????Address?to?=?new?InternetAddress(mailInfo.getToAddress());
????????????mailMessage.setRecipient(Message.RecipientType.TO,to);
????????????//?设置邮件消息的主题
????????????mailMessage.setSubject(mailInfo.getSubject());
????????????//?设置邮件消息发送的时间
????????????mailMessage.setSentDate(new?Date());
????????????//?设置邮件消息的主要内容
????????????String?mailContent?=?mailInfo.getContent();
????????????mailMessage.setText(mailContent);
????????????
????????????//?发送邮件
????????????Transport.send(mailMessage);
????????????return?true;
????????}?catch?(MessagingException?ex)?{
????????????ex.printStackTrace();
????????}
????????return?false;
????}
????/**
?????*?以HTML格式发送邮件
?????*?@param?mailInfo????待发送的邮件信息
?????*/
????public?static?boolean?sendHtmlMail(MailSenderInfo?mailInfo){
????????//?判断是否需要身份认证
????????MyAuthenticator?authenticator?=?null;
????????if?(mailInfo.isValidate())?{
????????????//?如果需要身份认证,则创建一个密码验证器
????????????authenticator?=?new?MyAuthenticator(mailInfo.getUserName(),
????????????????????mailInfo.getPassword());
????????}
????????//?根据邮件会话属性和密码验证器构造一个发送邮件的session
????????Session?sendMailSession?=?Session.getInstance(mailInfo
????????????????.getProperties(),?authenticator);
????????try?{
????????????//?根据session创建一个邮件消息
????????????Message?mailMessage?=?new?MimeMessage(sendMailSession);
????????????//?创建邮件发送者地址
????????????Address?from?=?new?InternetAddress(mailInfo.getFromAddress());
????????????//?设置邮件消息的发送者
????????????mailMessage.setFrom(from);
????????????//?创建邮件的接收者地址,并设置到邮件消息中
????????????Address?to?=?new?InternetAddress(mailInfo.getToAddress());
????????????//?Message.RecipientType.TO属性表示接收者的类型为TO
????????????mailMessage.setRecipient(Message.RecipientType.TO,to);
????????????//?设置邮件消息的主题
????????????mailMessage.setSubject(mailInfo.getSubject());
????????????//?设置邮件消息发送的时间
????????????mailMessage.setSentDate(new?Date());
????????????
????????????//?MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
????????????Multipart?mainPart?=?new?MimeMultipart();
????????????//?创建一个包含HTML内容的MimeBodyPart
????????????BodyPart?html?=?new?MimeBodyPart();
????????????//?设置HTML内容
????????????html.setContent(mailInfo.getContent(),?"text/html;?charset=GBK");
????????????mainPart.addBodyPart(html);
????????????//?将MiniMultipart对象设置为邮件内容
????????????mailMessage.setContent(mainPart);
????????????//?发送邮件
????????????Transport.send(mailMessage);
????????????return?true;
????????}?catch?(MessagingException?ex)?{
????????????ex.printStackTrace();
????????}
????????return?false;
????}
????
????public?static?void?main(String[]?args)?{
????????//?创建邮件信息
????????MailSenderInfo?mailInfo?=?new?MailSenderInfo();
????????mailInfo.setMailServerHost("smtp.sina.com.cn");
????????mailInfo.setMailServerPort("25");
????????mailInfo.setValidate(true);
????????mailInfo.setUserName("***");
????????mailInfo.setPassword("***");
????????mailInfo.setFromAddress("***@sina.com");
????????mailInfo.setToAddress("***@163.com");
????????mailInfo.setSubject("MyMail测试");
????????mailInfo.setContent("我的邮件测试/n/rMy?test?mail/n/r");
????????//?以文本格式发送邮件
????????SimpleMailSender.sendTextMail(mailInfo);
????????//?以HTML格式发送邮件
????????SimpleMailSender.sendHtmlMail(mailInfo);
????}
}
?