2013-07-04 53 views
1

我正在尝试编写一种基于参数发送电子邮件的方法,它完全适用于CentOS和OSX。但是,该方法在Windows上无法正常工作(即使在Windows上重新编译时)以及其他一些Linux操作系统 - 它会引发MessagingException。有没有人有任何想法,我可以如何解决这个在Windows上工作?谢谢!在某些机器上抛出MessagingException,但在其他机器上工作正常

private static void sendEmail(String towhom, String subject, String body) { 
    String host = "smtp.gmail.com", from = "myemail", pass = "mypassword"; 
    Properties props = System.getProperties(); 
    Scanner scan = new Scanner(System.in); 

    try { 
    props.put("mail.smtp.starttls.enable", "true"); 
    props.put("mail.smtp.host", host); 
    props.put("mail.smtp.user", from); 
    props.put("mail.smtp.password", pass); 
    props.put("mail.smtp.port", "587"); 
    props.put("mail.smtp.auth", "true"); 

    Session session = Session.getDefaultInstance(props, null); 
    MimeMessage message = new MimeMessage(session); 
    message.setFrom(new InternetAddress(from)); 

    InternetAddress toAddress = new InternetAddress(towhom); 

    message.addRecipient(Message.RecipientType.TO, toAddress); 
    message.setSubject(subject); 
    message.setText(body); 

    Transport transport = session.getTransport("smtp"); 
    transport.connect(host, from, pass); 
    transport.sendMessage(message, message.getAllRecipients()); 
    transport.close(); 
    } 
    catch(AddressException e) { 
    System.out.println("Invalid Email Address."); 
    } 
    catch(MessagingException e) { 
    System.out.print("\nInvalid Email Address, please reenter it: "); 
    sendEmail(scan.nextLine(), subject, body); 
    } 
} 
+1

你可以添加堆栈跟踪?另外,你可以从你的linux终端上telnet smtp.gmail.com 587吗? – JHS

+0

'MessagingException'catch块中的'e.printStackTrace();'。 – JHS

+0

这是太长,只贴:http://pastebin.com/02xP4171 –

回答

4

因此,当我试图发送邮件时,Avast Antivirus导致异常被抛出。如果有其他人有这个问题,谁发现这个网页:

打开Avast,然后单击安全选项卡。然后点击左侧的AntiVirus标签。在此之下,单击Mail Shield并转到设置。不要勾选“扫描出站邮件(SMTP)”,它会像魅力一样工作。

2

您的代码没有问题。看上去不错。

根据JavaMail FAQ's。以下可能是问题 -

  • 有一个防火墙或防病毒程序拦截您的请求。
  • 您的JDK安装出现问题,导致它无法为受信任的证书颁发机构查找证书。
  • 您正在运行在覆盖了JDK的可信证书颁发机构列表的应用程序服务器中。

如果禁用防火墙和/或防病毒软件不能解决问题,那么您可以尝试重新安装JDK并进行测试。

+0

我确信堆栈跟踪会告诉他要查找什么。 – andy256

+0

谢谢!原来是avast!阻止它而不是Windows防火墙。禁用avast!允许它无误地运行。 –

相关问题