Java Mail发送邮件
简介
Java程序发送邮件是很频繁的操作,这两天整理一下,分两篇,第一篇介绍Java Mail发送一个简单的邮件需要哪些步骤以及准备工作。第二篇整理一下Java Mail发送带有照片、附件的邮件,然后封装一下作为一个小module在以后使用的地方使用。写完之后module会放到github上。
准备条件
- 一个开通了smtp协议(关于smtp协议的内容可以参考一下维基百科)的邮箱帐号,这里以163邮箱为例(这里同样要注意一下,新申请的163邮箱默认是不开通smtp协议的,要手动开启,后面具体步骤会有)。
- 下载Java Mail APIjar包,我项目中用的是maven
具体步骤
开通smtp协议的邮箱
申请163之后可以在下图中看到,新申请的邮箱默认是没有开通的,可以按照提示一步一步开启。
下载Java Mail
这里使用的是maven,方便、高效,不用手动去扒。
代码
核心发送代码
package org.oscar.mail.service.impl;
import org.oscar.mail.service.ICommunicate;
import org.oscar.mail.support.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
/**
* Description :
*
* @author : oscar
* @version :1.0, 2016/7/9
*/
public class JavaMailImpl implements ICommunicate {
private static final Logger LOGGER = LoggerFactory.getLogger(JavaMailImpl.class);
@Override
public String sendSimpleMail(List<String> addressList, String title, Object content) {
LOGGER.debug("|- Start send simple email...");
Properties props = new Properties();
//使用的邮件服务器类型
props.setProperty(Constants.MAIL_HOST_KEY, Constants.MAIL_HOST_VALUE);
//使用的认证方式
props.setProperty(Constants.MAIL_AUTH_KEY, Constants.MAIL_AUTH_VALUE);
Authenticator authenticator = new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(Constants.MAIL_USERNAME, Constants.MAIL_PASSWORD);
}
};
Session session = Session.getInstance(props, authenticator);
MimeMessage msg = new MimeMessage(session);
try {
// 设置邮件的发件人
msg.setFrom(new InternetAddress(Constants.MAIL_FROM));
// 设置收件人
Address[] adds = convertAddress(addressList);
msg.setRecipients(Message.RecipientType.TO, adds);
// 设置邮件标题
msg.setSubject(title);
// 设置邮件内容
msg.setContent(content, Constants.MAIL_TYPE);
//发邮件
Transport.send(msg);
} catch (MessagingException e) {
e.printStackTrace();
return "Send failed, the reason:" + e.getMessage();
}
return " Send success";
}
/**
* 将字符串类型邮箱地址转换为java mail能使用的邮箱地址
* @param addressList 字符串类型邮箱地址集合
* @return java mail使用的邮箱地址集合
*/
private Address[] convertAddress(List<String> addressList) throws AddressException {
List<Address> addresses = new ArrayList<>();
for (String addressStr : addressList) {
//这里没有做邮箱的合法性校验,只是做了非空和null
if (addressStr != null && addressStr.length() > 0) {
addresses.add(new InternetAddress(addressStr));
}
}
return addresses.toArray(new Address[addresses.size()]);
}
}
常量Constant.java
package org.oscar.mail.support;
/**
* Description :
*
* @author : oscar
* @version :1.0, 2016/7/9
*/
public class Constants {
/*
* 实际项目中可以将这段常量放在properties文件中。这里简单处理
*/
public static final String MAIL_HOST_KEY = "mail.host";
public static final String MAIL_HOST_VALUE = "smtp.163.com";
public static final String MAIL_AUTH_KEY = "mail.smtp.auth";
public static final String MAIL_AUTH_VALUE = "true";
public static final String MAIL_FROM = "********@163.com";
public static final String MAIL_TYPE = "text/html;charset=utf-8";
public static final String MAIL_USERNAME = "********";
public static final String MAIL_PASSWORD = "********";
}
测试代码
package org.oscar.mail.service.impl;
import org.junit.Before;
import org.junit.Test;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import java.util.ArrayList;
import java.util.List;
public class JavaMailImplTest {
private JavaMailImpl javaMail;
private List<String> addressList;
@Before
public void setUp() {
javaMail = new JavaMailImpl();
addressList = new ArrayList<>();
addressList.add("461857202@qq.com");
addressList.add("a461857202@163.com");
}
@Test
public void testSendMail() throws Exception {
//使用中文是为了验证是否有乱码
String title = "来自Java Mail的邮件";
String content = "<html><body><h1>您收到一封来自Java Mail的邮件,邮件内容是一张图片:</br></h1>" +
"<img src=\"http://www.rgagnon.com/images/jht.gif\"/></body></html>";
String result = javaMail.sendSimpleMail(addressList, title, content);
System.out.println(result);
}
}
结果展示
补充
这篇其实有很多的不足之处,可扩展之处,待下篇整理成一个完整的module。可以根据自己的需求调整和扩展。