今天把之前寫的使用JavaMail異步發(fā)送郵件的demo程序貼出來(lái)。
最近一段時(shí)間,發(fā)現(xiàn)新浪微博手機(jī)客戶端也開始支持異步發(fā)送信息了。不管是發(fā)微博,還是評(píng)論微博,點(diǎn)擊過(guò)“發(fā)送”按鈕之后,馬上會(huì)被告知“已經(jīng)進(jìn)入發(fā)送隊(duì)列”,我覺得這明顯增加了用戶體驗(yàn),并且這個(gè)提升也不存在任何技術(shù)困難。這樣一種情況,比如我發(fā)一個(gè)帶圖的微博消息,在不使用wifi的情況下,上傳一個(gè)稍大些的圖片可能會(huì)耗費(fèi)不少時(shí)間。假如微博客戶端不支持異步發(fā)送,也許就因?yàn)閳D片的上傳,這個(gè)客戶端得卡上好半天,直到上傳完成為止。這種完全阻塞的方式,對(duì)用戶來(lái)說(shuō)可不是種好的體驗(yàn)。
發(fā)送郵件的時(shí)候同樣存在著類似上面的情況。整個(gè)郵件的發(fā)送過(guò)程是比較耗時(shí)的,假如使用普通的單線程串行處理方式,當(dāng)并發(fā)量大時(shí),必然帶來(lái)災(zāi)難性的后果。在下面的例子中,我使用多線程的方式來(lái)解決這個(gè)問(wèn)題,使得郵件支持異步發(fā)送。
要支持新浪微博的異步發(fā)送,可以使用多線程方式,也可以使用消息服務(wù)。我本身對(duì)于JMS的方式不太了解,因此選擇了一種相對(duì)熟悉和容易實(shí)現(xiàn)的方式,即每個(gè)郵件發(fā)送請(qǐng)求都作為一個(gè)線程任務(wù),由線程池中的線程來(lái)處理每一個(gè)郵件發(fā)送任務(wù)。
首先,介紹郵件的JavaBean對(duì)象Mail。很簡(jiǎn)單,無(wú)需贅言。
- package org.tang.financial.domain;
-
- import java.util.List;
-
- public class Mail {
- /**
- * 發(fā)送人
- */
- private String sender;
- /**
- * 收件人
- */
- private List<String> recipientsTo;
- /**
- * 抄送人
- */
- private List<String> recipientsCc;
- /**
- * 密送人
- */
- private List<String> recipientsBcc;
- /**
- * 主題
- */
- private String subject;
- /**
- * 正文
- */
- private String body;
- /**
- * 附件列表
- */
- private List<String> attachments;
-
-
- public String getSender() {
- return sender;
- }
- public void setSender(String sender) {
- this.sender = sender;
- }
- public List<String> getRecipientsTo() {
- return recipientsTo;
- }
- public void setRecipientsTo(List<String> recipientsTo) {
- this.recipientsTo = recipientsTo;
- }
- public List<String> getRecipientsCc() {
- return recipientsCc;
- }
- public void setRecipientsCc(List<String> recipientsCc) {
- this.recipientsCc = recipientsCc;
- }
- public List<String> getRecipientsBcc() {
- return recipientsBcc;
- }
- public void setRecipientsBcc(List<String> recipientsBcc) {
- this.recipientsBcc = recipientsBcc;
- }
- public String getSubject() {
- return subject;
- }
- public void setSubject(String subject) {
- this.subject = subject;
- }
- public String getBody() {
- return body;
- }
- public void setBody(String body) {
- this.body = body;
- }
- public List<String> getAttachments() {
- return attachments;
- }
- public void setAttachments(List<String> attachments) {
- this.attachments = attachments;
- }
-
- }
其次,是郵件發(fā)送程序當(dāng)中需要用到的常量。各個(gè)常量的含義都已經(jīng)有說(shuō)明,也無(wú)需贅言。
- package org.tang.financial.mail;
-
- public abstract class MailProperties {
- /**
- * SMTP服務(wù)器
- */
- public static final String MAIL_SMTP_HOST = "mail.smtp.host";
- /**
- * SMTP服務(wù)器端口號(hào)
- */
- public static final String MAIL_SMTP_PORT = "mail.smtp.port";
- /**
- * 登錄SMTP服務(wù)器是否需要通過(guò)授權(quán)??蛇x值為true和false
- */
- public static final String MAIL_SMTP_AUTH = "mail.smtp.auth";
- /**
- * 登錄SMTP服務(wù)器默認(rèn)郵箱賬號(hào)
- */
- public static final String MAIL_SMTP_USER = "mail.smtp.user";
- /**
- * 登錄SMTP服務(wù)器默認(rèn)郵箱賬號(hào)對(duì)應(yīng)密碼
- */
- public static final String MAIL_SMTP_PASSWORD = "mail.smtp.password";
- /**
- * 是否打開程序調(diào)試??蛇x值包括true和false
- */
- public static final String MAIL_DEBUG = "mail.debug";
- }
接著,是郵件發(fā)送程序需要使用到得properties屬性配置文件。各個(gè)鍵值的含義參考上面的說(shuō)明。
- mail.smtp.host = smtp.example.com
- mail.smtp.port = 25
- mail.smtp.auth = true
- mail.smtp.user = username@example.com
- mail.smtp.password = password
- mail.debug = true
最后,郵件發(fā)送的處理程序。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。