Commons电子邮件示例挂在send()上

时间:2011-09-29 14:13:48

标签: java email apache-commons-email

我正在努力让this example让Apache Commons电子邮件库发挥作用。这是我的代码:

    SimpleEmail email = new SimpleEmail();      
    email.setHostName("smtp.gmail.com");
    email.setSmtpPort(465);
    email.setAuthenticator(new DefaultAuthenticator("username@gmail.com", "password"));     
    email.setTLS(true); 
    try {
        email.setFrom("username@gmail.com");
        email.setSubject("TestMail");
        email.setMsg("This is a test mail ... :-)");
        email.addTo("username@gmail.com");
        System.out.println("Sending...");
        email.send();
        System.out.println("Email sent!");

    } catch (Exception e) {
        System.out.println("Email not sent!");
        e.printStackTrace();
    }

正如您所看到的,它与示例基本没有变化,除了我必须使用端口465而不是587,因为587导致Connection refused异常(基于this question)。现在,此代码挂在email.send()行上。我得到的唯一输出是:

Sending...

但没有抛出异常。我是否需要在防火墙中打开端口? (我可能无法做到这一点,因为我试图从工作中做到这一点)。谢谢!

修改

很长一段时间后,我得到了这个例外:

org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.gmail.com:465
...
Caused by: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465, response: -1

2 个答案:

答案 0 :(得分:1)

根据您对我的评论的编辑和回答,您不应该在Java代码中查找问题,而应在防火墙或网络配置中查找。

答案 1 :(得分:0)

您需要设置以下内容(因为您使用的是SSL)

Properties props = new Properties();
props.put("mail.smtp.auth", true);
    props.put("mail.smtp.starttls.enable", true);
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.timeout" , "10000");
    props.put("mail.smtp.connectiontimeout" , "10000");
    props.put("mail.smtp.socketFactory.port", 465);
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.socketFactory.fallback", "false");