在某些机器上抛出MessagingException,但在其他机器上它运行正常

时间:2013-07-04 01:50:02

标签: javamail

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

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);
  }
}

2 个答案:

答案 0 :(得分:4)

所以是的,当我尝试发送邮件时,Avast Antivirus导致异常被抛出。如果有其他人遇到此问题,他们会找到此页面:

打开Avast并单击“安全”选项卡。然后单击左侧的AntiVirus选项卡。在此下,单击Mail Shield并转到设置。取消“扫描出站邮件(SMTP)”,它就像魅力一样。

答案 1 :(得分:2)

您的代码没有问题。它看起来不错。

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

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

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