在实际的项目中我们有这样的需求,用户注册网站成功之后系统会自动的给注册用户发送注册成功通知邮件,而发送通知邮件的具体过程我们可以通过MDB来实现.

在用MDB来实现发送通知过程之前我们需要先了解一下JavaMail.

JavaMail是JavaEE规范之一,用于连接E-mail系统,允许Java程序员使用JavaMail  API来收取、发送电子邮件.JavaMail定义了一组支持各种E-mail协议的即插即用API,支持E-mail协议包括POP3、IMAP4和SMTP等。JavaMailAPI与具体的邮件服务供应商无关,而是提供一种开放的、简单的E一mail系统开发环境。通过JavaMail为应用程序增加邮件支持也非常方便。

关于JavaMail的下载和安装读者可以自己通过网络搜索并下载安装,在下面的例子介绍中主要用到了两个Jar包.一个是JavaMail的mail.java,另一个是JAF框架下的activation.jar.有这个两个Java包我们就可以完成下面的一个发送邮件的小例子.

JavaMail中有很多的接口和类,这里不再一一介绍,读者可以查看API文档,主要用到的接口和类会在例子中使用.

接下来我们将会通过JavaMail来进行发送通知邮件,整体的过程主要是下面四步:

1 创建邮件的Session实例

2 通过Session实例为参数创建MimeMessage对象.

3 给MineMessage对象设置合适的属性

4 使用抽象类Transport的send 和sendMessage方法发送email.

首先引入上面所提到的两个关键的Java包,然后建立一个SendMail类.为了更容易大家的阅读,我将这个类里的内容进行分开展示,注: 以下内容都在SendMail类中.

1 下面内容主要是发送邮件所需要的相关信息属性,以及构造参数.

// 收件人地址。
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 SendMail() { } public SendMail(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;
}

2  下面的方法是将邮件的主题转换为中文.

/**
* 把邮件主题转换为中文
*
* @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;
}

3  下面的方法是将邮件的附件添加到List集合中.

/**
* 增加附件,将附件文件名添加到List集合中.
*
* @param name
*/
public void attachfile(String name) {
attachments.add(name);
}

4  发送邮件方法(里面有上面所提到的四步).

/**
* 发送邮件
* @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;
}

5  客户端调用SendMail类发送邮件.

public static void main(String[] args) {
SendMail sendMail = new SendMail();
//设置smtp服务器地址
sendMail.setSmtpServer("smtp.163.com");
//设置登录的用户名
sendMail.setUsername("用户名");
//设置登录密码
sendMail.setPassword("发送邮件的密码");
//设置收件人地址
sendMail.setTo("收件人@qq.com");
//设置发送人地址
sendMail.setFrom("发件人@163.com");
//设置标题
sendMail.setSubject("测试邮件!");
//设置邮件内容
sendMail.setContent("这是第一份测试邮件."); List<String> attachments= new ArrayList<>();
attachments.add("src/com/jnqqls/mail/SendMail.java"); sendMail.setAttachments(attachments);
if (sendMail.send()) {
System.out.println("恭喜邮件发送成功");
}else{
System.out.println("邮件发送失败");
} }

运行客户端我们会看到控制台的输出:

打开我的收件箱会看到如下邮件,附件为此SendMail的java类.

此时我们已经完成了一个JavaMail的发送邮件通知的过程,但这仅仅是一个Demo,在实际的项目过程中往往有具体的需求,接下来的文章我们将模拟在实际的项目中如果通过MDB来实现发送邮件.

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

  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. auth tips

    https://scotch.io/tutorials/easy-node-authentication-setup-and-local https://scotch.io/tutorials/upg ...

  2. java的继承机制

    这次我想深入探究以下java里类的继承机制.       我们知道,继承是java设计里的一个失败的地方.高司令说过:如果让他重新设计java的话,他会把继承去掉.而java里继承到底怎么了,会这么不 ...

  3. MySQL(10):实体、实体表和外键(foreign key)

    1.实体        数据库管理系统中的各种用于数据管理方便而设定的各种数据管理对象,如:数据库表.视图.存储过程等都是数据库实体.广义上讲,这些对象中所存储的数据也是数据库实体.因为它们也是确切存 ...

  4. servlet 项目 ,,启动没问题,,但是,一请求也面就报错误。。。。求解决。。。。。。。。。。。。。各种百度,都没解决了啊。。。。。急急急急急急急急急急急急急急急急急急

    信息: Server startup in 1674 mslog4j:WARN No appenders could be found for logger (com.mchange.v2.log.M ...

  5. C# div布局

    本文讲解使用DIV+CSS布局最基本的内容,读完本文你讲会使用DIV+CSS进行简单的页面布局. 转载请标明:http://www.kwstu.com/ArticleView/divcss_20139 ...

  6. 十三、C# 事件

    1.多播委托 2.事件 3.自定义事件   在上一章中,所有委托都只支持单一回调. 然而,一个委托变量可以引用一系列委托,在这一系列委托中,每个委托都顺序指向一个后续的委托, 从而形成了一个委托链,或 ...

  7. java基础易错点总结(一)

    子类继承父类表示子类比他的父类包含更多的信息和方法 子类调用重载的构造方法时会调用父类的构造方法,super();一般如果不写的话会隐式的调用,而且每次调用都在所有语句之前. 在函数中,使用父类的地方 ...

  8. ccf集合竞价

    我不懂为什么是错误.然后零分.贴出测试. 然后即使注释掉while循环中的break部分,也是如此. #include<iostream> #include<iomanip> ...

  9. SGU 132.Another Chocolate Maniac

    时间限制:0.25s 空间限制:4M 题目: Bob非常喜欢巧克力,吃再多也觉得不够.当他的父母告诉他将要买很多矩形巧克力片为他庆祝生日时,他的喜悦是能被理解的.巧克力都是 2x1 或 1x2 的矩形 ...

  10. Extjs4 关于Store的一些操作(转)

    1.关于加载和回调的问题 ExtJs的Store在加载时候一般是延迟加载的,这时候Grid就会先出现一片空白,等加载完成后才出现数据:因此,我们需要给它添加一个提示信息! 但是Store却没有wait ...