最近做项目用到了javamail,特此讲一下实现流程和自己在做项目的时候遇到的一些问题.
1.准备条件:在开发javamail的时候你首先需要mail包,javaee.jar里面已经包含了mail.jar包。此包自行上网下载,网上很多。
2.基本介绍:
我的理解是javamail其实也是借助其他邮件平台来进行收发邮件的(起初我以为javamail是可以自定义邮件密码的)。
-
SMTP:简单邮件传输协议,用于发送电子邮件的传输协议;
-
POP3:邮局协议,用于接收电子邮件的标准协议;
-
IMAP:互联网消息访问协议,是POP3的替代协议。
(这三种协议都有对应SSL加密传输的协议,分别是SMTPS,POP3S和IMAP3)。
-
MIME:多用途因特网邮件扩展别准,它不是邮件传输消息,但对传输内容的消息、附件及其他的内容定义了格式。
开发人员使用JavaMail编写邮件程序时,无需考虑底层的通信细节(Socket),JavaMail也提供了能够创建出各种复杂MIME格式的邮件内容的API。使用JavaMail,我们可以实现类似OutLook、FoxMail的软件。虽然JavaMail(仅支持JDK4及以上)也是Java的API之一,但是却没有直接加入到JDK中,所以我们需要另行下载。另外,JavaMail依赖JAF(JavaBeans Activation Framework)来处理不是纯文本的邮件内容(如MIME多用途互联网邮件扩展、URL页面和文件附件等内容),JAF在Java6之后已经合并到JDK中,而JDK5之前需要另外下载JAF的类库。
javax.mail.Session:上下文环境信息,如服务器的主机名、端口号、协议名称等
javax.mail.Message:邮件模型,发送邮件和接收邮件的媒介,封装了邮件的信息,如发件人、收件人、邮件标题、邮件内容等
javax.mail.Transport:连接邮件SMTP服务器,发送邮件
javax.mail.Store:连接邮件POP3、IMAP服务器,收取邮件
3.进入主题看如何发送邮件吧。
//发送邮件
public boolean sendEventMail() throws AddressException, MessagingException{
//创建属性对象
Properties props = new Properties();
//指定SMTP服务�?
props.put("mail.smtp.host", SMTPHost);
props.put("mail.smtp.port",String.valueOf(25));
props.put("mail.smtp.localhost","localhost");
//指定是否需要SMTP验证
props.put("mail.smtp.auth", "true");
//创建授权验证对象
SmtpAuth auth = new SmtpAuth();
auth.setAccount(user,password);
//创建Session对象
Session mailSession = Session.getDefaultInstance(props,auth);
mailSession.setDebug(true);
//创建Message对象
Message message=new MimeMessage(mailSession);
//指定发件人邮箱
message.setFrom(new InternetAddress(from));
//群发邮件的实现
final int num=recipients.length;
InternetAddress[] addresses = new InternetAddress[num];
for(int i=0;i<num;i++){
addresses[i] = new InternetAddress(recipients[i]);
}
//指定收件人邮箱
if(!"".equals(to)&&to!=null){
message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
}else if(recipientsArr.length!=0){
final int recipientsNum=recipientsArr.length;
InternetAddress[] addressors = new InternetAddress[recipientsNum];
for(int i=0;i<recipientsNum;i++){
addressors[i] = new InternetAddress(recipientsArr[i].trim());
}
message.setRecipients(Message.RecipientType.TO,addressors);
}
message.setRecipients(Message.RecipientType.CC,addresses);
//指定邮件主题
message.setSubject(subject);
//指定邮件内容
message.setContent(content,"text/html;charset=utf-8");
//指定邮件发送日期
message.setSentDate(new Date());
//指定邮件优先级1:紧急3:普通5:缓慢
//message.setHeader("X-Priority","3");
//message.saveChanges();
//创建Transport对象
Transport transport = mailSession.getTransport("smtp");
//连接SMTP服务器
transport.connect(SMTPHost, user, password);
//发送邮件
transport.sendMessage(message, message.getAllRecipients());
transport.close();
return true;
}
//定义SMTP授权验证 user password 自己在目标服务器的邮箱帐号和密码//
public static class SmtpAuth extends Authenticator{
String user,password;
//设置帐号信息
void setAccount(String user,String password){
this.user = user;
this.password = password;
}
//取得PasswordAuthentication对象
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(user,password);
}
}
/**
* 获取邮件内容并发送邮件
*/
public void sendMail() {
HttpServletRequest request = ServletActionContext.getRequest();
try {
request.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
// 1.收件人,抄送人,邮件主题,邮件内容,发件人邮箱 发件人密码
SendMailUtil sendMailUtil = new SendMailUtil();
sendMailUtil.setSMTPHost("smtp.evsny.com");
sendMailUtil.setUser(addressor);
sendMailUtil.setPassword(addressorPassword);
sendMailUtil.setFrom(addressor);
/* sendMailUtil.setTo(recipients); */
// 当是单个收件人的时候
if (recipients != null && !("").equals(recipients)) {
String[] recipientsArr = recipients.toString().trim().split(",");
if (recipientsArr.length == 1) {
sendMailUtil.setTo(recipients);
} else if (recipientsArr.length > 1) {
// 当是多个收件人的时候
for (int i = 0; i < recipientsArr.length; i++) {
recipientsArr[i] = '"' + recipientsArr[i] + '"';
}
sendMailUtil.setRecipientsArr(recipientsArr);
}
}
copyToMan = copyToMan.trim();
if (copyToMan != null && !("").equals(copyToMan)) {
/* String copyToMan1 = (('"'+copyToMan+'"')); */
String[] copyToManArr = copyToMan.split(",");
String[] mailManArr = new String[1];
mailManArr[0] = "";
int copyToManLength = copyToManArr.length;
for (int i = 0; i < copyToManLength; i++) {
copyToManArr[i] = ('"' + copyToManArr[i] + '"');
}
sendMailUtil.setCC(copyToManArr);
}
sendMailUtil.setSubject('"' + mailTheme + '"');
sendMailUtil.setContent('"' + mailContent + '"');
try {
sendMailUtil.sendEventMail();
} catch (AddressException e) {
e.printStackTrace();
// 邮箱帐号或密码错误
reponseViewInfo("addressError");
} catch (MessagingException e) {
e.printStackTrace();
// 发件人或抄送人错误
reponseViewInfo("messageError");
}
// 发送成功
reponseViewInfo("sendMessageSuccess");
}
值得提醒的是:1.上面的代码并不能直接拷贝使用,因为邮件内容,邮件地址,抄送人地址收件人地址都没有,需要大家自己去填写(上面的有很多只是属性而已)。
2.讲一下如果有多个收件人和抄送人的话上面代码也是满足的,多个地址必须以数组形式存在,比如 mailArr["2444244@qq.com","2242144@qq.com"],但是需要注意的是在编写java程序的时候数组元素一定要看起来是有两个双引号在外面才满足
(""24442444@qq.com""),这点是为什么我也没有理解到,在我做项目的时候也让我费了很大的劲。
3.以上代码并没有解决部分地址不存在导致全部邮件发送不成功的问题。
4.以上代码有一个问题是在处理异常的时候只能抓取两个异常,导致对异常的处理有限制,不能全面反应具体的错误。
5.以上代码对空字符串都做了处理。
6.抄送人是可以为空的。
7.代码不能直接拷贝使用,给大家带来的麻烦请谅解。希望大家花点时间看,并且把值补全,有什么不对的地方还需大家指教,谢谢。