Java寫郵件多人傳送及附件
阿新 • • 發佈:2018-12-11
maven匯入jar包
<modelVersion>4.0.0</modelVersion> <groupId>MailTest</groupId> <artifactId>MailTest</artifactId> <packaging>WAR</packaging> <version>0.0.1-SNAPSHOT</version> <name>MailTest Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <jstl.version>1.2</jstl.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <!-- jstl jsp標籤 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.1.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.1</version> <scope>provided</scope> </dependency> <!-- commons jar --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.0.0</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </build>
建立專案
編輯MailInfo
package util; import java.util.List; import java.util.Properties; public class MailInfo { private String mailServerHost; // 傳送郵件的伺服器的IP private String mailServerPort = "587"; // 傳送郵件的伺服器埠 private String userName; // 登陸郵件傳送伺服器的使用者名稱 private String userPassword; // 登陸郵件傳送伺服器的密碼 private String fromAddress; // 郵件傳送者的地址 private String toAddress; // 郵件接收者的地址管控 private String ccAddress; // 郵件抄送者的地址 private String fromUserName = "郵件測試"; // 郵件傳送者的名稱,顯示在他人郵件的發件人 private String mailSubject; // 郵件主題 private String mailContent;// 郵件的文字內容 private String filename;//檔案路徑 private boolean authValidate = true; // 是否需要身份驗證 private Properties properties; // 郵件會話屬性 public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } public MailInfo() { } public MailInfo(String serverHost, String user, String password, String fromAddress, String title, String content, List<String> receiver, List<String> ccList, String filename) { this.mailServerHost = serverHost; this.userName = user; this.userPassword = password; this.fromAddress = fromAddress; this.toAddress = listToStringFormat(receiver); this.ccAddress = ccList == null ? "" : listToStringFormat(ccList); this.mailSubject = title; this.mailContent = content; this.filename = filename; } private synchronized String listToStringFormat(List<String> list) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < list.size(); i++) { if (i == list.size() - 1) { stringBuilder.append(list.get(i)); } else { stringBuilder.append(list.get(i)).append(","); } } return stringBuilder.toString(); } public String getMailServerHost() { return mailServerHost; } public void setMailServerHost(String mailServerHost) { this.mailServerHost = mailServerHost; } public String getMailServerPort() { return mailServerPort; } public void setMailServerPort(String mailServerPort) { this.mailServerPort = mailServerPort; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } public String getFromAddress() { return fromAddress; } public void setFromAddress(String fromAddress) { this.fromAddress = fromAddress; } public String getToAddress() { return toAddress; } public void setToAddress(String toAddress) { this.toAddress = toAddress; } public String getCcAddress() { return ccAddress; } public void setCcAddress(String ccAddress) { this.ccAddress = ccAddress; } public String getMailSubject() { return mailSubject; } public void setMailSubject(String mailSubject) { this.mailSubject = mailSubject; } public String getMailContent() { return mailContent; } public void setMailContent(String mailContent) { this.mailContent = mailContent; } public String getFromUserName() { return fromUserName; } public void setFromUserName(String fromUserName) { this.fromUserName = fromUserName; } public boolean isAuthValidate() { return authValidate; } public void setAuthValidate(boolean authValidate) { this.authValidate = authValidate; } public Properties getProperties() { Properties p = new Properties(); p.put("mail.smtp.host", this.mailServerHost); p.put("mail.smtp.port", this.mailServerPort); p.put("mail.smtp.auth", authValidate ? "true" : "false"); p.put("mail.smtp.starttls.enable", "true"); return p; } public void setProperties(Properties properties) { this.properties = properties; } }
編輯MessageSender
package util; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.*; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Properties; /** *傳送郵件工具類 */ public class MessageSender { private static final Logger logger = Logger.getLogger(MessageSender.class); /** * * 傳送郵件-郵件內容為文字格式 * @param mailInfo * @return */ public static boolean sendMail(MailInfo mailInfo) { try { Message mailMessage = generateBaseInfo(mailInfo); // 建立訊息部分 BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText(mailInfo.getMailContent()); // 建立多重訊息 Multipart multipart = new MimeMultipart(); // 設定文字訊息部分 multipart.addBodyPart(messageBodyPart); // 附件部分 messageBodyPart = new MimeBodyPart(); // 設定要傳送附件的檔案路徑 DataSource source = new FileDataSource(mailInfo.getFilename()); messageBodyPart.setDataHandler(new DataHandler(source)); // messageBodyPart.setFileName(filename); // 處理附件名稱中文(附帶檔案路徑)亂碼問題 messageBodyPart.setFileName(MimeUtility.encodeText(mailInfo.getFilename())); multipart.addBodyPart(messageBodyPart); // 傳送完整訊息 mailMessage.setContent(multipart); // mailMessage.setText(mailInfo.getMailContent());// 設定郵件訊息的主要內容 Transport.send(mailMessage); // 傳送郵件 System.out.println("【 TEXT 郵件傳送完畢,成功時間: " + System.currentTimeMillis()+ " 】"); return true; } catch (MessagingException ex) { ex.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return false; } /** * 郵件內容為html格式 * @param mailInfo * @return */ public static boolean sendHtmlMail(MailInfo mailInfo) { try { Message mailMessage = generateBaseInfo(mailInfo); Multipart mainPart = new MimeMultipart();// MiniMultipart類是一個容器類,包含MimeBodyPart型別的物件 BodyPart html = new MimeBodyPart();// 建立一個包含HTML內容的MimeBodyPart html.setContent(mailInfo.getMailContent(), "text/html; charset=utf-8");// 設定HTML內容 mainPart.addBodyPart(html); mailMessage.setContent(mainPart);// 將MiniMultipart物件設定為郵件內容 Transport.send(mailMessage);// 傳送郵件 System.out.println("【 HTML 郵件傳送完畢,成功時間: " + System.currentTimeMillis() + " 】"); System.out.println("send ok!"); return true; } catch (MessagingException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return false; } /** * 郵件資訊保安轉換 * @param mailInfo * @return * @throws UnsupportedEncodingException * @throws MessagingException */ public static Message generateBaseInfo(MailInfo mailInfo) throws UnsupportedEncodingException, MessagingException { // 判斷是否需要身份認證 MailAuthenticator authenticator = null; Properties pro = mailInfo.getProperties(); // pro.getProperty() // 如果需要身份認證,則建立一個密碼驗證器 if (mailInfo.isAuthValidate()) { authenticator = new MailAuthenticator(mailInfo.getUserName(), mailInfo.getUserPassword()); } // 根據郵件會話屬性和密碼驗證器構造一個傳送郵件的session Session sendMailSession = Session.getInstance(pro, authenticator); Message mailMessage = null; mailMessage = new MimeMessage(sendMailSession); // 根據session建立一個郵件訊息 Address from = new InternetAddress(mailInfo.getFromAddress(), mailInfo.getFromUserName()); // 建立郵件傳送者地址 mailMessage.setFrom(from); // 設定郵件訊息的傳送者 if (mailInfo.getToAddress() != null && mailInfo.getToAddress().contains(",")) { mailMessage.setRecipients(Message.RecipientType.TO, InternetAddress.parse(mailInfo.getToAddress()));// Message.RecipientType.TO屬性表示接收者的型別為TO } else { Address to = new InternetAddress(mailInfo.getToAddress()); // 建立郵件的接收者地址,並設定到郵件訊息中 mailMessage.setRecipient(Message.RecipientType.TO, to);// Message.RecipientType.TO屬性表示接收者的型別為TO } if (StringUtils.isNotBlank(mailInfo.getCcAddress())) { if (mailInfo.getCcAddress().contains(",")) { mailMessage.setRecipients(Message.RecipientType.CC, InternetAddress.parse(mailInfo.getCcAddress())); // Message.RecipientType.CC屬性表示接收者的型別為CC } else { Address cc = new InternetAddress(mailInfo.getCcAddress()); // 建立郵件的抄送者地址,並設定到郵件訊息中 mailMessage.setRecipient(Message.RecipientType.CC, cc); // Message.RecipientType.CC屬性表示接收者的型別為CC } } mailMessage.setSubject(mailInfo.getMailSubject());// 設定郵件訊息的主題 mailMessage.setSentDate(new Date());// 設定郵件訊息傳送的時間 return mailMessage; } }
編輯MailAuthenticator
package util;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
/**
* 郵件安全認證
*/
public class MailAuthenticator extends Authenticator {
String userName;
String userPassword;
public MailAuthenticator() {
super();
}
public MailAuthenticator(String user, String pwd) {
super();
userName = user;
userPassword = pwd;
}
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, userPassword);
}
}
寫一個MailDemo進行測試
package test;
import java.util.ArrayList;
import java.util.List;
import util.MailInfo;
import util.MessageSender;
public class MailDemo {
public static void main(String[] args) {
mail();
}
public static void mail(){
String serverHost="smtp.qq.com";
String user="[email protected]"; //使用者名稱
String password="chcvuocdaffbbhfh"; //密碼
String fromAddress=user; //郵件地址
String title="郵件測試Demo";
String content="郵件測試成功";
String fileName="E:\\a.txt";
List<String> receiver=new ArrayList<String>();
receiver.add("[email protected]");
List<String> ccReceiver=new ArrayList<String>();
//新增抄送人
ccReceiver.add("[email protected]");
ccReceiver.add("[email protected]");
MailInfo mailInfo = new MailInfo(serverHost,user,password,fromAddress,title,content,receiver,ccReceiver, fileName);
MessageSender.sendMail(mailInfo);
}
}