今天把之前寫的使用JavaMail異步發(fā)送郵件的demo程序貼出來。
最近一段時間,發(fā)現(xiàn)新浪微博手機客戶端也開始支持異步發(fā)送信息了。不管是發(fā)微博,還是評論微博,點擊過“發(fā)送”按鈕之后,馬上會被告知“已經(jīng)進入發(fā)送隊列”,我覺得這明顯增加了用戶體驗,并且這個提升也不存在任何技術困難。這樣一種情況,比如我發(fā)一個帶圖的微博消息,在不使用wifi的情況下,上傳一個稍大些的圖片可能會耗費不少時間。假如微博客戶端不支持異步發(fā)送,也許就因為圖片的上傳,這個客戶端得卡上好半天,直到上傳完成為止。這種完全阻塞的方式,對用戶來說可不是種好的體驗。
發(fā)送郵件的時候同樣存在著類似上面的情況。整個郵件的發(fā)送過程是比較耗時的,假如使用普通的單線程串行處理方式,當并發(fā)量大時,必然帶來災難性的后果。在下面的例子中,我使用多線程的方式來解決這個問題,使得郵件支持異步發(fā)送。
要支持新浪微博的異步發(fā)送,可以使用多線程方式,也可以使用消息服務。我本身對于JMS的方式不太了解,因此選擇了一種相對熟悉和容易實現(xiàn)的方式,即每個郵件發(fā)送請求都作為一個線程任務,由線程池中的線程來處理每一個郵件發(fā)送任務。
首先,介紹郵件的JavaBean對象Mail。很簡單,無需贅言。
- 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ā)送程序當中需要用到的常量。各個常量的含義都已經(jīng)有說明,也無需贅言。
- package org.tang.financial.mail;
-
- public abstract class MailProperties {
- /**
- * SMTP服務器
- */
- public static final String MAIL_SMTP_HOST = "mail.smtp.host";
- /**
- * SMTP服務器端口號
- */
- public static final String MAIL_SMTP_PORT = "mail.smtp.port";
- /**
- * 登錄SMTP服務器是否需要通過授權??蛇x值為true和false
- */
- public static final String MAIL_SMTP_AUTH = "mail.smtp.auth";
- /**
- * 登錄SMTP服務器默認郵箱賬號
- */
- public static final String MAIL_SMTP_USER = "mail.smtp.user";
- /**
- * 登錄SMTP服務器默認郵箱賬號對應密碼
- */
- 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屬性配置文件。各個鍵值的含義參考上面的說明。
- 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ā)送的處理程序。
|