今天把之前写的使用JavaMail异步发送邮件的demo程序贴出来。
最近一段时间,发现新浪微博手机客户端也开始支持异步发送信息了。不管是发微博,还是评论微博,点击过“发送”按钮之后,马上会被告知“已经进入发送队列”,我觉得这明显增加了用户体验,并且这个提升也不存在任何技术困难。这样一种情况,比如我发一个带图的微博消息,在不使用wifi的情况下,上传一个稍大些的图片可能会耗费不少时间。假如微博客户端不支持异步发送,也许就因为图片的上传,这个客户端得卡上好半天,直到上传完成为止。这种完全阻塞的方式,对用户来说可不是种好的体验。
发送邮件的时候同样存在着类似上面的情况。整个邮件的发送过程是比较耗时的,假如使用普通的单线程串行处理方式,当并发量大时,必然带来灾难性的后果。在下面的例子中,我使用多线程的方式来解决这个问题,使得邮件支持异步发送。
要支持新浪微博的异步发送,可以使用多线程方式,也可以使用消息服务。我本身对于JMS的方式不太了解,因此选择了一种相对熟悉和容易实现的方式,即每个邮件发送请求都作为一个线程任务,由线程池中的线程来处理每一个邮件发送任务。
首先,介绍邮件的JavaBean对象Mail。很简单,无需赘言。
- package org.tang.financial.domain;
-
- import java.util.List;
-
- public class Mail {
- /**
- * 发送人
- */
- 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;
- }
-
- }
其次,是邮件发送程序当中需要用到的常量。各个常量的含义都已经有说明,也无需赘言。
- 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服务器是否需要通过授权。可选值为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";
- /**
- * 是否打开程序调试。可选值包括true和false
- */
- public static final String MAIL_DEBUG = "mail.debug";
- }
接着,是邮件发送程序需要使用到得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
最后,邮件发送的处理程序。
|