引言
html
我已經好久沒有寫過博客了,之前在博客園有寫過一段時間,但後來由於工做的緣由,沒有更多的時間來寫博客。這是我在51cto上的第一篇博文,寫寫JavaEmail發送郵件吧。java
準備工做web
下載好:javaMail.jar包和commons-lang-x.x.jar(後面附件中,我會把包一併送上,commons-lang由於在案例當中會用到)
apache
案例介紹服務器
演示瞭如何使用javaMail發送郵件session
實踐app
首先,咱們去新建一個web項目。個人項目名字就叫email.建好項目事後,在WebContent\WEB-INF\lib下加入上面介紹的兩個包。給個圖片:socket
而後添加一個config的源文件,用於放置配置文件,再到src源文件下添加一個包email。創那好事後,目錄結構以下:ide
好了,如今已經萬事俱備,只欠代碼了。可是在寫代碼以前,我想,簡單地對javaEmail做一點點介紹:函數
1.Java Mail是由Sun定義的一套收發電子郵件的API。
2.Java Mail服務程序能夠有選擇地實現某些郵件協議(smtp\pop3\imap),這三種協議都有對應SSL加密傳輸的協議,分別是SMTPS,POP3S和IMAPS
3.用於郵件處理的,分別有兩個包:
mail. jar:此JAR文件包含 Java Mail API和Sun提供的SMTP、IMAP和POP3服務提供程序。
activation. jar:此JAR文件包含JAF API和Sun的實現。
4.javaMail的關鍵對象,包括:Properties、Session、Message、Authenticator、Address。
Properties對象裏面主要是存放一些key-value,交給JavaMail識別如服務器地址、端口、用戶名、密碼等信息。
Properties對象,給定信息key列表:(例如:p.put("mail.smtp.port",25))
屬性名 |
屬性類別 |
說明 |
mail.stmp.host |
String |
SMTP服務器地址,如smtp.sina.com.cn |
mail.stmp.port |
int |
SMTP服務器端口號,默認爲25 |
mail.stmp.auth |
boolean |
SMTP服務器是否須要用戶認證,默認爲false |
mail.stmp.from | String | 默認的郵件發送源地址 |
mail.stmp.socketFactory.class | String | socket工廠類類名,經過設置該屬性能夠覆蓋提供者默認的實現,必須實現javax.net.SocketFactory接口 |
mail.stmp.socketFactory.port | int | 指定socket工廠類所用的端口號,若是沒有規定,則使用默認的端口號 |
mail.smtp.socketFactory.fallback | boolean | 設置爲true時,當使用指定的socket類建立socket失敗後,將使用java.net.Socket建立socket,默認爲true |
mail.stmp.timeout | int | I/O鏈接超時時間,單位爲毫秒,默認爲永不超時 |
mail.stmp.user | String | SMTP默認的登錄用戶名 |
Session對象
在javaEmail中,它表示與Email會話的對象,它須要經過Properties對象和認證者來初使化它。也就是說這個會話的產生,須要你作好相關Eail環境的配置。
Message對象主要是用於發送消息,和封裝發送或接收信息。
Authenticator對象是指認證者,這個認證者主要須要兩個東西,用戶名和密碼。通常咱們會自定義一個認證者 extends Authenticator;而後new PasswordAuthentication(userName, password)給它。
關於javaMail的介紹先到這裏。如今咱們思考一個問題:發送郵件會有哪些對象?
這是個人假設:首先有一個郵件包(或電子郵件包)。這個郵件包,包括這些東西:1.這個郵件包是哪一個機構發出來的(serverhost)2.這個機構的門牌號是什麼(serverPort) 3.機構在發送這個包的時候,要不要對寄件人作身份驗證。(isValidate) 4.寄件人身份信息是什麼?(假設就是用戶名和密碼) 5.郵件包上應該有寄件人的地址。6.郵件包上應該有收件人的地址(若是是電子郵件,會有多個收件人,抄送等)7.這個郵件主要描述 8.這個郵件裏裝的什麼東西。
好,如今根據上面的那些概念,咱們先建一個EmailPackage對象以下:
package email; import java.io.InputStream; import java.util.Arrays; import java.util.Properties; import javax.mail.Address; import javax.mail.internet.InternetAddress; import org.apache.commons.lang.StringUtils; /** * 表示一個郵件包 * 此包中包括髮送郵件的必備條件和郵件內容 * 暫時不支持附件的發送 若是後期須要,則加入屬性 * 而後將附件加入到mutipart中便可 * @author 莊濮向 * */ public class EmailPackage { /* * 爲你提供發送郵件的主機 * 好比對象:申通,圓通,或順豐等機構 * 電子郵件對象好比:QQ,163的主機等 * like this:smtp.exmail.qq.com * */ private String serverHost; /* *發送郵件主機的端口 * */ private String serverPort; /* * 是否進行身份驗證 * 若是進行驗證,則須要您在該機構的用戶名和密碼 * */ private boolean isValidate; /* * 在該機構的用戶名 * */ private String userName; /* * 在該機構的密碼 */ private String password; /* * 發送方郵件地址 * 讓接收者知道這個郵件是從哪裏發過來的 */ private String fromAddress; /* * 接收方的郵件地址 * 多個主送 */ private Address[] mainSendAddresses; /* * 接收方的郵件地址 * 多個抄送 */ private Address[] copySendAddresses; /* * 發送的主題 * 能夠理解爲郵件的標題 */ private String subject; /* * 發送郵件的主要內容 * */ private StringBuilder content; /** * 構造函數 * 注:此包在構造的時候,將會從配置文件中獲取除郵件內容之外的必備信息,就像一個清單 * 郵件內容能夠自行放入 */ public EmailPackage(){ PasteBill(); } /** * 將發送內容一塊兒加入包中 * @param content */ public EmailPackage(StringBuilder content){ PasteBill(); this.content=content; } /** * 爲郵件包貼入清單 * 或者說是爲發送郵件建立基礎信息 * */ private void PasteBill(){ Properties p = new Properties(); InputStream in = EmailPackage.class.getClassLoader().getResourceAsStream("mail.properties"); try { p.load(in); this.serverHost = StringUtils.trim(p.getProperty("ServerHost")); this.serverPort = StringUtils.trim(p.getProperty("ServerPort")); if("true".equals(StringUtils.trim(p.getProperty("Validate")))){ this.isValidate = true; }else{ this.isValidate = false; } this.userName = StringUtils.trim(p.getProperty("UserName")); this.password = StringUtils.trim(p.getProperty("Password")); this.fromAddress = StringUtils.trim(p.getProperty("FromAddress")); String[] mainStr = StringUtils.trim(p.getProperty("MainSendAddresses")).split(","); //設置主送地址 this.mainSendAddresses = new InternetAddress[mainStr.length]; for(int i=0;i<mainStr.length;i++){ mainSendAddresses[i] = new InternetAddress(mainStr[i]); } //設置抄送地 String cc = StringUtils.trim(p.getProperty("CopySendAddresses")); if(!StringUtils.isEmpty(cc)){ String[] ccStr = cc.split(","); this.copySendAddresses = new InternetAddress[ccStr.length]; for(int i=0;i<ccStr.length;i++){ copySendAddresses[i]=new InternetAddress(ccStr[i]); } }else{ this.copySendAddresses = null; } this.subject = StringUtils.trim(p.getProperty("Subject")); } catch (Exception e) { e.printStackTrace(); } } //--------------setter and getter---------------------------------- public String getServerHost() { return serverHost; } public void setServerHost(String serverHost) { this.serverHost = serverHost; } public String getServerPort() { return serverPort; } public void setServerPort(String serverPort) { this.serverPort = serverPort; } public boolean isValidate() { return isValidate; } public void setValidate(boolean isValidate) { this.isValidate = isValidate; } 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; } public String getFromAddress() { return fromAddress; } public void setFromAddress(String fromAddress) { this.fromAddress = fromAddress; } public Address[] getMainSendAddresses() { return mainSendAddresses; } public void setMainSendAddresses(Address[] mainSendAddresses) { this.mainSendAddresses = mainSendAddresses; } public Address[] getCopySendAddresses() { return copySendAddresses; } public void setCopySendAddresses(Address[] copySendAddresses) { this.copySendAddresses = copySendAddresses; } public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public StringBuilder getContent() { return content; } public void setContent(StringBuilder content) { this.content = content; } @Override public String toString() { return "EmailPackage [serverHost=" + serverHost + ", serverPort=" + serverPort + ", isValidate=" + isValidate + ", userName=" + userName + ", password=" + password + ", fromAddress=" + fromAddress + ", mainSendAddresses=" + Arrays.toString(mainSendAddresses) + ", copySendAddresses=" + Arrays.toString(copySendAddresses) + ", subject=" + subject + ", content=" + content + "]"; } public static void main(String[] args) { EmailPackage packages = new EmailPackage(); System.out.println(packages); } }
上述代碼中,在初使化對象的時候有去執行PasteBill方法,而這個方法是去讀取一個配置文件,那個這個配置文件裏面存放了,這個屬性須要的值,包括髮送人,發送地址等信息,之後要更改,那麼只須要改這個配置文件便可。新建文件mail.properties,放到config源文件下,配置文件內容以下:請根據提示作必定的更改
############################################# # the receive server host 你的服務機構的host ############################################# ServerHost=smtp.exmail.qq.com ############################################# # the receive server Port Default 25 ############################################# ServerPort=25 ############################################# # must validate the send user # you should send the true value ############################################# Validate=true ############################################# # send userName ############################################# UserName=zhuangpx@2pol.cn ############################################# # send user password ############################################# Password=請填寫你的密碼 ############################################# # send user EailAddress ############################################# FromAddress=zhuangpx@2pol.cn ############################################# # main send EailAddress # if have more like this:xxx@resource.cn,xxx@resource.cn # you shoud use ',' to split ############################################# MainSendAddresses=zhuangpx@2pol.cn ############################################# # copy send EailAddress # if have more like this:xxx@resource.cn,xxx@resource.cn # you shoud use ',' to split ############################################# CopySendAddresses=zhuangpx@2pol.cn ############################################# # set the defualt subject # you can change in you project. ############################################# Subject=這是你的主題內容
既然在發送郵件的過程當中,會對人進行認證,那麼咱們就要去新建一個認證者,而且告訴它相關用戶信息MyAuthenticator對象以下:
package email; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; 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); } 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; } }
接下來,思考這個郵件包,確定是有一個郵件發送器來發的,那麼在這個發送器,確定要擁有這個郵件包,才能夠。因此咱們新建對象EmailSender:
package email; import java.util.Date; import java.util.Properties; import javax.mail.Address; import javax.mail.Authenticator; import javax.mail.BodyPart; import javax.mail.Message; 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; /** * 此類做爲郵件的發送類 * 此類的使用必需要有一個EmailPackage包 * @author 莊濮向 * */ public class EmailSender { /* * 郵件包,包含了要發送的地址,信息等。 */ private EmailPackage emailPackage; /** * 要求必需要有一個包的傳入 * @param emailPackage */ public EmailSender(EmailPackage emailPackage){ this.emailPackage = emailPackage; } /** * 執行發送的操做 * @return */ public boolean send(){ if(this.emailPackage!=null){ return sendMail(); }else{ return false; } } /** * 獲得發送服務機構的綜合信息 */ private Properties getServiceInfo(){ Properties p = new Properties(); p.put("mail.smtp.host", this.emailPackage.getServerHost()); p.put("mail.smtp.port", this.emailPackage.getServerPort()); p.put("mail.smtp.auth", this.emailPackage.isValidate() ? "true" : "false"); return p; } /** * 發送郵件 */ private boolean sendMail(){ Authenticator auth = null; if(this.emailPackage.isValidate()){ auth = new MyAuthenticator(emailPackage.getUserName(),emailPackage.getPassword()); } Session sessionConfig = Session.getDefaultInstance(getServiceInfo(), auth); Message message = new MimeMessage(sessionConfig); try { Address from = new InternetAddress(this.emailPackage.getFromAddress()); //來自哪裏 message.setFrom(from); //主送哪些 message.setRecipients(Message.RecipientType.TO,this.emailPackage.getMainSendAddresses()); //抄送哪些 if(this.emailPackage.getCopySendAddresses()!=null){ message.addRecipients(Message.RecipientType.CC,this.emailPackage.getCopySendAddresses()); } //發送主題 message.setSubject(this.emailPackage.getSubject()); //發送的時間0 message.setSentDate(new Date()); //發送內容 //message.setText(this.emailPackage.getContent().toString()); //若是說是以html方式來發送,請用下面這個方法取代setText message.setContent(getMainpart()); //發送 Transport.send(message); return true; } catch (Exception e) { e.printStackTrace(); return false; } } public EmailPackage getEmailPackage() { return emailPackage; } public void setEmailPackage(EmailPackage emailPackage) { this.emailPackage = emailPackage; } @SuppressWarnings("unused") private Multipart getMainpart(){ Multipart mainPart = new MimeMultipart(); try{ // 建立一個包含HTML內容的MimeBodyPart BodyPart html = new MimeBodyPart(); // 設置HTML內容 html.setContent(this.emailPackage.getContent().toString(), "text/html; charset=utf-8"); mainPart.addBodyPart(html); // 將MiniMultipart對象設置爲郵件內容 }catch(Exception e){ e.printStackTrace(); } return mainPart; } }
寫一個測試類EmailTest:
public class EmailTest { public static void main(String[] args) { StringBuilder content = new StringBuilder(); content.append("時間到了,自動發郵件,,我發。dd。。。我發.sdddsccccs.發發發"); boolean b = new EmailSender(new EmailPackage(content)).send(); if(!b){ System.out.println("發送子郵件不成功"); } } }
運行試試。