JavaMail 是 java 的扩展类库包,利用其可以创建发送和接收电子邮件的应用。JavaMail 支持 SMTP、POP、IMAP 等协议。关于这些协议的内容,请参考相关的知识。毕竟是个网络满天飞的世界,google 和 baidu 都有最权威的答案。给出 3 个文件,实现了使用 SMTP 协议发送电子邮件及附件。
(1) Mail.java 文件。
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* Mail 类表示要发送的一封邮件。
* @author dingli
*/
public class Mail
{
private String subject = null;
private String from = null;
private List sendTo = null;
private List carbonCopy = null;
private List blindCarbonCopy = null;
private List attachment = null;
private String content = null;
private Date sendDate = null;
/**
* Mail 的默认构造方法。
*/
public Mail()
{
this.sendTo = new ArrayList();
this.carbonCopy = new ArrayList();
this.blindCarbonCopy = new ArrayList();
this.attachment = new ArrayList();
this.sendDate = new Date(System.currentTimeMillis());
}
/**
* 获取邮件附件所在本地路径列表。
* @return 邮件附件所在本地路径列表。
*/
public List getAttachment()
{
return attachment;
}
/**
* 设置邮件附件所在本地路径。
* @param path 邮件附件所在本地路径。
*/
public void setAttachment(String path)
{
this.attachment.add(path);
}
/**
* 获取邮件暗送人列表。
* @return 邮件暗送人列表。
*/
public List getBlindCarbonCopy()
{
return blindCarbonCopy;
}
/**
* 设置邮件暗送人列表。
* @param blindCarbonCopy 邮件暗送人列表。
*/
public void setBlindCarbonCopy(List blindCarbonCopy)
{
this.blindCarbonCopy = blindCarbonCopy;
}
/**
* 获取邮件抄送人列表。
* @return 邮件抄送人列表。
*/
public List getCarbonCopy()
{
return carbonCopy;
}
/**
* 设置邮件抄送人列表。
* @param carbonCopy 邮件抄送人列表。
*/
public void setCarbonCopy(List carbonCopy)
{
this.carbonCopy = carbonCopy;
}
/**
* 获取邮件收件人列表。
* @return 邮件收件人列表。
*/
public List getSendTo()
{
return sendTo;
}
/**
* 设置邮件收件人列表。
* @param sendTo 邮件收件人列表。
*/
public void setSendTo(List sendTo)
{
this.sendTo = sendTo;
}
/**
* 获取邮件内容。
* @return 邮件内容。
*/
public String getContent()
{
return content;
}
/**
* 设置邮件内容。
* @param content 邮件内容。
*/
public void setContent(String content)
{
this.content = content;
}
/**
* 获取邮件发件人。
* @return 邮件发件人。
*/
public String getFrom()
{
return from;
}
/**
* 设置邮件发件人。
* @param from 邮件发件人。
*/
public void setFrom(String from)
{
this.from = from;
}
/**
* 获取邮件发送日期。
* @return 邮件发送日期。
*/
public Date getSendDate()
{
return sendDate;
}
/**
* 设置邮件发送日期。
* @param sendDate 邮件发送日期。
*/
public void setSendDate(Date sendDate)
{
this.sendDate = sendDate;
}
/**
* 获取邮件主题。
* @return 邮件主题。
*/
public String getSubject()
{
return subject;
}
/**
* 设置邮件主题。
* @param subject 邮件主题。
*/
public void setSubject(String subject)
{
this.subject = subject;
}
}
(2) MailConfig.java 文件。
/**
* MailConfig 表示发送或接收邮件的配置信息。
* @author Dingli.
*/
public class MailConfig
{
private String protocol = null;
private String server = null;
private String user = null;
private String password = null;
private int port = 0;
private boolean debug;
/**
* MailConfig 的默认构造方法。
*/
public MailConfig()
{
this.protocol = "smtp";
this.port = 25;
this.debug = false;
}
/**
* 获取是否显示邮件操作的调试信息。
* @return 是否显示邮件操作的调试信息。
*/
public boolean isDebug()
{
return debug;
}
/**
* 设置是否显示邮件操作的调试信息。
* @param debug 是否显示邮件操作的调试信息。
*/
public void setDebug(boolean debug)
{
this.debug = debug;
}
/**
* 获取登录密码。
* @return 登录密码。
*/
public String getPassword()
{
return password;
}
/**
* 设置登录密码。
* @param password 登录密码。
*/
public void setPassword(String password)
{
this.password = password;
}
/**
* 获取登录用户名。
* @return 登录用户名。
*/
public String getUser()
{
return user;
}
/**
* 设置登录用户名。
* @param user 登录用户名。
*/
public void setUser(String user)
{
this.user = user;
}
/**
* 获取邮件服务器端口。
* @return 邮件服务器端口。
*/
public int getPort()
{
return port;
}
/**
* 设置邮件服务器端口。
* @param port 邮件服务器端口。
*/
public void setPort(int port)
{
this.port = port;
}
/**
* 获取发送或接收邮件的协议。
* @return 发送或接收邮件的协议。
*/
public String getProtocol()
{
return protocol;
}
/**
* 设置发送或接收邮件的协议。
* @param protocol 发送或接收邮件的协议。
*/
public void setProtocol(String protocol)
{
this.protocol = protocol;
}
/**
* 获取邮件服务器。
* @return 邮件服务器。
*/
public String getServer()
{
return server;
}
/**
* 设置邮件服务器。
* @param server 邮件服务器。
*/
public void setServer(String server)
{
this.server = server;
}
}
(3) MailSender.java 文件。
import java.util.List;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import sun.misc.BASE64Encoder;
/**
* 使用 MailSender 来发送邮件。
* @author Dingli.
*/
public class MailSender
{
//发送或接收邮件的配置信息。
private MailConfig mailConfig = null;
//待发送的邮件对象。
private Mail mail = null;
//邮件会话对象。
private Session session = null;
//邮件发送者对象。
private Transport transport = null;
//MIME 消息对象。
private MimeMessage mimeMessage = null;
//MimeMultipart 对象。
private MimeMultipart mimeMultipart = null;
/**
* MailSender 类的默认构造方法。
*/
public MailSender()
{
this.mimeMultipart = new MimeMultipart();
}
/**
* MailSender 类的构造方法。
* @param mailConfig MailConfig 对象。
*/
public MailSender(MailConfig mailConfig)
{
this();
this.setMailConfig(mailConfig);
}
/**
* 设置发送或接收邮件的配置信息。
* @param mailConfig 发送或接收邮件的配置信息。
*/
public void setMailConfig(MailConfig mailConfig)
{
//设置邮件发送配置对象。
this.mailConfig = mailConfig;
//构建属性对象。
Properties properties = new Properties();
//设置发送邮件的协议。
properties.put("mail.transport.protocol", this.getMailConfig().getProtocol());
//设置是否需要身份验证。
properties.put("mail." + this.getMailConfig().getProtocol() + ".auth", "true");
//是否显示调试信息。
properties.put("mail.debug", String.valueOf(this.getMailConfig().isDebug()));
//启动一个邮件会话。
this.session = Session.getInstance(properties);
}
/**
* 获取发送或接收邮件的配置信息。
* @return 发送或接收邮件的配置信息。
*/
public MailConfig getMailConfig()
{
return mailConfig;
}
/**
* 设置邮件对象。
* @param mail 邮件对象。
* @throws Exception Exception 异常。
*/
public void setMail(Mail mail) throws Exception
{
if(this.mailConfig != null)
{
//保存邮件对象。
this.mail = mail;
//构建 MIME 消息对象。
this.mimeMessage = new MimeMessage(this.session);
//设置发件人。
this.mimeMessage.setFrom(new InternetAddress(this.getMail().getFrom()));
//设置邮件主题。
this.mimeMessage.setSubject(this.getMail().getSubject());
//设置邮件发送时间。
this.mimeMessage.setSentDate(this.getMail().getSendDate());
//设置收件人。
this.setMailRecipients(this.mimeMessage, Message.RecipientType.TO, this.getMail().getSendTo());
//设置抄送人。
this.setMailRecipients(this.mimeMessage, Message.RecipientType.CC, this.getMail().getCarbonCopy());
//设置暗送人。
this.setMailRecipients(this.mimeMessage, Message.RecipientType.BCC, this.getMail().getBlindCarbonCopy());
//判断邮件是否有附件。
if(this.getMail().getAttachment().isEmpty())
{
//设置邮件文本内容。
this.mimeMessage.setText(this.getMail().getContent());
}
else
{
//设置邮件内容。
this.setMailBody(this.getMail());
//设置Multipart对象。
this.mimeMessage.setContent(this.mimeMultipart);
}
}
else
{
throw new Exception("You must set mail config first");
}
}
/**
* 获取邮件对象。
* @return 邮件对象。
*/
public Mail getMail()
{
return mail;
}
/**
* 发送邮件。
* @param mail 邮件对象。
* @throws Exception Exception 异常。
*/
public void send(Mail mail) throws Exception
{
this.setMail(mail);
this.connect();
this.send();
}
/**
* 连接到配置信息设置的邮件服务器。
* @throws Exception Exception 异常。
*/
public void connect() throws Exception
{
if(this.getMail() != null)
{
//构建发送者。
this.transport = this.session.getTransport();
//连接到邮件服务器。
this.transport.connect(this.getMailConfig().getServer(), this.getMailConfig().getPort(), this.getMailConfig().getUser(), this.getMailConfig().getPassword());
}
else
{
throw new Exception("No such mail to set");
}
}
/**
* 关闭与邮件服务器的连接。
* @throws Exception Exception 异常。
*/
public void close() throws Exception
{
//关闭邮件发送者对象。
if(this.transport != null && this.transport.isConnected())
{
this.transport.close();
}
//置空对象。
this.mailConfig = null;
this.mail = null;
this.session = null;
this.transport = null;
this.mimeMultipart = null;
this.mimeMessage = null;
}
/**
* 发送邮件。
* @throws Exception Exception 异常。
*/
public void send() throws Exception
{
if(this.transport != null && this.transport.isConnected())
{
//发送邮件给收件人。
if(this.mimeMessage.getRecipients(Message.RecipientType.TO) != null)
{
this.transport.sendMessage(this.mimeMessage, this.mimeMessage.getRecipients(Message.RecipientType.TO));
}
//发送邮件给抄送人。
if(this.mimeMessage.getRecipients(Message.RecipientType.CC) != null)
{
this.transport.sendMessage(this.mimeMessage, this.mimeMessage.getRecipients(Message.RecipientType.CC));
}
//发送邮件给暗送人。
if(this.mimeMessage.getRecipients(Message.RecipientType.BCC) != null)
{
this.transport.sendMessage(this.mimeMessage, this.mimeMessage.getRecipients(Message.RecipientType.BCC));
}
}
else
{
throw new Exception("No such connection");
}
}
/**
* 设置收信人。
* @param mimeMessage MIME 消息类型。
* @param recipientType 收信人类型。
* @param recipients 收信人列表。
* @throws Exception Exception 异常。
*/
private void setMailRecipients(MimeMessage mimeMessage, RecipientType recipientType, List recipients) throws Exception
{
//构建收信人地址数组。
InternetAddress[] internetAddresses = new InternetAddress[recipients.size()];
//遍历所有收信人。
for(int i = 0; i < recipients.size(); i++)
{
//构建收信人地址对象。
internetAddresses[i] = new InternetAddress(recipients.get(i).toString());
}
//设置收信人。
mimeMessage.setRecipients(recipientType, internetAddresses);
}
/**
* 设置邮件体。包括邮件内容与附件。
* @param mail Mail 对象。
* @throws Exception Exception 异常。
*/
private void setMailBody(Mail mail) throws Exception
{
//移除 MimeMultipart 对象中的 MimeBodyPart 对象。
if(this.mimeMultipart != null)
{
//清空 MimeMultipart 对象。
for(int i = 0; i < this.mimeMultipart.getCount(); i++)
{
this.mimeMultipart.removeBodyPart(i);
}
}
//base64编码器。
BASE64Encoder base64Encoder = new BASE64Encoder();
//构建邮件文本内容对象。
MimeBodyPart textBodyPart = new MimeBodyPart();
//设置邮件文本内容。
textBodyPart.setText(mail.getContent());
//添加邮件文本内容。
this.mimeMultipart.addBodyPart(textBodyPart);
//遍历所有附件本地路径。
for(int i = 0; i < mail.getAttachment().size(); i++)
{
//邮件附件本地路径。
String attachmentPath = mail.getAttachment().get(i).toString();
//构建邮件附件对象。
MimeBodyPart attachmentBodyPart = new MimeBodyPart();
//用文件数据源对象构建一个数据句柄对象并设置到邮件附件对象。
attachmentBodyPart.setDataHandler(new DataHandler(new FileDataSource(attachmentPath)));
//设置邮件附件对象的名字。
attachmentBodyPart.setFileName("=?GBK?B?" + base64Encoder.encode(attachmentPath.substring(attachmentPath.replace('\\', '/').lastIndexOf('/') + 1).getBytes()) + "?=");
//添加邮件附件。
this.mimeMultipart.addBodyPart(attachmentBodyPart);
}
}
}
用一个 main() 方法来简单表明如何使用。
public class MainClass
{
public static void main(String[] args)
{
//邮件发送者。
MailSender mailSender = new MailSender();
try
{
//SMTP 配置。
MailConfig mailConfig = new MailConfig();
//设置登录的邮件服务器。
mailConfig.setServer("smtp.126.com");
//设置登录用户名。
mailConfig.setUser("dingli717");
//设置登录密码。
mailConfig.setPassword("******");
//一封电子邮件.
Mail mail = new Mail();
//发件人。
mail.setFrom("[email protected]");
//收件人,可以添加多个。
mail.getSendTo().add("[email protected]");
//邮件主题。
mail.setSubject("Java 你好");
//邮件内容。
mail.setContent("邮件发送测试");
//本地附件路径,可以添加多个附件。
mail.setAttachment("E:/testExcel.xls");
//设置邮件配置。
mailSender.setMailConfig(mailConfig);
//设置要发送的邮件。
mailSender.setMail(mail);
//连接邮件服务器。
mailSender.connect();
//发送邮件。
mailSender.send();
//邮件成功发送。
System.out.println("邮件发送成功!");
}
catch(Exception ex)
{
ex.printStackTrace();
}
finally
{
try
{
mailSender.close();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
}
Mail 类表示一封电子邮件,MailConfig 类表示发送或接收电子邮件的配置信息,而 MailSender 类用来处理邮件的具体发送。