通过JDNI来支持java mail

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);

   

   }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值