通过JDNI来支持java mail

来源:互联网 发布:网络化妆课程 编辑:程序博客网 时间:2024/06/16 20:15

Tomcat提供了jndi的方式来支持javamail的。

Tomcat在系统中配置JNDI,都是定义在$CATALINA_BASE/conf/server.xml或者每个web应用服务自己独自定义的文件META-INF/context.xml

1. 

这其中的的属性的配置和配置session中的那些属性一致。

<Context>

   <Resource name="mail/Session" auth="Container"

            type="javax.mail.Session"

            mail.smtp.host="localhost"

            mail.smtp.auth="true"

            mail.transport.protocol="smtp"/>

 </Context>

2. 

而获得session的方法如下

Context initCtx = new InitialContext();

Context envCtx = (Context) initCtx.lookup("java:comp/env");

Session session = (Session) envCtx.lookup("mail/Session");

Message message = new MimeMessage(session);

因为session的获得不是我们定义的,所以,它的初始化函数中需要Authenticator的那个,就不能使用了,而是需要让Transport来建立连接。Transport也不能直接使用send,而是要session.getTransport();这样的transport来手工建立连接

而这时候transport使用的是普通API sendMessage而不是静态API send,一定要注意

代码如下:

Transport transport = session.getTransport();

transport.connect("smtp.sina.com",25,"silencehill_wu""wugang");

transport.sendMessage(message, to);

transport.close();

如果要使用tomcat的jndi来访问邮件服务,其实就是访问session。那么这个session的产生就是tomcat容器来产生,这个不是访问web应用的lib来获得的,而是需要在容器启动的时候就创建,所以,这就需要将mail.jar放在web容器的lib中。同样的是,关于连接数据源需要jndi访问的时候,需要驱动,也是需要放到容器lib中的,比如mysql connect driver。这样才能通过jndi访问数据库的jndi。

注意出现的问题

java.lang.ClassCastException: javax.mail.Session cannot be cast to javax.mail.Session

这是因为tomcat已经有一个容器,它启动了tomcat libmail.jar,而我们的web应用程序的lib中也包括了一个mail.jar,这两个虽然一样,但是使用的是不同的类加载器,在虚拟机中是不同的位置,容器启动认为这是两个类是不一样。所以,去掉web应用中libmail.jarmailapi.jar就可以解决。

下面是整个API的例子

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

PrintWriter out = response.getWriter();

   try{

Context initCtx = new InitialContext();

Context envCtx = (Context) initCtx.lookup("java:comp/env");

Session session = (Session) envCtx.lookup("mail/Session");

Message message = new MimeMessage(session);

message.setFrom(new InternetAddress("silencehill_wu@sina.com"));

InternetAddress to[] = new InternetAddress[1];

to[0] = new InternetAddress("wugang00001@sina.com");

message.setRecipients(Message.RecipientType.TO, to);

message.setSubject("title");

message.setText("just test");

//message.setContent("", "text/plain");

//Transport.send(message);

Transport transport = session.getTransport();

transport.connect("smtp.sina.com",25,"silencehill_wu""wugang");

transport.sendMessage(message, to);

transport.close();

out.print("Ok");

out.flush();

out.close();

   }catch(Exception ex) {

ex.printStackTrace();

ex.printStackTrace(out);

   

   }

}

原创粉丝点击