在web中实现邮件发送功能

在web站点中也可以集成邮件客户端软件的功能,以便web站点的注册用户可以通过web页面来收发电子邮件,例如,sina和sohu等大型门户网站都会为会员提供了通过web页面来收发电子邮件的功能。对于一些中小型的web站点来说,虽然不需要为其会员提供web页面的电子邮件收发功能,但是,这些站点确很可能需要为自己提供向注册用户发送邮件的功能,例如,web站点自动给新注册的用户发送一封包含其注册信息的欢迎Email,给过生日的注册会员自动发送一封表示祝贺的Email,将网站的最新活动信息通过Email发送给所有的注册会员等。本节主要讲解如何实现在中小型的WEB站点中实现邮件发送功能,要在web站点中实现邮件发送功能的工作其实也很简单,只要将普通的邮件发送程序改写成一个web应用程序就可以了,只是web站点中的邮件发送程序通常会使用自己站点的SMTP服务器来对外发送邮件,web站点发送邮件的过程如下图所示:

在web中实现邮件发送功能_第1张图片

 

从上图可以看出,浏览器通过访问web站点中的邮件发送程序来提交邮件发送请求,邮件发送程序将把邮件发送给自己网站的SMTP服务器,该SMTP服务器收到邮件后,将根据收件人的地址在将邮件的目的地,要么是投递到本地域管理的收件人邮箱中,要么是转交给管理收件人地址域的其他SMTP服务器。

一些web服务器程序专门提供了对邮件发送功能的一些支持,例如,tomcat提供了通过配置方式来创建javax.mail.session对象的功能,javax.mail.session类用于定义整个应用程序所需的环境,编写javaMail程序的第一步就是创建出Session对象,Tomcat中提供了一个专门用于创建的javax.mail.Session对象的资源工厂,使得javax.mail.session对象可以作为Tomcat中的一种JNDI资源进行配置,Tomcat启动时将根据配置信息创建出Session对象并将其注册到JNDI环境中,在web应用程序则可以通过JNDI的方式引用这个Session对象,这种做法的好处在于,可以通过配置文件的方式设置邮件服务器的连接信息,使用javaMail的web应用程序自身不需要在考虑邮件服务器的信息的设置,而是简单的通过JNDI获得在Tomcat中预先配置好的Session对象即可,如果要更改服务器的信息,只需要修改Tomcat的配置文件,不需要修改使用javaMail的WEB应用程序,这样也有利于使用JavaMail的WEB应用程序在具有不同邮件服务环境的Tomcat服务器之间移植。

 

下面是在web中实现邮件发送功能的例子:

1.先为Tomcat配置javaMail的JNDI环境:

可以在Tomcat环境中的context.xml中配置,这样配置就是整个tomcat环境中都配置了这个JNDI,而另外一种是是在项目中配置,在WEB应用程序的META-INF目录中的context.xml内设置元素的方式,这里选择这种方式来设置Session资源,在WEB应用程序的根目录下创建一个META-INF目录,接着在该目录中按程序创建一个名为context.xml的文件,文件内容如下:

        name="mail/Session"

        auth="Container"

       type="javax.mail.Session"

       mail.smtp.host="smtp.sina.com"

       mail.transport.protocol="smtp"

       mail.smtp.auth="true"

/>

在web应用程序内创建context.xml文件后,Tomcat服务器在启动这个web应用程序时,将根据元素中设置的JavaMail属性信息创建javax.mail.Session实例对象,并将Session实例对象注册到Tomcat的JNDI环境中,注册名称为"mail/session".Session对象的实例化工作实际是有Tomcat服务器在启动WEB应用程序时调用一个工厂类来完成的,该工厂类的完整名为:org.apache.naming.factory.MailSessionFactory,MailSessionFactory负责根据元素的配置信息创建Session实例对象。

 

2.web应用程序从理论上来说是不依赖具体的web服务器程序的,一个web应用程序可以发布到Tomcat服务器程序中运行,也应该能够发布到weblogic等其他的web服务器程序中运行。由于当前web应用程序引用了特定的web服务器程序创建资源,我们最好还是在web.xml文件中声明对web应用程序所引用web服务器程序创建的资源进行声明,以表明将当前web应用程序迁移至其他web服务器程序时,在其他web服务器程序上也应该创建此资源,对于上述创建的Session资源,在WEB应用程序的web.xml文件的相应位置处添加如下代码:

   ........

  

     mail/Session  

    javax.mail.Session

    Container

 

根据web.xml文件的DTD或schema即可知道元素的插入位置,特别是插入位置有错时,Tomcat启动时将提示其错误信息,事实上,在Tomcat环境下,在web.xml文件中配置元素的这个步骤是可以省略的,这里之所以在web.xml文件进行这样的声明,主要是为了明确告诉web服务器程序,这个web应用程序需要引用web服务器上的资源,web服务器必须创建好这个资源。

 

3.将包含JavaMail API的jar和包含JAF  API的jar包安装到/common/lib目录中,这是由于Tomcat服务器创建javax.mail.Session实例对象时需要用到JavaMail API,在WEB应用程序中也需要使用JavaMail API来创建邮件内容和发送邮件,所以这里需要将包含JavaMail API和JAF API的jar包放置到/common/lib目录中,而不是放置在WEB应用程序的WEB-INF/lib目录中。

 

下面是一个例子代码:

 

 

package com.codebbs.action;


import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author jt
 *2015-11-12 下午9:34:39
 *javaWEB发送邮件
 */
public class SendMailServlet extends HttpServlet {

 
 @Override
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  String smtpServer="smtp.sina.com";//邮件服务器主机名
  String protocol="smtp";
  String username="邮箱账户";
  String password="邮箱密码";
  String from="发送人邮箱地址";
  String to="收件人邮箱地址";
  String subject="test";
  String body="蒋航";
  
  //获取Session对象
  try {
   Context iniCtx=new InitialContext();
   Context envCtx=(Context) iniCtx.lookup("java:comp/env");
   Session session=(Session) envCtx.lookup("mail/Session");
   
   //创建代表邮件的MimeMessage对象
   MimeMessage msg=new MimeMessage(session);
   msg.setFrom(new InternetAddress(from));
   msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
   msg.setSentDate(new Date());
   msg.setSubject(subject);
   msg.setText(body);
   msg.saveChanges();
   
   Transport transport=session.getTransport();
   transport.connect(smtpServer, username, password);
   transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
   transport.close();
   
   response.setContentType("text/html;charset=UTF-8;");
   PrintWriter out=response.getWriter();
   out.println("你的邮件已经发出!");
   
   
  } catch (NamingException e) {
   e.printStackTrace();
  } catch (AddressException e) {
   e.printStackTrace();
  } catch (MessagingException e) {
   e.printStackTrace();
  }
 }

 
 @Override
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
   this.doGet(request, response);
 }
 
}

上面编写的javaMail的Servlet显然只是演示在web应用程序中发送电子邮件的简单例子,其中的收件人地址,邮件主题,邮件内容等信息硬是被编码带程序代码之中,这显然没有什么实际应用价值,在实际应用中,编写的web邮件发送程序绝对不会像这个SendMailServlet程序这么简单,至少要提供一个邮件内容的撰写页面,在这个页面中填写邮件的基本信息,然后将这些信息提供给SendMailServlet程序处理,在SendMailServlet程序获取这些信息并根据这些信息创建代表邮件内容的MimeMessage对象,在将这个MimeMessage对象中的邮件内容发送出去,如果愿意还可以在web应用程序提供如下更多的功能:

1.为邮件添加附加和内嵌内容。这需要在邮件撰写页面中选择作为邮件附件的多个文件和作为内嵌图片的多个图片文件,这些文件必须上传到WEB服务器后,web应用程序才能将它们的内容插入到整封MIME邮件消息中,这就涉及到文件的上传的编程处理。

2.在HTML邮件正文中引用内嵌图片时要考虑引用路径的问题,用户在撰写HTML邮件正文中的标签时,无法很好的确定其SRC属性值,这必须通过编程设计来解决,最好是在进行图片插入操作时,上传图片文件后自动填写好标签的内容,这就涉及到更多的编程技巧和生成MIME消息的更多细节。

3.在发送邮件之前,还应该具有对邮件进行预览的功能,这有涉及到邮件解析与显示的问题。

4.可以批量指定收件人地址进行邮件群发,发件人地址可以通过指定一些查询条件从数据库中获得,也可以从文本文件导入,如何实现批量发送?是一次指定多个收件人进行邮件发送,还是对每个收件人单独进行邮件发送,或者对收件人进行分组,一次发送一组,分组的大小设置为多少比较合适呢?这都是需要仔细考虑的策略问题。

5.对邮件内容的大小进行限制,对发送失败的邮件进行日志记录等细小的功能等。

 

思考与实践:

将同一封邮件同时发送给多个收件人,即在调用Transport.sendMessage方法时,为其指定多个收件人地址,然后查看JavaMail API在这种情况下打印出的调试信息,以了解JavaMail API是如何实现将同一封邮件发送给多个收件人的底层细节。在调用Transport.sendMessage方法的语句和调用Transport.claose方法的语句之间增加一些程序代码,这些代码修改邮件消息的内容,然后再次调用Transport.sendMessage方法发送修改后的邮件,查看JavaMail API在这种情况下打印的调式信息,以了解JavaMail API是如何实现在同一个TCP连接上向SMTP服务器发送多封邮件的底层实现细节,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(javaMail学习)