2013-03-24 8 views
14

В чем проблема с этим кодом? Каким-то образом он получает в к петле бесконечности на линии Transport.send(message); линии, сообщение об ошибке, не исключение, просто, может быть, бесконечный цикл (я не знаю, потому что я не ждать больше, чем 5-10minute)Отправка электронной почты с помощью gmail smtp server в JAVA

final String username = "<mail_name>"; 
final String password = "<password>"; 

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", "465"); 

Session session = Session.getInstance(props, 
     new javax.mail.Authenticator() { 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication(username, password); 
      } 
     }); 

try { 

    Message message = new MimeMessage(session); 
    message.setFrom(new InternetAddress("<mail_from>@gmail.com")); 
    message.setRecipients(Message.RecipientType.TO, 
      InternetAddress.parse("<mail_to>@gmail.com")); 
    message.setSubject("Test Subject"); 
    message.setText("Test"); 

    Transport.send(message); 

    System.out.println("Done"); 

} catch (MessagingException e) { 
    throw new RuntimeException(e); 
} 
+0

Я бы предложил добавить 'catch (Exception e) {}' после 'MessagingException', чтобы узнать, выбрано ли какое-либо другое исключение. Также добавьте блок 'finally'. Вы также можете добавить 'log4j.xml' и установить класс' javax.mail' в 'DEBUG', чтобы узнать, что еще может произойти. – Bizmarck

+0

хорошие подсказки, спасибо! проверит его – czupe

+0

К сожалению, все еще ждут на линии Transport.send (сообщение) ... Кто-нибудь может проверить правильность этого кода? – czupe

ответ

18

Здесь я даю некоторые изменения, что отлично работает для меня:

Session session = Session.getInstance(props,null); 

вы экземпляр объекта сообщения, как вы делали. И, наконец:

Transport transport = session.getTransport("smtp"); 
String mfrom = "[email protected]"// example laabidiraissi 
transport.connect("smtp.gmail.com", mfrom, "thepassword"); 
transport.sendMessage(message, message.getAllRecipients()); 

Редактировать, вы дать бы мне одолжение и копировать/вставить и попробовать этот пример и показать, что он отображает:

package com.test; 

import java.util.Properties; 

import javax.mail.BodyPart; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Multipart; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.AddressException; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 

import org.junit.Test; 

public class EmailService { 

@Test 
public void test(){ 
    Properties props = System.getProperties(); 
    props.put("mail.smtp.starttls.enable", true); // added this line 
    props.put("mail.smtp.host", "smtp.gmail.com"); 
    props.put("mail.smtp.user", "username"); 
    props.put("mail.smtp.password", "password"); 
    props.put("mail.smtp.port", "587"); 
    props.put("mail.smtp.auth", true); 



    Session session = Session.getInstance(props,null); 
    MimeMessage message = new MimeMessage(session); 

    System.out.println("Port: "+session.getProperty("mail.smtp.port")); 

    // Create the email addresses involved 
    try { 
     InternetAddress from = new InternetAddress("username"); 
     message.setSubject("Yes we can"); 
     message.setFrom(from); 
     message.addRecipients(Message.RecipientType.TO, InternetAddress.parse("receivermail")); 

     // Create a multi-part to combine the parts 
     Multipart multipart = new MimeMultipart("alternative"); 

     // Create your text message part 
     BodyPart messageBodyPart = new MimeBodyPart(); 
     messageBodyPart.setText("some text to send"); 

     // Add the text part to the multipart 
     multipart.addBodyPart(messageBodyPart); 

     // Create the html part 
     messageBodyPart = new MimeBodyPart(); 
     String htmlMessage = "Our html text"; 
     messageBodyPart.setContent(htmlMessage, "text/html"); 


     // Add html part to multi part 
     multipart.addBodyPart(messageBodyPart); 

     // Associate multi-part with message 
     message.setContent(multipart); 

     // Send message 
     Transport transport = session.getTransport("smtp"); 
     transport.connect("smtp.gmail.com", "username", "password"); 
     System.out.println("Transport: "+transport.toString()); 
     transport.sendMessage(message, message.getAllRecipients()); 


    } catch (AddressException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (MessagingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
} 
+0

спасибо, но свойство mail.smtp.auth уже существует ... И я тоже пробовал с другим портом. – czupe

+0

ах извините за свойство auth, это моя вина, я этого не видел. –

+0

, если при попытке с 25 или 587 портами, в любом случае проверьте свое решение ... Исключение из потока «main» java.lang.RuntimeException: javax.mail.MessagingException: Не удалось подключиться к SMTP-хосту: smtp.gmail.com, порт: 25; Вложенное исключение: \t java.net.ConnectException: Соединение отклонено: connect – czupe

1

я мог воспроизвести поведение, описанное в вашем вопросе и почини это.

Метод send застревает в

SMTPTransport(Service).connect(String, int, String, String) line: 308 

соединение не удается, потому что вы не тот порт для протокола SMTP в Gmail хоста: 465

изменить его 587

props.put("mail.smtp.port", "587"); 

и он будет работать.

+0

да , не знаю, почему я ездил на порт 465, но, в любом случае, он все еще не работает: ( – czupe

+0

какая ошибка/ошибка вы получаете сейчас? разрешен ли ваш java.exe через брандмауэр? – A4L

+0

Это: java.lang.RuntimeException: javax.mail.MessagingException: Не удалось подключиться к узлу SMTP: smtp.gmail.com, порт: 25; Вложенное исключение: java.net.ConnectException: соединение отклонено: connect Я отключил весь брандмауэр Windows. – czupe

3

Ok. Это немного сложнее, чем я учил в первый раз ... Чтобы summorize, что я получил:

  • Существует очень полезная команда: session.setDebug(true);. Если вы установите это значение true, каждый важный процесс будет отлажен на консоль. Я рекомендую использовать его.
  • Второй компьютер может работать только с защищенной опцией, вы можете переключить его следующим образом: Transport transport = session.getTransport("smtps"); скорее из небезопасного smtp ... Объект транспорта JavaMail API также будет заботиться о портах (соответственно smtp: 587, smtps : 465)
  • Вы также можете использовать статический метод класса транспорта для отправки сообщения и (сохранение его ранее, не статический метод sendMessage не сохранит сообщение), но на этот раз вам нужно использовать javax.mail . Аутентификатор при создании сеанса, например:

    Session session = Session.getInstance(props,   new javax.mail.Authenticator() { 
        protected PasswordAuthentication getPasswordAuthentication() { 
         return new PasswordAuthentication("login", "password"); 
        } 
    

    });

1.4.2 JavaMailApi имеет еще одно исключение, чем 1.4.7 версии для этой проблемы ...

Если вы не используете его, вы не можете с проверкой подлинности с помощью статического метода. Если вы используете метод экземпляра, вы можете.

  • Один компьютер имеет maven и получил версию JavaMail API версии 1.4.2. Второй компьютер имеет загруженную библиотеку с версией 1.4.7, которая, как я полагаю, также беспорядок с вещами
  • Первый comp Netbeans, второй comp Intellij ... +1) В Интернете много старого и плохого примера кода, что затрудняет использование этого API должным образом.

Так довольно перепутались, но были некоторые базовые концепции, которая должна быть направлена ​​...

1

Использование Simple Java Mail должно быть простым:

Email email = new Email(); 

email.setFromAddress("lollypop", "[email protected]"); 
email.addRecipient("C.Cane", "[email protected]", RecipientType.TO); 
email.setText("We should meet up!"); 
email.setTextHTML("<b>We should meet up!</b>"); 
email.setSubject("hey"); 

new Mailer("smtp.gmail.com", 25, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email); 
new Mailer("smtp.gmail.com", 587, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email); 
new Mailer("smtp.gmail.com", 465, "your user", "your password", TransportStrategy.SMTP_SSL).sendMail(email); 

Если вы двухфакторная Войти оказалось вам необходимо создать application specific password из вашей учетной записи Google.

Смежные вопросы