接上篇,在业务逻辑中已经发送JMS消息,而接下来的消息驱动Bean作为JMS消息监听器,主要是负责监听指定的JMS消息,此时已经接受到JMS的消息,那么MDB的onMessage()方法会被触发.调用SimpleMailSender类,发送邮件.

	import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.MapMessage;
import javax.jms.Message; import org.jnqqls.auction.util.SimpleMailSender; @MessageDriven(activationConfig = {
/* 指定MDB所监听消息目的的类型 */
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
/* 指定MDB所监听的消息目的的JNDI绑定名 */
@ActivationConfigProperty(propertyName = "destiniation", propertyValue = "Queue") },
/* 让MDB的Bean实现类间接地实现MessageListener接口 */
messageListenerInterface = javax.jms.MessageListener.class,
/* 指定MDB所监听的消息目的的JNDI绑定名 */
mappedName = "Queue")
public class MailMDB { //实现onMessage方法——当JMS消息被送达消息目的时,
//该方法被触发
public void onMessage(Message rawMsg){
try {
if(rawMsg instanceof MapMessage){
//将消息强制转换为MapMessage
MapMessage msg=(MapMessage) rawMsg;
String mailTo=msg.getString("mailTo");
String userName=msg.getString("userName");
//准备发送邮件
SimpleMailSender simpleMailSender = new SimpleMailSender();
//设置smtp服务器地址
simpleMailSender.setSmtpServer("smtp.163.com");
//设置登录的用户名
simpleMailSender.setUsername("用户名");
//设置登录密码
simpleMailSender.setPassword("密码");
//设置收件人地址
simpleMailSender.setTo(mailTo);
//设置发送人地址
simpleMailSender.setFrom("发件人地址");
//设置标题
simpleMailSender.setSubject("注册通知");
//设置邮件内容
simpleMailSender.setContent("亲爱的" +userName
+ ", 您注册网站成功!
); if (simpleMailSender.send()) {
System.out.println("恭喜邮件发送成功");
}else{
System.out.println("邮件发送失败");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

以上内容完成了对消息的接受和处理,并且调用JavaMail的相关工具类,这里是指的SimpleMailSender类,完整的将此类写在下面.

	import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties; import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
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 SimpleMailSender { // 收件人地址。
private String to;
// 发件人地址
private String from;
// SMTP服务器
private String smtpServer;
// 登录服务器用户名.
private String username;
// 登录服务器密码
private String password;
// 邮件主题
private String subject;
// 邮件正文.
private String content; // 记录附件集合.
List<String> attachments = new ArrayList<>(); public String getTo() {
return to;
} public void setTo(String to) {
this.to = to;
} public String getFrom() {
return from;
} public void setFrom(String from) {
this.from = from;
} public String getSmtpServer() {
return smtpServer;
} public void setSmtpServer(String smtpServer) {
this.smtpServer = smtpServer;
} 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 getSubject() {
return subject;
} public void setSubject(String subject) {
this.subject = subject;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
} public List<String> getAttachments() {
return attachments;
} public void setAttachments(List<String> attachments) {
this.attachments = attachments;
} // 无参数的构造器.
public SimpleMailSender() { } public SimpleMailSender(String to, String from, String smtpServer, String username,
String password, String subject, String content) {
super();
this.to = to;
this.from = from;
this.smtpServer = smtpServer;
this.username = username;
this.password = password;
this.subject = subject;
this.content = content;
} /**
* 把邮件主题转换为中文
*
* @param strText
* @return
*/
public String transferChinese(String strText) {
try {
strText = MimeUtility.encodeText(new String(strText.getBytes(),
"GB2312"), "GB2312", "B");
} catch (Exception e) {
e.printStackTrace();
}
return strText;
} /**
* 增加附件,将附件文件名添加到List集合中.
*
* @param name
*/
public void attachfile(String name) {
attachments.add(name);
} /**
* 发送邮件
* @return
*/
/**
* @return
*/
public boolean send(){
//创建邮件Session所需要的Properties对象
Properties props = new Properties();
props.put("mail.smtp.host", smtpServer);
props.put("mail.smtp.auth", "true"); //创建Session对象
Session session= Session.getDefaultInstance(props
//以匿名内部类的形式创建登录服务器的认证对象.
,new Authenticator() {
public PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(username, password);
}
}); try {
//构造MimeMessage并设置相关属性.
MimeMessage msg = new MimeMessage(session);
//设置发件人
msg.setFrom(new InternetAddress(from));
//设置收件人
InternetAddress[] addresses={new InternetAddress(to)};
msg.setRecipients(Message.RecipientType.TO, addresses);
//设置邮件主题
subject = transferChinese(subject);
msg.setSubject(subject);
//构造Multipart
Multipart mp = new MimeMultipart();
//向 Multipart中 添加正文
MimeBodyPart mbpContext = new MimeBodyPart();
mbpContext.setText(content);
//将BodyPart添加到Multipart容器中.
mp.addBodyPart(mbpContext);
//向Multipart添加附件.
//遍历附件列表,将所有的文件添加到邮件消息里
for (String efile : attachments) {
MimeBodyPart mbpFile = new MimeBodyPart();
//通过文件名创建FileDataSource对象.
FileDataSource fds = new FileDataSource(efile);
//处理附件
mbpFile.setDataHandler(new DataHandler(fds));
mbpFile.setFileName(fds.getName());
//将bodypart添加到Multipart容器中.
mp.addBodyPart(mbpFile);
}
//清空附件列表
attachments.clear();
//向Multipart添加MimeMessage
msg.setContent(mp);
//设置发送日期
msg.setSentDate(new Date());
//发送邮件
Transport.send(msg); } catch (MessagingException mex) {
mex.printStackTrace();
return false; }
return true;
} }

通过以上的四个步骤,我们基本上完成了用JavaMail来发送邮件通知的业务需求,当然,读者也可以根据JavaMail的相关API来实现接收邮件.这样就类似一个迷你的邮箱系统了.

带你走进EJB--MDB实现发送邮件(3)的更多相关文章

  1. 带你走进EJB--MDB

    在之前的文章中我们介绍了带你走进EJB--JMS 和 带你走进EJB--JMS编程模型 对JMS有了初步的了解, 作为EJB系列的文章我们会继续对EJB相关的内容做进一步深的学习和了解.而此次需要进行 ...

  2. 小丁带你走进git的世界三-撤销修改

    一.撤销指令 git checkout还原工作区的功能 git reset  还原暂存区的功能 git clean  还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们 g ...

  3. 小丁带你走进git的世界二-工作区暂存区分支

    小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git  init git  clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...

  4. 小丁带你走进git世界一-git简单配置

    小丁带你走进git世界一-git简单配置 1.github的简单配置 配置提交代码的信息,例如是谁提交的代码之类的. git config  –global user.name BattleHeaer ...

  5. 老司机带你走进Core Animation

    为什么时隔这么久我又回来了呢? 回来圈粉. 开玩笑的,前段时间ipv6被拒啊,超级悲剧的,前后弄了好久,然后需求啊什么的又超多,所以写好的东西也没有时间整理.不过既然我现在回来了,那么这将是一个井喷的 ...

  6. 带你走进rsync的世界

    导读 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录.rsync共有3种使用方 ...

  7. 小丁带你走进git的世界三-撤销修改(转)

    一.撤销指令 git checkout还原工作区的功能 git reset  还原暂存区的功能 git clean  还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们 g ...

  8. Miox带你走进动态路由的世界——51信用卡前端团队

    写在前面: 有的时候再做大型项目的时候,确实会被复杂的路由逻辑所烦恼,会经常遇到权限问题,路由跳转回退逻辑问题.这几天在网上看到了51信用卡团队开源了一个Miox,可以有效的解决这些痛点,于是乎我就做 ...

  9. 带你走进CSS定位详解

    学习CSS相关知识,定位是其中的重点,也是难点之一,如果不了解css定位有时候都不知道怎么用,下面整理了一下关于定位属性的具体理解和应用方案. 一:定位 定位属性列表 position top bot ...

  10. 大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5)

                                                        大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5) 上一节中,我们讲 ...

随机推荐

  1. SQLserver中的常量与变量、判断循环语句

    数据库中的变量与常量 数据库中定义变量 [起临时存储数据的作用] ---数据库中定义变量(运行时要从头到尾进行运行,从定义变量开始到赋值) --前面必须加 declare --定义变量 :    de ...

  2. ASP.NET生成日历

    public string GetDayList(DateTime? date) { ; var minDate = Convert.ToDateTime(((DateTime)(date ?? Da ...

  3. UITabBar - 深度解剖

    for (UIView *tabbarbutton in self.subviews) { //        NSLog(@"%@",tabbarbutton);         ...

  4. ios7之后 根据UILabel的文字计算frame的方法

    ios7 新出来的根据label的文字和字体大小来确定label的宽高. 官方的方法是: - (CGRect)boundingRectWithSize:(CGSize)size options:(NS ...

  5. C# ACM poj1006

    中国剩余定理 public static void acm1006(int a, int b, int c, int d) { * ; * ; * ; * * ; ) * z; ) * y; ) * ...

  6. Php 的替代语法

    替代语法 为什么会有替代语法:     php是嵌入在html文档中的脚本语言,Php可以动态生成html标签,但是php主要功能并不是生成html标签,主要用于动态的生成数据(数据库中的数据).如果 ...

  7. C++重写与重载、重定义

    文章引用自:http://blog.163.com/clevertanglei900@126/blog/static/111352259201102441934870/ 重载overload:是函数名 ...

  8. config spec

    config_spec Rules for selecting versions of elements to appear in a view APPLICABILITY Product Comma ...

  9. How to enable $Admin Shares in Windows 7

    Quote from: http://www.wintips.org/how-to-enable-admin-shares-windows-7/ As “Administrative shares” ...

  10. Error 1937.An error occurred during the installation of assembly...

    工具:Installshield 2008 任务: 1. 创建一个 Merge Module 工程, 在 Merge Module 中包含若干 dll, 在安装过程中,dll 会被安装到指定路径. 2 ...