最近学习了一下java mail 的使用
网上有很多资料,比较容易理解,也有一些简单的例子,但是封装的都不太理想,于是自己写了一个JavaMail的简单封装,一共两个类,可以实现自由的添加邮件标题、接收者、抄送、文本内容、图片内容、html内容和附件等基本功能。更复杂的封装比如验证地址、异常处理等由于并不是JavaMail的范畴,本例中没有实现,有兴趣的可以自己实现。
另外由于发送邮件使用的是
Transport.send(message);
这个静态方法,所以本例不适合批量发送邮件的需求,有需要的话可以修改相关代码,手动创建和关闭transport。下面是本例代码
mail.properties(其中***需改成自己的邮件账号和密码,本例中使用了163的smtp邮件服务,也可以使用其他,需修改相应的host和port)
#163 mail server
mail.transport.protocol=smtp
mail.smtp.host=smtp.163.com
mail.smtp.port=25
mail.smtp.from=***@163.com
mail.smtp.user=***@163.com
mail.smtp.password=***
mail.smtp.auth=true
mail.debug=true
AbstractMailSender
/**
* file name: AbstractMailSender.java
* Auther: allen
* Create Date: 2014年12月17日
* Description: Mail抽象类,用于加载配置文件和设置静态量
*/
package org.mail4j;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public abstract class AbstractMailSender {
/*
*静态量, properties 配置文件中对应的变量名
*/
private static final String PROTOCOL = "mail.transport.protocol";
private static final String HOST = "mail.smtp.host";
private static final String PORT = "mail.smtp.port";
private static final String FROM = "mail.smtp.from";
private static final String USERNAME = "mail.smtp.user";
private static final String PASSWORD = "mail.smtp.password";
private static final String VALIDATE = "mail.smtp.auth";
private static final String DEBUG = "mail.debug";
private static Properties configs = new Properties(); //properties 配置文件
private static Properties props = new Properties(); //创建 Session 实例时需要传递的基本参数
private static Authenticator authenticator; // 创建 Session 实例时需要传递的认证参数
private Session session;
protected Message message;
/**
* 初始化静态量
*/
static {
InputStream inputStream = AbstractMailSender.class
.getResourceAsStream("mail.properties");
try {
configs.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
}
}
props.put(PROTOCOL, configs.getProperty(PROTOCOL));
props.put(HOST, configs.getProperty(HOST));
props.put(PORT, configs.getProperty(PORT));
props.put(VALIDATE, configs.getProperty(VALIDATE));
props.put(DEBUG, configs.getProperty(DEBUG));
authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(configs.getProperty(USERNAME), configs.getProperty(PASSWORD));
}
};
}
/**
* 创建邮件即创建 java mail 的 session 和 message实例
*/
public void createMail() {
session = Session.getInstance(props, authenticator);
message = new MimeMessage(session);
try {
//设置邮件发送地址
message.setFrom(new InternetAddress(configs.getProperty(FROM)));
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 发送邮件
*/
abstract void sendMail();
}
SimpleMailSender
/**
* file name: SimpleMailSender.java
* Auther: allen
* Create Date: 2014年12月17日
* Description: Mail 实现类
*/
package org.mail4j;
import java.io.File;
import java.util.List;
import java.util.UUID;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
public class SimpleMailSender extends AbstractMailSender {
private Multipart multipart; //java mail 中用于存放不同部分邮件内容的容器
/**
* 构造函数,初始化 multipart 实例
*/
public SimpleMailSender() {
multipart = new MimeMultipart();
}
@Override
void sendMail() {
try {
//设置邮件内容
message.setContent(multipart);
//发送邮件
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 设置接收地址
* @param tos String 类型的 List
*/
public void setTo(List<String> tos) {
try {
Address[] to = new Address[tos.size()];
for (int i = 0; i < tos.size(); i++) {
to[i] = new InternetAddress(tos.get(i));
}
message.setRecipients(RecipientType.TO, to);
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 设置抄送地址
* @param ccs String 类型的 List
*/
public void setCc(List<String> ccs) {
try {
Address[] cc = new Address[ccs.size()];
for (int i = 0; i < ccs.size(); i++) {
cc[i] = new InternetAddress(ccs.get(i));
}
message.setRecipients(RecipientType.CC, cc);
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 设置邮件标题
* @param subject String
*/
public void setSubject(String subject) {
try {
message.setSubject(subject);
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 在邮件内容中增加文本
* @param content String
*/
public void addContent(String content) {
try {
BodyPart bodyPart = new MimeBodyPart();
bodyPart.setText(content);
multipart.addBodyPart(bodyPart);
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 在邮件内容中增加附件(邮件中添加需要在邮件中显示的图片时使用)
* @param attach File 附件
* @param header String Content-ID
*/
private void addAttach(File attach, String header) {
try {
BodyPart bodyPart = new MimeBodyPart();
DataSource dataSource = new FileDataSource(attach);
bodyPart.setDataHandler(new DataHandler(dataSource));
bodyPart.setFileName(attach.getName());
if(header != null){
bodyPart.setHeader("Content-ID", "<" + header + ">");
}
multipart.addBodyPart(bodyPart);
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 在邮件内容中增加附件(邮件中单独添加附件时使用)
* @param attach File 附件
*/
public void addAttach(File attach) {
addAttach(attach, null);
}
/**
* 在邮件中添加 html 代码
* @param html String
*/
public void addHtml(String html) {
try {
BodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent(html, "text/html;charset=utf8");
multipart.addBodyPart(bodyPart);
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 在邮件中添加可以显示的图片
* @param image File 图片
*/
public void addImage(File image){
try {
String header = UUID.randomUUID().toString();
String img = "<img src=\"cid:" + header + "\">";
addHtml(img);
addAttach(image, header);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Client
/**
* file name: Client.java
* Auther: allen
* Create Date: 2014年12月17日
* Description: 客户端测试类
*/
package org.mail4j;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Client {
public static void main(String[] args) {
SimpleMailSender ss = new SimpleMailSender();
List<String> tos = new ArrayList<String>();
tos.add("***@sina.com");
ss.createMail();
ss.setSubject("一封复杂的邮件");
ss.setTo(tos);
ss.addContent("测试一封复杂的邮件");
ss.addImage(new File("l.jpg"));
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(
new FileInputStream(new File("404.html")), "utf-8"));
String html = "";
String line = null;
while ((line = reader.readLine()) != null) {
html += line;
}
ss.addHtml(html);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ss.addAttach(new File("attach.txt"));
ss.sendMail();
}
}
完整的项目下载地址 http://download.csdn.net/detail/lyisray/8272833