目录
发送文本、发送html模板、群发、发送附件
预备
POM
javax.mail 1.4.7
开始
javax.mail.Session:上下文环境信息,如服务器的主机名、端口号、协议名称等 javax.mail.Message:邮件模型,发送邮件和接收邮件的媒介,封装了邮件的信息,如发件人、收件人、邮件标题、邮件内容等 javax.mail.Transport:连接邮件SMTP服务器,发送邮件 javax.mail.Store:连接邮件POP3、IMAP服务器,收取邮件
定义发送者信息mail.properties
#Sender Authusername=发送者邮箱账户password=发送者邮箱密码#Sender Infofrom.address=发送者邮箱地址#Sender Server(这里测试发送者使用QQ邮箱)mail.smtp.host=smtp.qq.commail.smtp.auth=truemail.smtp.port=587
定义配置读取类MailConfig.java
package com;import java.io.IOException;import java.io.InputStream;import java.util.Properties;public class MailConfig { private static Properties properties; public static Properties getProperties() { if (null == properties) { properties = new Properties(); InputStream stream = MailDemo.class.getClassLoader().getResourceAsStream("mail.properties"); try { properties.load(stream); stream.close(); } catch (IOException e) { e.printStackTrace(); } } return properties; } public static String getHost() { return getProperties().getProperty("mail.smtp.host"); } public static String getPort() { return getProperties().getProperty("mail.smtp.port"); } public static String getUserName() { return getProperties().getProperty("username"); } public static String getPassword() { return getProperties().getProperty("password"); } public static String getFromAddress() { return getProperties().getProperty("from.address"); } public static boolean getAuth() { return "true".equalsIgnoreCase(getProperties().getProperty("mail.smtp.auth")); }}
定义认证类DemoAuthenticator.java
/** * 认证信息 */package com;import javax.mail.Authenticator;import javax.mail.PasswordAuthentication;public class DemoAuthenticator extends Authenticator { //用户名 private String userName ; //用户密码 private String password ; public DemoAuthenticator() { } public DemoAuthenticator(String username, String password) { this.userName = username; this.password = password; } @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(userName, password); } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}
定义邮件内容类MailDetail.java
/*** * 邮件详情 */package com;public class MailDetail { // 邮件接收者的地址 private String toAddress; // 邮件主题 private String subject; // 邮件的文本内容 private String content; // 邮件附件的文件名 private String[] attachFileNames; public String getToAddress() { return toAddress; } public void setToAddress(String toAddress) { this.toAddress = toAddress; } public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String[] getAttachFileNames() { return attachFileNames; } public void setAttachFileNames(String[] attachFileNames) { this.attachFileNames = attachFileNames; }}
定义发送器类
package com;import java.io.IOException;import java.util.Date;import java.util.Properties;import javax.mail.Address;import javax.mail.BodyPart;import javax.mail.Message;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;/** * 简单邮件(不带附件的邮件)发送器 */public class SimpleMailSender { /** * 以文本格式发送邮件 * * @param detail * 待发送的邮件的信息 */ public static boolean sendTextMail(MailDetail detail) { // 判断是否需要身份认证 DemoAuthenticator authenticator = null; Properties pro = MailConfig.getProperties(); System.out.println("是否需要验证:" + (MailConfig.getAuth() == true)); if (MailConfig.getAuth()) { // 如果需要身份认证,则创建一个密码验证器 authenticator = new DemoAuthenticator(MailConfig.getUserName(), MailConfig.getPassword()); } // 根据邮件会话属性和密码验证器构造一个发送邮件的session Session sendMailSession = Session.getDefaultInstance(pro, authenticator); try { // 根据session创建一个邮件消息 Message mailMessage = new MimeMessage(sendMailSession); // 创建邮件发送者地址 Address from = new InternetAddress(MailConfig.getFromAddress()); // 设置邮件消息的发送者 mailMessage.setFrom(from); // 创建邮件的接收者地址,并设置到邮件消息中 Address to = new InternetAddress(detail.getToAddress()); mailMessage.setRecipient(Message.RecipientType.TO, to); //循环add可以实现群发 //mailMessage.addRecipient(Message.RecipientType.TO, to); // 设置邮件消息的主题 mailMessage.setSubject(detail.getSubject()); // 设置邮件消息发送的时间 mailMessage.setSentDate(new Date()); // 设置邮件消息的主要内容 String mailContent = detail.getContent(); mailMessage.setText(mailContent); mailMessage.saveChanges(); // 发送邮件方式一 /* * mailMessage.saveChanges(); // implicit with send() Transport * transport = sendMailSession.getTransport("smtp"); * transport.connect(MailProperties.getHost(), * MailProperties.getUserName(), MailProperties.getPassword()); * transport.sendMessage(mailMessage, * mailMessage.getAllRecipients()); transport.close(); */ // 发送邮件方式二 Transport.send(mailMessage); return true; } catch (MessagingException ex) { ex.printStackTrace(); } return false; } /** * 以HTML格式发送邮件 * * @param detail * 待发送的邮件信息 */ public static boolean sendHtmlMail(MailDetail detail) { // 判断是否需要身份认证 DemoAuthenticator authenticator = null; Properties pro = MailConfig.getProperties(); // 如果需要身份认证,则创建一个密码验证器 if (MailConfig.getAuth()) { authenticator = new DemoAuthenticator(MailConfig.getUserName(), MailConfig.getPassword()); } // 根据邮件会话属性和密码验证器构造一个发送邮件的session Session sendMailSession = Session.getDefaultInstance(pro, authenticator); try { // 根据session创建一个邮件消息 Message mailMessage = new MimeMessage(sendMailSession); // 创建邮件发送者地址 Address from = new InternetAddress(MailConfig.getFromAddress()); // 设置邮件消息的发送者 mailMessage.setFrom(from); // 创建邮件的接收者地址,并设置到邮件消息中 Address to = new InternetAddress(detail.getToAddress()); // Message.RecipientType.TO属性表示接收者的类型为TO mailMessage.setRecipient(Message.RecipientType.TO, to); // 设置邮件消息的主题 mailMessage.setSubject(detail.getSubject()); // 设置邮件消息发送的时间 mailMessage.setSentDate(new Date()); // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象 Multipart mainPart = new MimeMultipart(); // 创建一个包含HTML内容的MimeBodyPart BodyPart html = new MimeBodyPart(); // 设置HTML内容 html.setContent(detail.getContent(), "text/html; charset=utf-8"); mainPart.addBodyPart(html); // 添加附件 MimeBodyPart mimeBodyPart = new MimeBodyPart(); mimeBodyPart.attachFile("C:\\Apps\\QQ\\Plugin\\Com.Tencent.QQVip\\Misc\\CustomFont\\101\\qie17b.png"); mimeBodyPart.setFileName(MimeUtility.encodeWord("测试附件.png")); mainPart.addBodyPart(mimeBodyPart); // 将MiniMultipart对象设置为邮件内容 mailMessage.setContent(mainPart); mailMessage.saveChanges(); // 发送邮件 Transport.send(mailMessage); return true; } catch (MessagingException ex) { ex.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return false; }}
测试Demo
public static void main(String[] args) { MailDetail detail = new MailDetail(); detail.setToAddress(接收者邮箱地址); detail.setSubject("测试邮箱标题WithHtml"); detail.setContent(readTemplate()); //发送文本 boolean result = SimpleMailSender.sendTextMail(detail); //发送html格式 //boolean result = SimpleMailSender.sendHtmlMail(detail); // 发送文体格式 if(result){ System.out.println("发送成功..."); }else{ System.out.println("发送失败..."); } }
附加(读取文本)
private static String readTemplate() { StringBuilder builder = new StringBuilder(); String encoding = "UTF-8"; InputStreamReader read = null; try { read = new InputStreamReader(MailDemo.class.getClassLoader().getResourceAsStream("temp.html"), encoding); BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; while ((lineTxt = bufferedReader.readLine()) != null) { builder.append(lineTxt); } read.close(); } catch (Exception e) { System.out.println("读取文件内容出错"); e.printStackTrace(); } return builder.toString(); }