【问题标题】:Java send mail, Takes time in ActivationJava 发送邮件,激活需要时间
【发布时间】:2014-11-13 10:11:12
【问题描述】:

我需要使用 Gmail 的 SMTP 和 javax.mail api 发送邮件。 我正在使用的相同代码在 Android 中成功运行,如果我将它带到 Java 应用程序或尝试在 Java Web 应用程序中使用它,它就会开始制造麻烦。 我花时间试图了解有什么区别,但没办法! 我的代码如下:

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("myEmail@gmail.com", "my password");
        try {
            sender.sendMail("Test", "alot of data", "myEmail@gmail.com", "someonesemail@gmail.com");
        } 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)

任何人都可以帮助我! 谢谢。

【问题讨论】:

标签: java android email servlets jakarta-mail


【解决方案1】:

您的代码中有很多错误。从这里开始修复most common mistakes

之后,请参阅connection debugging tips 的 JavaMail 常见问题解答。如果您无法弄清楚,请在此处发布调试输出。

【讨论】:

    【解决方案2】:

    太棒了! 感谢所有试图提供帮助的人。

    解决方案有点奇怪!我刚刚将我的 JRE 和 JDK 降级到 1.6,这解决了问题! 它可能与 Java 1.7 环境有关。

    不管怎样,谢谢你一如既往的棒:)

    【讨论】:

      【解决方案3】:

      好的,你使用的是 465 端口,所以启用 ssl mail.smtp.ssl.enabletrue

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

      如果它不起作用,则使用properties.put("mail.smtp.starttls.enable", "true"); 并将端口更改为587 看看是否有帮助。

      【讨论】:

      • ssl enable 没有帮助,我仍然得到相同的错误代码,添加您建议返回的 TLS 属性:javax.mail.MessagingException:无法将套接字转换为 TLS;嵌套异常是:java.net.SocketException:java.security.NoSuchAlgorithmException:构造实现时出错(算法:默认,提供者:SunJSSE,类:sun.security.ssl.SSLContextImpl$DefaultSSLContext) 根据您的建议,我的属性现在如下:
      • 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");
      猜你喜欢
      • 2013-04-17
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多