郵件功能模塊在大多數網站中,都是必不可少的功能模塊。不管是用戶註冊仍是重置密碼,郵件都是比較經常使用的一個方式。本文主要介紹 JavaMail 的簡單使用,方便你們快速開發,供你們參考。完整的 demo,能夠從個人 GitHub 上下載:https://github.com/RexFang/java_emailhtml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>java_email</groupId> <artifactId>java_email</artifactId> <version>0.0.1-SNAPSHOT</version> <build> <sourceDirectory>src</sourceDirectory> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId> <version>2.11.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency> </dependencies> </project>
### 設置###
log4j.rootLogger = debug,stdout,D,E
### 輸出信息到控制擡 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 輸出DEBUG 級別以上的日誌到=D://work/logs/log.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D://work/logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 輸出ERROR 級別以上的日誌到=D://work/logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =D://work/logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
#是否開啓debug調試
mail.debug=true
#發送服務器是否須要身份驗證
mail.smtp.auth=true
#郵件發送端口
mail.smtp.port=25
#郵件服務器主機名
#mail.host=smtp.126.com
#mail.host=smtp.yeah.net
mail.host=smtp.sohu.com
#發送郵件協議名稱
mail.transport.protocol=smtp
#發送郵件用戶名
mail.user=java_email_test
#mail.user=rex_test
#發送郵件郵箱密碼
#mail.pass=java123
mail.pass=test123
#發送郵件發件人
#mail.from=java_email_test@126.com
mail.from=java_email_test@sohu.com
#mail.from=rex_test@yeah.net
package email; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; /** * user:Rex * date:2016年12月25日 上午1:13:37 * TODO 發送郵件帳戶信息 */ public class EmailAuthenticator extends Authenticator { //建立單例郵件帳戶信息 private static EmailAuthenticator emailAuthenticator = new EmailAuthenticator(); /** * user:Rex * date:2016年12月25日 上午3:28:10 * TODO 私有化構造函數 */ private EmailAuthenticator() { } /* * user: Rex * date: 2016年12月25日 上午3:33:36 * @return 返回密碼校驗對象 * TODO 重寫獲取密碼校驗對象方法 * @see javax.mail.Authenticator#getPasswordAuthentication() */ @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(EmailConfig.getUser(), EmailConfig.getPass()); } public static EmailAuthenticator createEmailAuthenticator() { return emailAuthenticator; } }
package email; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import org.apache.log4j.Logger; /** * user:Rex * date:2016年12月25日 上午1:46:43 * TODO 發送郵件配置信息 */ public class EmailConfig { private static final Logger logger = Logger.getLogger(EmailConfig.class); public static final String MAIL_DEBUT = "mail.debug"; public static final String MAIL_SMTP_AUTH = "mail.smtp.auth"; public static final String MAIL_SMTP_PORT = "mail.smtp.port"; public static final String MAIL_HOST = "mail.host"; public static final String MAIL_TRANSPORT_PROTOCOL = "mail.transport.protocol"; public static final String MAIL_USER = "mail.user"; public static final String MAIL_PASS = "mail.pass"; public static final String MAIL_FROM = "mail.from"; //是否開啓debug調試 private static String debug; //發送服務器是否須要身份驗證 private static String auth; //發送郵件端口 private static String port; //郵件服務器主機名 private static String host; //發送郵件協議名稱 private static String protocol; //發送郵件用戶名 private static String user; //發送郵件郵箱密碼 private static String pass; //發送郵件發件人 private static String from; //建立單例Session配置信息 private static Properties sessionProperties = new Properties(); //建立單例郵箱配置信息 private static EmailConfig emailConfig = new EmailConfig(); /** * user:Rex * date:2016年12月25日 上午2:03:48 * @throws IOException * TODO 從配置文件中讀取郵箱配置信息(比較好的方式是讓用戶在管理後臺配置,從數據庫讀取郵箱配置信息) */ private EmailConfig() { try { InputStream fis = EmailConfig.class.getResourceAsStream("/email.properties"); Properties prop = new Properties(); prop.load(fis); EmailConfig.auth = prop.getProperty(EmailConfig.MAIL_SMTP_AUTH, "false").trim(); EmailConfig.port = prop.getProperty(EmailConfig.MAIL_SMTP_PORT, "495").trim(); EmailConfig.debug = prop.getProperty(EmailConfig.MAIL_DEBUT, "false").trim(); EmailConfig.from = prop.getProperty(EmailConfig.MAIL_FROM, "java_email_test@126.com").trim(); EmailConfig.host = prop.getProperty(EmailConfig.MAIL_HOST, "smtp.126.com").trim(); EmailConfig.pass = prop.getProperty(EmailConfig.MAIL_PASS, "test123").trim(); EmailConfig.protocol = prop.getProperty(EmailConfig.MAIL_TRANSPORT_PROTOCOL, "smtp").trim(); EmailConfig.user = prop.getProperty(EmailConfig.MAIL_USER, "java_email_test").trim(); fis.close(); sessionProperties.setProperty(EmailConfig.MAIL_SMTP_AUTH, EmailConfig.auth); sessionProperties.setProperty(EmailConfig.MAIL_SMTP_PORT, EmailConfig.port); sessionProperties.setProperty(EmailConfig.MAIL_DEBUT, EmailConfig.debug); sessionProperties.setProperty(EmailConfig.MAIL_HOST, EmailConfig.host); sessionProperties.setProperty(EmailConfig.MAIL_TRANSPORT_PROTOCOL, EmailConfig.protocol); } catch (FileNotFoundException e) { logger.error("郵箱配置信息初始化異常", e); } catch (IOException e) { logger.error("郵箱配置信息初始化異常", e); } catch (Exception e){ logger.error("郵箱配置信息初始化異常", e); } } public static String getDebug() { return debug; } public static String getAuth() { return auth; } public static String getHost() { return host; } public static String getProtocol() { return protocol; } public static String getUser() { return user; } public static String getPass() { return pass; } public static String getFrom() { return from; } public static EmailConfig createEmailConfig() { return emailConfig; } public static Properties getSessionProperties() { return sessionProperties; } public static String getPort() { return port; } }
package email; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.List; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.Message.RecipientType; import javax.mail.MessagingException; 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 javax.mail.internet.MimeUtility; import org.apache.commons.lang3.StringUtils; /** * user:Rex * date:2016年12月25日 上午3:56:49 * TODO 郵件工具類 */ public class EmailUtil { /** * user: Rex * date: 2016年12月25日 上午4:29:18 * @param subject 郵件標題 * @param content 郵件內容 * @param to 收件人(多個收件人用英文逗號「,」隔開) * @throws Exception */ public static void sendEmail(String subject, String content, String to) throws Exception{ Message msg = createMessage(subject, content, to, null); // 鏈接郵件服務器、發送郵件 Transport.send(msg); } /** * user: Rex * date: 2016年12月25日 上午4:17:11 * @param subject 郵件標題 * @param content 郵件內容 * @param to 收件人(多個收件人用英文逗號「,」隔開) * @param type * @param otherRecipient 抄送人或暗送人(多個抄送人或暗送人用英文逗號「,」隔開) * @return 郵箱對象 * @throws Exception */ public static void sendEmail(String subject, String content, String to, RecipientType type, String otherRecipient) throws Exception{ Message msg = createMessage(subject, content, to, type, otherRecipient, null); // 鏈接郵件服務器、發送郵件 Transport.send(msg); } /** * user: Rex * date: 2016年12月25日 上午4:17:11 * @param subject 郵件標題 * @param content 郵件內容 * @param to 收件人(多個收件人用英文逗號「,」隔開) * @param cc 抄送人(多個抄送人用英文逗號「,」隔開) * @param bcc 暗送人(多個暗送人用英文逗號「,」隔開) * @return 郵箱對象 * @throws Exception */ public static void sendEmail(String subject, String content, String to, String cc, String bcc) throws Exception{ Message msg = createMessage(subject, content, to, cc, bcc, null); // 鏈接郵件服務器、發送郵件 Transport.send(msg); } /** * user: Rex * date: 2016年12月25日 上午7:04:02 * @param subject 郵件標題 * @param content 郵件內容 * @param to 收件人(多個收件人用英文逗號「,」隔開) * @param fileList 附件 * @throws Exception */ public static void sendEmail(String subject, String content, String to, List<File> fileList) throws Exception{ Message msg = createMessage(subject, content, to, fileList); // 鏈接郵件服務器、發送郵件 Transport.send(msg); } /** * user: Rex * date: 2016年12月25日 上午7:04:02 * @param subject 郵件標題 * @param content 郵件內容 * @param to 收件人(多個收件人用英文逗號「,」隔開) * @param type * @param otherRecipient 抄送人或暗送人(多個抄送人或暗送人用英文逗號「,」隔開) * @param fileList 附件 * @throws Exception */ public static void sendEmail(String subject, String content, String to, RecipientType type, String otherRecipient, List<File> fileList) throws Exception{ Message msg = createMessage(subject, content, to, type, otherRecipient, fileList); // 鏈接郵件服務器、發送郵件 Transport.send(msg); } /** * user: Rex * date: 2016年12月25日 上午7:04:02 * @param subject 郵件標題 * @param content 郵件內容 * @param to 收件人(多個收件人用英文逗號「,」隔開) * @param cc 抄送人(多個抄送人用英文逗號「,」隔開) * @param bcc 暗送人(多個暗送人用英文逗號「,」隔開) * @param fileList 附件 * @throws Exception */ public static void sendEmail(String subject, String content, String to, String cc, String bcc, List<File> fileList) throws Exception{ Message msg = createMessage(subject, content, to, cc, bcc, fileList); // 鏈接郵件服務器、發送郵件 Transport.send(msg); } /** * user: Rex * date: 2016年12月25日 上午7:02:07 * @param subject 郵件標題 * @param content 郵件內容 * @param to 收件人(多個收件人用英文逗號「,」隔開) * @param cc 抄送人(多個抄送人用英文逗號「,」隔開) * @param bcc 暗送人(多個暗送人用英文逗號「,」隔開) * @param fileList 附件 * @return 郵箱對象 * @throws Exception */ private static Message createMessage(String subject, String content, String to, String cc, String bcc, List<File> fileList) throws Exception{ Message msg = createMessage(subject, content, to, RecipientType.CC, cc, fileList); msg.setRecipients(RecipientType.BCC, InternetAddress.parse(bcc)); msg.setSentDate(new Date()); //設置信件頭的發送日期 return msg; } /** * user: Rex * date: 2016年12月25日 上午7:02:07 * @param subject 郵件標題 * @param content 郵件內容 * @param to 收件人(多個收件人用英文逗號「,」隔開) * @param otherRecipient 抄送人或暗送人(多個抄送人或暗送人用英文逗號「,」隔開) * @param fileList 附件 * @return 郵箱對象 * @throws Exception */ private static Message createMessage(String subject, String content, String to, RecipientType type, String otherRecipient, List<File> fileList) throws Exception{ Message msg = createMessage(subject, content, to, fileList); msg.setRecipients(type, InternetAddress.parse(otherRecipient)); return msg; } /** * user: Rex * date: 2016年12月25日 上午7:02:07 * @param subject 郵件標題 * @param content 郵件內容 * @param to 收件人(多個收件人用英文逗號「,」隔開) * @param fileList 附件 * @return 郵箱對象 * @throws Exception */ private static Message createMessage(String subject, String content, String to, List<File> fileList) throws Exception{ checkEmail(subject, content, fileList); //郵件內容 Multipart mp = createMultipart(content, fileList); Message msg = new MimeMessage(createSession()); msg.setFrom(new InternetAddress(EmailConfig.getFrom())); msg.setSubject(subject); msg.setRecipients(RecipientType.TO, InternetAddress.parse(to)); msg.setContent(mp); //Multipart加入到信件 msg.setSentDate(new Date()); //設置信件頭的發送日期 return msg; } /** * user: Rex * date: 2016年12月25日 上午9:01:12 * @param content 郵件正文內容 * @param fileList 附件 * @return 郵件內容對象 * @throws MessagingException * @throws UnsupportedEncodingException * Multipart * TODO 建立郵件正文 */ private static Multipart createMultipart(String content, List<File> fileList) throws MessagingException, UnsupportedEncodingException{ //郵件內容 Multipart mp = new MimeMultipart(); MimeBodyPart mbp = new MimeBodyPart(); mbp.setContent(content, "text/html;charset=gb2312"); mp.addBodyPart(mbp); if(fileList!=null && fileList.size()>0){ //附件 FileDataSource fds; for(File file : fileList){ mbp=new MimeBodyPart(); fds = new FileDataSource(file);//獲得數據源 mbp.setDataHandler(new DataHandler(fds)); //獲得附件自己並至入BodyPart mbp.setFileName(MimeUtility.encodeText(file.getName())); //獲得文件名一樣至入BodyPart mp.addBodyPart(mbp); } } return mp; } /** * user: Rex * date: 2016年12月25日 上午9:48:18 * @param title 郵件標題 * @param content 郵件正文 * @param fileList 郵件附件 * void * TODO 校驗郵件內容合法性 * @throws Exception */ private static void checkEmail(String subject, String content, List<File> fileList) throws Exception{ if(StringUtils.isEmpty(subject)){ throw new Exception("郵件標題不能爲空"); } if(StringUtils.isEmpty(content) && (fileList==null || fileList.size()==0)){ throw new Exception("郵件內容不能爲空"); } } /** * user: Rex * date: 2016年12月25日 上午4:01:47 * @return * Session * TODO 建立郵箱上下文 */ private static Session createSession(){ return Session.getDefaultInstance(EmailConfig.getSessionProperties(), EmailAuthenticator.createEmailAuthenticator()); } }
package test; import java.io.File; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import email.EmailUtil; public class EmailUtilTest { @Before public void setUp() throws Exception { } @Test public void testSendEmail() { try { String title = "利比亞客機遭劫持6大疑問:劫機者怎樣經過安檢的(1)"; String content = "當地時間23日,俄羅斯總統普京在莫斯科國際貿易中心舉行年度記者會。記者會持續了近4個小時,普京一共回答了來自俄羅斯各個地區及全世界記者的47個問題。自2001年起,普京都會在每一年12月中下旬舉行年度記者會,這是他的第12次記者會。"; List<File> fileList = new ArrayList<File>(); fileList.add(new File("C:/Users/Rex/Desktop/log4j.properties")); EmailUtil.sendEmail(title, content, "rex_test@yeah.net", "123@qq.com", "456@qq.com", fileList); } catch (Exception e) { e.printStackTrace(); } } }
完整的 demo ,請查看個人 GitHub https://github.com/RexFang/java_emailjava