2009-12-31 213 views
2

我从这里复制代码仅用于使用Gmail SMTP服务器发送邮件。但我得到安全例外。一旦我成功发送了4封邮件,我达到了目标,但后来我根据自己的应用需求对代码进行了少许更改,并引发安全性异常。我相信它会工作,但有一些问题。使用Java邮件通过Gmail SMTP发送邮件的问题

这段代码有什么问题?

的代码是:

package com.ibm.lims; 

    import java.security.Security; 
    import java.util.Properties; 

    import javax.mail.Message; 
    import javax.mail.MessagingException; 
    import javax.mail.Multipart; 
    import javax.mail.PasswordAuthentication; 
    import javax.mail.Session; 
    import javax.mail.Transport; 
    import javax.mail.internet.InternetAddress; 
    import javax.mail.internet.MimeBodyPart; 
    import javax.mail.internet.MimeMessage; 
    import javax.mail.internet.MimeMultipart; 

    public class mails { 
     private static final String SMTP_HOST_NAME = "smtp.gmail.com"; 
     private static final String SMTP_PORT = "465"; 
     //private static final String emailMsgTxt = "robin borrowed a book"; 
     //private static final String emailSubjectTxt = "online library management system notification"; 
     private static final String emailFromAddress = "[email protected]"; 
     private static final String SSL_FACTORY ="javax.net.ssl.SSLSocketFactory"; 
     //private static final String[] sendTo = {"[email protected]","[email protected]"}; 

     public static void mailer(String[] sendTo,String emailSubjectTxt,String emailMsgTxt) throws Exception{ 
      Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); 

      new mails().sendSSLMessage(sendTo,emailSubjectTxt,emailMsgTxt,emailFromAddress); 
      System.out.println("Sucessfully Sent mail to All Users"); 
     } 

     public void sendSSLMessage(String[] recipients,String subject,String message,String from) throws MessagingException { 
      boolean debug = true; 

      Properties props = new Properties(); 
      props.put("mail.smtp.host", SMTP_HOST_NAME); 
      props.put("mail.smtp.auth", "true"); 
      props.put("mail.debug", "true"); 
      props.put("mail.smtp.port", SMTP_PORT); 
      props.put("mail.smtp.socketFactory.port", SMTP_PORT); 
      props.put("mail.smtp.socketFactory.class", SSL_FACTORY); 
      props.put("mail.smtp.socketFactory.fallback", "false"); 

      Session session = Session.getDefaultInstance(props,new javax.mail.Authenticator() { 
       protected PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication("[email protected]","weakpaasword"); 
       } 
      } 
     ); 

     MimeMessage message1 =new MimeMessage(session); 
     message1.setFrom(new InternetAddress(from)); 
     for(int i=0;i<=recipients.length;i++){ 
      message1.addRecipient(Message.RecipientType.TO,new InternetAddress(recipients[i])); 
     } 

     message1.setSubject(subject); 

     // Create the message part. 
     MimeBodyPart messageBodyPart =new MimeBodyPart(); 

     //Fill message. 
     messageBodyPart.setText(message); 

     Multipart multipart = new MimeMultipart(); 
     multipart.addBodyPart(messageBodyPart); 

     // Part two is attachment. 

     // Put parts in message 
     message1.setContent(multipart); 

     // Send the message 
     Transport.send(message1); 
     } 

    } 

我用来从JSP称其为:

<% 
     String requestedopration = request.getParameter("operation"); 
     if("Borrow".equalsIgnoreCase(requestedopration)){ 
      Borrow borrow = new Borrow(); 
      borrow.setBook_id(request.getParameter("bookid")); 
      borrow.setUser_id((String)session.getAttribute("userid")); 

      boolean c=LimsHandler.getInstance().borrowbook(borrow); 
      if(c){ 
      final String[] sendTo = {"[email protected]","[email protected]"}; 

     mails.mailer(sendTo,"lims notification","robin borrowed a book"); 

    %> 

但我得到安全例外。我得到的例外如下:

HTTP Status 500 - 

type Exception report 

message 

description The server encountered an internal error() that prevented it from fulfilling this request. 

exception 
org.apache.jasper.JasperException: java.lang.ArrayIndexOutOfBoundsException: 2 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:413) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:806) 

root cause 
java.lang.ArrayIndexOutOfBoundsException: 2 
    com.ibm.lims.mails.sendSSLMessage(mails.java:64) 
    com.ibm.lims.mails.mailer(mails.java:35) 
    org.apache.jsp.borrow_jsp._jspService(borrow_jsp.java:144) 
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:806) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:806) 

note The full stack trace of the root cause is available in the Apache Geronimo (Embedded Tomcat/6.0.20-20090724) logs. 
Apache Geronimo (Embedded Tomcat/6.0.20-20090724) 
+0

请发布这些安全例外的文本。您是否在Web应用程序服务器日志中找到这些日志,或者它们是否显示在返回的HTML页面上? – 2009-12-31 15:33:32

+2

这些是你在这篇文章中真正的凭据吗?如果我是你,我会删除那些人吗? – 2009-12-31 15:45:55

+0

我以为IBM员工有导师。 – BalusC 2009-12-31 15:55:29

回答

1

从JDK 1.4.0开始,您不需要指定SSL提供程序,因为它已内置到JDK中。 看看Sun的explanation以及如何通过JavaMail使用GMail的例子:

0

看起来你并没有为ssl设置邮件传输协议。尝试添加props.put(“mail.transport.protocol”,“smtps”);.根据JavaMail站点的这个片段,您可能需要添加“mail.smtps.auth”,“true”。

String host = "smtp.gmail.com; 
String username = "user"; 
String password = "passwd"; 
Properties props = new Properties(); 
props.put("mail.smtps.auth", "true"); 
// ... 
MimeMessage msg = new MimeMessage(session); 
// set the message content here 
Transport t = session.getTransport("smtps"); 
try { 
t.connect(host, username, password); 
t.sendMessage(msg, msg.getAllRecipients()); 
} finally { 
t.close(); 
} 

是的,方法是不同的,但使用相同的属性。

+0

对不起,mail.transport.protocol属性似乎不影响快速单元测试中的任何内容......查看java邮件源代码,它看起来像它会。 session.setProtocolForAddress(“rfc822”,“smtps”)这样做,尽管这也可以在属性文件中设置。 – 2009-12-31 20:52:52

+0

实际上,我能够发送邮件。我发送了4 5邮件。但后来发生异常。这是一个服务器问题。 String []收件人被写成字符串reciepients []在本网站提供的代码中。我改变了这是原因? – 2010-01-01 06:06:32

0

你的代码似乎很好,除了循环是错误的。使用“<”而不是“< =”,那么你将不会得到ArrayIndexOutOfBoundException。

for (int i = 0; i < recipients.length; i++) { 
    message1.addRecipient(Message.RecipientType.TO, 
    new InternetAddress(recipients[i])); 
} 
+0

PLZ帮助问题依然存在。 – 2010-01-03 19:29:20

+0

已编辑答案部分。使用“<”而不是“<=”,那么你将不会得到ArrayIndexOutOfBoundException。 – 2010-01-03 21:53:45