工作中会经常用到java的邮件发送功能,下面是个小demo
jdk1.6以上需要mail.jar的jar包,请注意一下
/* 配置文件内容
* mail.smtp.host=smtp.qq.com
* mail.smtp.port=587
* mail.debug=true
* mail.smtp.auth=true
* mail.user=qq
* mail.password=shouquanma
*/
//配置文件位置
String filePath = Test4.class.getClassLoader().getSystemResource("")+"/mail.properties";
filePath=filePath.substring(5);
InputStream ips=new FileInputStream(new File(filePath));
Properties props = new Properties();
props.load(ips);
ips.close();
//邮件的host,用户名,以及授权码
String host=props.getProperty("mail.stmp.host");
final String user=props.getProperty("mail.user");
final String password=props.getProperty("mail.password");
//提供权限的类
Authenticator au=new Authenticator(){
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user,password);
}
};
//根据配置文件和权限类获取一个会话
Session session = Session.getInstance(props, au);
//通过会话新建一个邮件
MimeMessage message=new MimeMessage(session);
//创建mixed模式的文件,这种模式可以带有附件,当然也可以不带。另外还有related模式的,不过还是推荐这种
Multipart mixed=new MimeMultipart("mixed");
/*下面说一下BodyPart 和 Multipart之间的关系(有不足的地方欢迎补充交流)
* Multipart 是message的Content(内容)
* BodyPart可以是附件,可以是带有链接的文件等等。而且,一个Multipart可以包含多个BodyPart,最后用addBodyPart方法组合一下就可以了
*/
BodyPart bp=new MimeBodyPart();
//用datasource 和datahandler去处理附件,附件只需要提供一个地址即可,名字可以自己设置
//另外,如果需要添加多个附件,可以简历多个BodyPart
DataSource ds=new FileDataSource(filePath);
DataHandler dh=new DataHandler(ds);
bp.setDataHandler(dh);
bp.setFileName("mail.properties");
mixed.addBodyPart(bp);
//这里设置的是邮件的具体内容,类似于response中设置header
BodyPart bp2=new MimeBodyPart();
bp2.setContent("<a href='http://www.soso.com'>搜搜</a>", "text/html;charset=utf-8");
mixed.addBodyPart(bp2);
//全部组合完成后,设置主题,发送方,收件方,以及将内容设定好,保存一下
message.setSubject("这是一封测试邮件");
message.setFrom(new InternetAddress("send@qq.com"));
message.setRecipient(RecipientType.TO, new InternetAddress("recipient@qq.com"));
message.setContent(mixed);
message.saveChanges();
//通过会话获取传输类,然后建立连接,发送邮件,关掉连接。和socket很类似
Transport transport=session.getTransport("smtp");
transport.connect(host, user, password);
transport.send(message);
transport.close();