2012-10-25 95 views
1

我想通过servlet触发我的电子邮件,但它不会触发。当我作为独立的Java应用程序运行代码时,它工作正常。以下是我的代码。
Servlet是给我的问题,从服务器,我无法触发代码电子邮件不触发

package model; 

import java.util.Date; 
import java.util.Properties; 

import javax.mail.*; 
import javax.mail.internet.AddressException; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 
import javax.naming.InitialContext; 
importjavax.naming.NamingException; 

import com.sun.xml.internal.bind.CycleRecoverable.Context; 

public class TestJavaMail 
{ 

    String userid ; 
    String password; 
    public TestJavaMail(String userid , String password) 
    { 
     this.userid = userid; 
     this.password =password; 
    } 

     public void process() 
     { 

     String[] to = {"[email protected]","[email protected]   technologies.com", 
       "[email protected]"}; 
     Properties props = new Properties(); 
     props.put("mail.transport.protocol", "smtp"); 
     props.put("mail.smtp.host", "smtp.exchangemails.com"); 
     props.put("mail.smtp.port", 25); 

     props.put("mail.smtp.user", userid); 
     props.put("mail.smtp.pass", password); 
     props.put("mail.smtp.starttls.enable", "true"); 
     props.put("mail.smtp.auth ", "true"); 

           Authenticator auth = new javax.mail.Authenticator() 
     { 
      protected PasswordAuthentication getPasswordAuthentication() 
      { 
       return new PasswordAuthentication(userid, password); 
      } 
     }; 

        Session session = Session.getDefaultInstance(props,auth); 

     try 
     { 
           MimeMessage msg = new MimeMessage(session); 
      System.out.println("Mimemessage ceated"); 
      InternetAddress[] iaFrom = { new InternetAddress( 
        "[email protected]") }; 
      msg.setFrom(iaFrom[0]); 
      InternetAddress[] iaTo = new InternetAddress[to.length] ; 
      for(int i=0;i<to.length;i++) 
      { 
       iaTo[i] = new InternetAddress(to[i]); 
       msg.addRecipient(Message.RecipientType.TO, iaTo[i]); 
      } 

      msg.setSubject("Test Java Mail"); 
      msg.setSentDate(new Date()); 
      msg.setText("Hello, Congrats - It is working\n pls send acknowledgement mail to senderof u get this" + 
        "\n as it is part of project"); 
      Transport tran = session.getTransport("smtp"); 
      System.out.println("Transport object created......"); 
      //tran.setStarttls(true); 
      tran.connect("smtp.exchangemails.com", 25, "[email protected]   technologies.com", "welcome"); 
      //tran.connect(); 
      msg.saveChanges(); 
      System.out.println("Connect succeeded"); 
      tran.sendMessage(msg, msg.getAllRecipients()); 
      tran.close(); 
      System.out.println("Mail Sent Successfully"); 
     } 
     catch (MessagingException mex) 
     { 
      System.out.println("send failed, exception: " + mex); 
     } 
         } 
} 

下面是servlet代码:

package com.controller; 

import java.io.*; 
import java.io.PrintWriter; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import model.TestJavaMail; 
/** 
* Servlet implementation class emailservice 
*/ 
    public class emailservice extends HttpServlet { 


    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws  ServletException, IOException { 
     res.setContentType("text/html"); 
     System.out.println("here"); 

      PrintWriter writer = res.getWriter(); 
      writer.println("HELLO WORLD"); 
      String h = "hello"; 

      writer.println("" +h); 

      writer.println("welcome "); 

      writer.println(req.getRemoteHost()); 




     String userid = getServletConfig().getInitParameter("userid"); 
     String password = getServletConfig().getInitParameter("password"); 
     writer.println(userid);  
     TestJavaMail t1 = new TestJavaMail(userid, password); 

     t1.process(); 
     writer.println("\n bhej di "); 


    } 


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    } 

} 
+1

大部分代码似乎被注释掉了。请改善您的代码的格式,使其更具可读性。并且请将其缩减为了解您的问题所需的内容。 – 2012-10-25 10:30:22

+0

可以告诉我,如果我的servlet代码可以调用process()method.only,我已经评论了我的主要方法 – Monis

+0

编辑了代码 – Monis

回答

0

我试图运行你的代码为我自己,看看会发生什么。首先,我确定我在类路径中有mail.jar文件。其次,我做了一些必要的更改,以便能够在没有获取认证错误的情况下运行代码。即的,而不是:

props.put("mail.smtp.host", "smtp.exchangemails.com"); 

我用:

props.put("mail.smtp.host", "smtp.gmail.com"); 

,显然,我必须为这个不同的主机提供我自己的用户名和密码。

你是对的;该应用程序在单独执行时运行良好。但是,当我将它移动到JBoss AS 7.0.0时,我遇到了两个不同的问题。

起初,我面对这个错误:

at javax.mail.Session.getDefaultInstance(Session.java:320) [mail-1.4.4.jar:1.4.4] 
at test.TestJavaMail.process(TestJavaMail.java:42) [classes:] 

其中一些谷歌上搜索,并找到解决方案给出here后,我能摆脱这种错误的。即,我换成这一行:

Session session = Session.getDefaultInstance(props, auth); 

有:

Session session = Session.getInstance(props, auth); 

于是,我试图再次运行该应用程序。这一次,我收到以下错误:

java.lang.NoClassDefFoundError: javax/net/ssl/SSLPeerUnverifiedException 
    com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1900) 
    com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:638) 
    javax.mail.Service.connect(Service.java:295) 
    test.TestJavaMail.process(TestJavaMail.java:63) 

我用谷歌搜索上面的错误,发现there was a bug with my used JBoss version。所以,我将应用程序移动到了JBoss版本,该版本是JBoss AS 7.1.1,并且我成功了。这个servlet成功地发送了一封邮件到我为它提供的目的地。

我希望这项调查会对你和任何正在为类似问题苦苦挣扎的访问者有所帮助。