使用javamail傳送郵件
阿新 • • 發佈:2018-12-25
在java web專案我們經常會使用到傳送郵件,比如傳送告警通知,對實時性要求不太高的專案就可以發郵件,畢竟是免費的嘛,這裡寫了幾段java傳送郵件的程式碼,參考http://www.iteye.com/topic/352753,自己又改了一下,比如傳送附件,多個抄送人等。
1、MailSenderInfo郵件資訊類
package com.chen.util; import java.util.Properties; /** * 郵件資訊 * */ public class MailSenderInfo { // 傳送郵件的伺服器的IP和埠 private String mailServerHost; private String mailServerPort = "25"; // 郵件傳送者的地址 private String fromAddress; // 郵件接收者的地址 private String toAddress; // 登陸郵件傳送伺服器的使用者名稱和密碼 private String userName; private String password; // 是否需要身份驗證 private boolean validate = false; // 郵件主題 private String subject; // 郵件的文字內容 private String content; // 郵件附件的檔名 private String[] attachFileNames; // 郵件的接收者,可以有多個 private String[] receivers; // 郵件的抄送者,可以有多個 private String[] ccs; /** *//** * 獲得郵件會話屬性 */ 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", validate ? "true" : "false"); return p; } 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 boolean isValidate() { return validate; } public void setValidate(boolean validate) { this.validate = validate; } public String[] getAttachFileNames() { return attachFileNames; } public void setAttachFileNames(String[] fileNames) { this.attachFileNames = fileNames; } public String getFromAddress() { return fromAddress; } public void setFromAddress(String fromAddress) { this.fromAddress = fromAddress; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getToAddress() { return toAddress; } public void setToAddress(String toAddress) { this.toAddress = toAddress; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public String getContent() { return content; } public void setContent(String textContent) { this.content = textContent; } public String[] getCcs() { return ccs; } public void setCcs(String[] ccs) { this.ccs = ccs; } public String[] getReceivers() { return receivers; } public void setReceivers(String[] receivers) { this.receivers = receivers; } }
2、MyAuthenticator 該類傳送郵件是鑑權用,繼承Authenticator
package com.chen.util; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; /** * 該類傳送郵件是鑑權用 * 繼承Authenticator * * */ public class MyAuthenticator extends Authenticator{ String userName=null; String password=null; public MyAuthenticator(){ } public MyAuthenticator(String username, String password) { this.userName = username; this.password = password; } protected PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication(userName, password); } }
3、MailUtil 傳送郵件工具類
package com.chen.util; import java.util.Date; import javax.activation.DataHandler; import javax.activation.FileDataSource; 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 MailUtil { //protected static final String serverHost=PropertiesUtil.getPropertiesByKey("prop.properties", "ServerHost"); protected static final String serverHost="smtp.qq.com"; protected static final String serverPort = "25"; protected static final String userName = "******@qq.com"; protected static final String password = "********"; /** * 傳送郵件給多個抄送人 * */ public static boolean sendMailtoMultiCC(MailSenderInfo mailInfo){ MyAuthenticator authenticator = null; if (mailInfo.isValidate()) { authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword()); } Session sendMailSession = Session.getInstance(mailInfo.getProperties(), authenticator); //sendMailSession.setDebug(true); try { //建立郵件 Message mailMessage = new MimeMessage(sendMailSession); // 建立郵件傳送者地址 Address from = new InternetAddress(mailInfo.getFromAddress()); mailMessage.setFrom(from); // 建立郵件的接收者地址,並設定到郵件訊息中 Address to = new InternetAddress(mailInfo.getToAddress()); mailMessage.setRecipient(Message.RecipientType.TO, to); // 獲取抄送者資訊 String[] ccs = mailInfo.getCcs(); if (ccs != null){ // 為每個郵件接收者建立一個地址 Address[] ccAdresses = new InternetAddress[ccs.length]; for (int i=0; i<ccs.length; i++){ ccAdresses[i] = new InternetAddress(ccs[i]); } // 將抄送者資訊設定到郵件資訊中,注意型別為Message.RecipientType.CC mailMessage.setRecipients(Message.RecipientType.CC, ccAdresses); } mailMessage.setSubject(mailInfo.getSubject()); mailMessage.setSentDate(new Date()); // 設定郵件內容 Multipart mainPart = new MimeMultipart(); BodyPart html = new MimeBodyPart(); html.setContent(mailInfo.getContent(), "text/html; charset=UTF-8"); //新增附件 String[] fileName = mailInfo.getAttachFileNames(); if(fileName != null) { for(int i=0;i<fileName.length;i++) { BodyPart bodyPart = new MimeBodyPart(); DataHandler dh = new DataHandler(new FileDataSource(fileName[i])); bodyPart.setDataHandler(dh); //防止附件名中文亂碼 bodyPart.setFileName(MimeUtility.encodeText(dh.getName())); mainPart.addBodyPart(bodyPart); } } mainPart.addBodyPart(html); mailMessage.setContent(mainPart); // 傳送郵件 Transport.send(mailMessage); return true; } catch (Exception ex) { ex.printStackTrace(); } return false; } //傳送簡單郵件 public static void main(String [] args) throws MessagingException { MailSenderInfo mailInfo = new MailSenderInfo(); mailInfo.setMailServerHost(serverHost); mailInfo.setMailServerPort(serverPort); mailInfo.setValidate(true); mailInfo.setUserName(userName); mailInfo.setPassword(password); mailInfo.setFromAddress(userName); mailInfo.setToAddress("**************@qq.com"); mailInfo.setSubject("我是主題"); mailInfo.setContent("我是內容"); String tos = "*******,*********"; if(!tos.equals("")){ String[] receivers = tos.split(","); String[] ccs = receivers; mailInfo.setReceivers(receivers);//多個接收人 mailInfo.setCcs(ccs);//多個抄送人 } String fileName = "C:\\Users\\Administrator\\Desktop\\******.png,C:\\Users\\Administrator\\Desktop\\*********.sql"; if(!fileName.equals("")) { String [] fileNames = fileName.split(","); mailInfo.setAttachFileNames(fileNames); } sendMailtoMultiCC(mailInfo);//傳送多個抄送人 } }
使用方法可以參考第3個類MailUtil的main方法裡呼叫傳送郵件的方法sendMailtoMultiCC,可以抄送給多人,可以傳送多個附件。
借鑑了han2000lei部落格,增加了多個抄送人和附件,如有興趣可以移步。