JavaMail

几个概念:
smtp :简单邮件发送协议,负责往外网传送邮件的
pop3:邮局协议,负责用户从代理服务器下载邮件的(保存一段时间邮件,过期删除)
Imap:互联网信息访问协议,pop3的升级版

基本流程:
{
1 邮件的基本属性:服务器主机、端口(默认25)、发送和接收地址、发送邮箱的账号和密码、验证器、邮件的主题 内容  添加附件
  Properties 只需要主机、端口号、和验证器参数
  Authenticator 验证器需要 发送邮箱的地址和密码
2 配置邮件发送环境(Session)
  Session sendMailSession = Session.getDefaultInstance(Properties,Authenticator);
3 配置完邮件的发送环境后,便可以创建邮件发送消息
  Message mailMessage = new MimeMessage(sendMailSession); 参数为session
  在消息中可以设置外出地址、接收地址(可多个)、邮件的主题 内容  添加附件
4  所有的设置完成后--发送邮件
  Transport.send(mailMessage);
}

发送过程:

一:构建邮件发送类

public class MailInfo {
//主机、 端口
private String mailServerHost ;
private String mailServerPort;

//发送、接收地址
private String fromAddress;
private String toAddress;//单个发送人
private String[] toAddresses;//多个发送人
private String[] toCSAdd;//抄送人地址

//登录邮箱发送的账号、密码
private String userName;
private String passWord;

//显示名称
private String displayName;

//是否需要验证
private boolean validate = false;

//邮件主题、内容、文件名
private String subject;
private String content;
private String[] attachFileName;

public Properties getProperties(){
Properties p = new Properties();
p.put("mail.smtp.host", mailServerHost);
p.put("mail.stmp.port", mailServerPort);
p.put("mail.smtp.auth", validate?"true":"false");
return p;
}

...get and set method
}

二:构建发送器

public class SimpleMailSender {
public boolean sendTextMail(MailInfo mailInfo){

java.util.Properties props = mailInfo.getProperties();
MyAuthenticator myauthenticator = null;

//是否需要smtp身份验证
if(mailInfo.isValidate()){
myauthenticator = new MyAuthenticator(mailInfo.getUserName(),mailInfo.getPassWord());
}else{
myauthenticator = new MyAuthenticator(mailInfo.getUserName(),null);
}



//根据邮件属性和smtp身份验证 构造一个发送邮件的Session
Session sendMailSession = Session.getDefaultInstance(props,myauthenticator);

try{
//根据Session 创建邮件消息
Message mailMessage = new MimeMessage(sendMailSession);

//创建邮件发送者的地址,并设置到mailMessage中
Address from = new InternetAddress(mailInfo.getFromAddress(),mailInfo.getDisplayName());//可以只跟一个参数邮件发送者地址
mailMessage.setFrom(from);

//创建邮件的接收者地址,并设置到mailMessage中
/**
* 设置单个收件人
* Address to = new InternetAddress(mailInfo.getToAddress());
* mailMessage.setRecipient(Message.RecipientType.TO, to);
*
*/
//设置多个收件人
String[] toAddresses = mailInfo.getToAddresses();
InternetAddress[] tos = new InternetAddress[toAddresses.length];
if(toAddresses != null){
for(int i = 0;i < toAddresses.length; i++){
tos[i] = new InternetAddress(toAddresses[i]);
}
}
mailMessage.setRecipients(Message.RecipientType.TO, tos);

//设置抄送人员
String[] toCSString = mailInfo.getToCSAdd();
if(toCSString != null){
InternetAddress[] toCSs = new InternetAddress[toCSString.length];
if(toCSs !=null){
for(int i = 0 ;i < toCSString.length; i++){
toCSs[i] = new InternetAddress(toCSString[i]);
}
}
mailMessage.setRecipients(Message.RecipientType.CC,toCSs );
}



//设置邮件消息的主题
mailMessage.setSubject(mailInfo.getSubject());

//设置邮件消息的发送时间 
mailMessage.setSentDate(new Date());

/**
* 设置邮件消息的主要内容
* 单纯设置文本邮件的内容是文本格式
* mailMessage.setText(mailInfo.getContent());
*/

//设置带附件的发送邮件
MimeMultipart mp = new MimeMultipart();//可存放多个BodyPart对象
MimeBodyPart mbp = new MimeBodyPart();//新建一个BodyPart 对象
mbp.setContent(mailInfo.getContent().toString(), "text/html;charset=utf-8");//设置该BodyPart内容格式和编码
mp.addBodyPart(mbp); //添加到mp
String fileName = "";
for(int i = 0; i < mailInfo.getAttachFileName().length; i++){
MimeBodyPart mbpAttch = new MimeBodyPart(); //新建包含附件的BodyPart对象
fileName = "d:\\attch\\" + mailInfo.getAttachFileName()[i];
System.out.println(fileName);
FileDataSource fds = new FileDataSource(fileName);//得到数据源
mbpAttch.setDataHandler(new DataHandler(fds));//得到附件本身并至入BodyPart
mbpAttch.setFileName(fds.getName());//得到文件名同样至入BodyPart
//mbpAttch.setFileName(MimeUtility.encodeText(fds.getName()));//得到文件名同样至入BodyPart,附件文件名中文
mp.addBodyPart(mbpAttch);//添加附件
}
mailMessage.setContent(mp);//邮件包含内容是multi 类型

mailMessage.saveChanges();

//发送邮件
Transport.send(mailMessage);
return true;
}catch(Exception e){
e.printStackTrace();
}

return false;
}
}

三:邮件发送

MailInfo mailInfo = new MailInfo();

mailInfo.setMailServerHost("smtp.139.com");
mailInfo.setMailServerPort("25");
mailInfo.setValidate(true);
mailInfo.setUserName(userName);
mailInfo.setPassWord(password);
mailInfo.setFromAddress(userName);
mailInfo.setDisplayName("邮件显示名称");
//单个接收人 @parm=String mailInfo.setToAddress(toEmailString);
//toEmails  toCStrings 均为字符串类型数组
mailInfo.setToAddresses(toEmails);//多个接收人
mailInfo.setToCSAdd(toCStrings);//设置抄送人
mailInfo.setSubject("测试");
mailInfo.setContent(area);

//设置附件
String fileString = "D:\\attch";
File file = new File(fileString);
String[] attachFileName = file.list();
mailInfo.setAttachFileName(attachFileName);

SimpleMailSender sms = new SimpleMailSender();
sms.sendTextMail(mailInfo);

四:在构造发送器时,邮件服务器通常需要认证,添加认证类

public class MyAuthenticator extends Authenticator {
String userName = null;
String password = null;

public MyAuthenticator(){

}

public MyAuthenticator(String userName,String password){
this.userName = userName;
this.password = password;
}

protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(userName, password);
}
}

 

posted @ 2013-04-22 15:19  roscee  阅读(260)  评论(0编辑  收藏  举报