2015-07-13 4 views
1

Я пытаюсь отправить письмо программно с помощью Java в Eclipse. Я правильно настроил проект, используя самый последний JDK 1.8.0_45. Под этим я подразумеваю, что я включил mailapi.jar и smtp.jar.Eclipse Java, Отправить письмо от Gmail SMTP programatically

Я прочитал множество других сообщений по этой теме, и я знаю, что мой путь построения Java должен включать в себя mail.jar. Однако, когда я искал папку, не было найдено mail.jar; mailapi.jar был самым близким и, похоже, разрешил ошибки включения, которые я получал без него.

Вот мой код:

import java.util.*; 
import javax.mail.*; 
import javax.mail.internet.*; 

public class emailer { 

    private static String host = "smtp.gmail.com"; 
    private static String user = "**********"; 
    private static String pass = "***********"; 

    public static void sendEmail(String fromAddr, String toAddr, String subject, String body) 
    { 
     Properties prop = System.getProperties(); 
     prop.put("mail.smtp.starttls.enable", "true"); 
     prop.put("mail.smtp.host", host); 
     prop.put("mail.smtp.user", user); 
     prop.put("mail.smtp.password", pass); 
     prop.put("mail.smtp.port", "465"); 
     prop.put("mail.smtp.auth", "true"); 

     Session session = Session.getDefaultInstance(prop); 
     MimeMessage message = new MimeMessage(session); 

     try 
     { 
      message.setFrom(new InternetAddress(fromAddr)); 
      message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toAddr)); 
      message.setSubject(subject); 
      message.setText(body); 
      Transport transport = session.getTransport("smtp"); 
      transport.connect(host, user, pass); 
      transport.send(message, message.getAllRecipients()); 
      //The above line has a warning message 
      //"The static method send(Message, Address[]) from the type Transport should be accessed in a static way" 
      transport.close(); 
      System.out.println("done"); 
     } 
     catch (AddressException e) {e.printStackTrace();} 
     catch (MessagingException e) {e.printStackTrace();} 
    } 
} 

Код компилируется без ошибок, и при беге, продолжает работать бесконечно, никогда не нарушая ни остановки. Так что, к сожалению, у меня нет трассировки стека, чтобы показать ... Любая помощь будет принята с благодарностью.

+1

Рекомендовать использовать apache commons mail https://commons.apache.org/proper/commons-email/userguide.html На самом деле существует образец gmail. – kevcodez

ответ

1

Изменения исходящего порта 587, а не 465. Это получить избавиться от-х бесконечный тайм-аут (поскольку Transport не имеет значения таймаута). Кроме того, использование статического Transport.send() упростит ваш код много (я также получил некоторые ошибки при использовании нестатического метода). Так что-то вроде этого.

public class Emailer //Class names should always be capitalized 
{ 

private static String host = "smtp.gmail.com"; 
private static String user = "**********"; 
private static String pass = "***********"; 

public static void sendEmail(String fromAddr, String toAddr, String subject, String body) 
{ 
    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.port", "587"); 
    Session.getInstance(props, null); 

    MimeMessage message = new MimeMessage(session); 

    try 
    { 
     message.setFrom(new InternetAddress(fromAddr)); 
     message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toAddr)); 
     message.setSubject(subject); 
     message.setText(body); 
     Transport.send(message, user, pass); 
    } 
    catch (AddressException e) {e.printStackTrace();} 
    catch (MessagingException e) {e.printStackTrace();} 
} 
+0

Спасибо! После внесения этих изменений я получаю следующую трассировку стека. –

+0

Вы получаете сообщение об ошибке? – connorp

+0

извините, ошибка + трассировка стека была очень большой, чтобы вписаться в комментарий. ошибка: javax.mail.AuthenticationFailedException Я не понимаю этого, потому что я создал свою GMail аккаунт менее безопасный доступ приложений, поэтому аутентификация не отменялась –

0

Вы, вероятно, хотите, чтобы включить javax.mail.jar

вот домашняя страница, где вы можете скачать его с

https://java.net/projects/javamail/pages/Home

+0

Выполненное выше, программа все еще работает непрерывно, не нарушая или не заканчивая ... Я знаю, что мой код пытается использовать SMTP-сервер gmail, так как я получил сообщение электронной почты от Google, уведомляющее меня о попытке получить доступ к моей учетной записи, в котором я включил менее безопасный доступ к приложениям, чтобы моя программа могла получить доступ к gmail smtp. –