带你走进EJB--MDB实现发送邮件(1)
在实际的项目中我们有这样的需求,用户注册网站成功之后系统会自动的给注册用户发送注册成功通知邮件,而发送通知邮件的具体过程我们可以通过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来实现发送邮件.