2014-09-18 54 views
0

我需要使用Gmail的SMTP和javax.mail API發送郵件。 我使用的代碼,在Android中成功運行,如果我將它帶到Java應用程序或嘗試在Java Web應用程序中使用它,它會開始製造麻煩。 我花時間試圖瞭解有什麼區別,但沒辦法! 我的代碼如下:Java發送郵件,需要激活時間

public class GMailSender extends Authenticator 
{ 

    private final String mailhost; 
    private final String password; 
    private final Session session; 
    private final String user; 

    public GMailSender(String username, String password) 
    { 
     this.mailhost = "smtp.gmail.com"; 
     this.user = username; 
     this.password = password; 
     Properties properties = new Properties(); 
     properties.setProperty("mail.transport.protocol", "smtp"); 
     properties.setProperty("mail.host", mailhost); 
     properties.put("mail.smtp.auth", "true"); 
     properties.put("mail.smtp.socketFactory.port", "465"); 
     properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
     properties.put("mail.smtp.debug", "true"); 
     properties.setProperty("mail.smtp.quitwait", "false"); 

     System.out.println("Creating session ..."); 
     session = Session.getInstance(properties, this); 
     System.out.println("Session createed ..."); 
    } 

    @Override 
    protected PasswordAuthentication getPasswordAuthentication() 
    { 
     System.out.println("Authintecation ..."); 
     return new PasswordAuthentication(user, password); 
    } 

    public synchronized void sendMail(String subject, String dataHandler, String senderAddress, String recepeintAddress) 
     throws Exception 
    { 

     MimeMessage mimemessage; 
     mimemessage = new MimeMessage(session); 
     DataHandler datahandler = new DataHandler(new ByteArrayDataSource(dataHandler.getBytes(), "text/plain")); 
     mimemessage.setSender(new InternetAddress(senderAddress)); 
     mimemessage.setSubject(subject); 
     mimemessage.setDataHandler(datahandler); 
     mimemessage.setRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress(recepeintAddress)); 
     System.out.println("Sending ..."); 
     Transport transport = session.getTransport("smtp"); 
     transport.send(mimemessage); 
     System.out.println("Sent!"); 
    } 

    static { 

     Security.addProvider(new JSSEProvider()); 
    } 


    public static void main(String[] args){ 
     System.out.println("Starting email ..."); 
     GMailSender sender = new GMailSender("[email protected]", "my password"); 
     try { 
      sender.sendMail("Test", "alot of data", "[email protected]", "[email protected]"); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 


public final class JSSEProvider extends Provider { 
    private static final long serialVersionUID = 1L; 

    public JSSEProvider() { 
     super("HarmonyJSSE", 1.0, "Harmony JSSE Provider"); 
     AccessController 
       .doPrivileged(new java.security.PrivilegedAction<Void>() { 
        @Override 
        public Void run() { 
         put("SSLContext.TLS", 
           "org.apache.harmony.xnet.provider.jsse.SSLContextImpl"); 
         put("Alg.Alias.SSLContext.TLSv1", "TLS"); 
         put("KeyManagerFactory.X509", 
           "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl"); 
         put("TrustManagerFactory.X509", 
           "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl"); 
         return null; 
        } 
       }); 
    } 
} 

當我運行我的代碼,我得到了以下內容:

> Starting email ... 
> Creating session ... 
> Session createed ... 
> Sending ... 
> Authintecation ... 

然後,它需要大約10分鐘,用下面的返回:

> javax.mail.MessagingException: Could not connect to SMTP host: 
> smtp.gmail.com, port: 465, response: -1 
>   at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1379) 
>   at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:412) 
>   at javax.mail.Service.connect(Service.java:310) 
>   at javax.mail.Service.connect(Service.java:169) 
>   at javax.mail.Service.connect(Service.java:118) 
>   at javax.mail.Transport.send0(Transport.java:188) 
>   at javax.mail.Transport.send(Transport.java:118) 
>   at com.srycrm.mail.GMailSender.sendMail(GMailSender.java:66) 
>   at org.apache.jsp.send_jsp._jspService(send_jsp.java:85) 
>   at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
>   at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
>   at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) 
>   at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 
>   at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
>   at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
>   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
>   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
>   at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

任何人都可以幫助我! 謝謝。

+0

看看:http://stackoverflow.com/questions/11029444/javax-mail-messagingexception-could-not-connect-to-smtp-host,看看它是否有幫助 – user3487063 2014-09-18 22:24:03

+0

我已經看到了,這是一個不同的情況。正如你所看到的,返回的錯誤代碼是不同的,也是在創建會話之後。 – 2014-09-18 22:26:27

回答

1

好你正在使用端口465,所以啓用SSL mail.smtp.ssl.enabletrue

properties.put("mail.smtp.ssl.enable", "true");

如果它不;噸的工作,然後有properties.put("mail.smtp.starttls.enable", "true");並更改端口587,看看是否有幫助。

+0

ssl啓用沒有幫助,我仍然得到相同的錯誤代碼 添加您建議返回的TLS屬性: javax.mail.MessagingException:無法將套接字轉換爲TLS; 嵌套的例外是: \t java.net.SocketException異常:java.security.NoSuchAlgorithmException:錯誤構建的實現(算法:默認,供應商:SunJSSE,等級:sun.security.ssl.SSLContextImpl $ DefaultSSLContext) 我propreties現在因爲是遵循您的建議: – 2014-09-19 07:14:57

+0

properties.setProperty(「mail.transport.protocol」,「smtp」); properties.setProperty(「mail.host」,mailhost); properties.put(「mail.smtp.auth」,「true」); properties.put(「mail.smtp.starttls.enable」,「true」); properties.put(「mail.smtp.socketFactory.class」,「javax.net.ssl.SSLSocketFactory」); properties.put(「mail.smtp.ssl.enable」,「true」); properties.put(「mail.smtp.port」,「587」); properties.put(「mail.smtp.debug」,「true」); properties.setProperty(「mail.smtp。「quitwait」,「false」); – 2014-09-19 07:15:53

1

太棒了! 感謝所有試圖幫助的人。

該解決方案有點奇怪!我只是將我的JRE和JDK降級到1.6,這解決了問題! 它可能與Java 1.7環境有關。

無論如何,你都感謝所有像往常一樣真棒:)

相關問題