java实现邮箱发送邮件功能
邮箱验证是一个很常见的功能了,最近项目用到就研究了一下,java也有专门的jar来处理邮件发送等服务,这里只是简单的实现一下发送邮件的功能,具体jar包我也会贴出来,方便大家下载。闲话少说咱们直奔主题:
第一步:封装发件人账号密码
package com.wq.mail.util;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
/**
*
* @author wq
*
*/
public class MailAuthenticator extends Authenticator{
public static String USERNAME = "";
public static String PASSWORD = "";
public MailAuthenticator() {
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(USERNAME, PASSWORD);
}
}
第二步:提供发送操作类、测试
package com.wq.mail.mailutil;
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import com.evaluate.mail.util.MailAuthenticator;
/**
* 邮件发送操作类
*
* @author wq
*
*/
public class MailOperation {
/**
* 发送邮件
* @param user 发件人邮箱
* @param password 授权码(注意不是邮箱登录密码)
* @param host
* @param from 发件人
* @param to 接收者邮箱
* @param subject 邮件主题
* @param content 邮件内容
* @return success 发送成功 failure 发送失败
* @throws Exception
*/
public String sendMail(String user, String password, String host,
String from, String to, String subject, String content)
throws Exception {
if (to != null){
Properties props = System.getProperties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
MailAuthenticator auth = new MailAuthenticator();
MailAuthenticator.USERNAME = user;
MailAuthenticator.PASSWORD = password;
Session session = Session.getInstance(props, auth);
session.setDebug(true);
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
if (!to.trim().equals(""))
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to.trim()));
message.setSubject(subject);
MimeBodyPart mbp1 = new MimeBodyPart(); // 正文
mbp1.setContent(content, "text/html;charset=utf-8");
Multipart mp = new MimeMultipart(); // 整个邮件:正文+附件
mp.addBodyPart(mbp1);
// mp.addBodyPart(mbp2);
message.setContent(mp);
message.setSentDate(new Date());
message.saveChanges();
Transport trans = session.getTransport("smtp");
trans.send(message);
System.out.println(message.toString());
} catch (Exception e){
e.printStackTrace();
return "failure";
}
return "success";
}else{
return "failure";
}
}
public static void main(String[] args) {
MailOperation operation = new MailOperation();
String user = ***163.com";
String password = "***";
String host = "smtp.163.com";
String from = "***@163.com";
String to = "***@qq.com";// 收件人
String subject = "测试";
//邮件内容
String str = "我是个程序员,一天我坐在路边一边喝水一边苦苦检查程序。 这时一个乞丐在我边上坐下了,开始要饭,我觉得可怜,就给了他1块钱。 然后接着调试程序。他可能生意不好,就无聊的看看我在干什么,然后过了一会,他缓缓地指着我的屏幕说,这里少了个分号";
try {
String res = operation.sendMail(user, password, host, from, to,
subject, str.toString());
System.out.println(res);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
有几个地方需要注意一下:
1、发件人的密码不是你登录邮箱的密码,而是设置POP3/SMTP/IMAP是获取的授权码,如下图(截取自163邮箱)
2、如果使用QQ邮箱作为发件邮箱的话,需要专门配置SSL证书等等信息,这是因为QQ邮箱的要求(当然省事的做法就使用企业邮箱或者其他邮箱提供商比如163);
3、如果使用了其他邮箱服务商提供的邮箱来作为发件人,那么在编辑邮件内容的时候需要注意一些敏感词的问题,如果你的邮件中含有敏感内容的话邮箱服务商将不会为你发送该邮件;
4、如果是在main方法中调用的话是可以的,但是如果要部署到web容器(比如tomcat)中的话,则需要引入一个jar包;
5、经测试,邮件能够成功发送,但失败次数较多,失败邮件皆被判定为非法打回,具体原因仍在研究。
参考资料:
jar包下载:
到oracle官网去下载相应的jar包,地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html#javamail-1.4.5-oth-JPR