2008-12-22 4 views
18

Próbuję użyć Bill the Lizard's code, aby wysłać wiadomość e-mail przy użyciu Google Apps. Otrzymuję ten błąd: KodNajpierw należy wydać komendę STARTTLS. Wysyłanie wiadomości e-mail za pomocą Javy i Google Apps

Exception in thread "main" javax.mail.SendFailedException: Sending failed; 
    nested exception is: 
    javax.mail.MessagingException: 530 5.7.0 Must issue a STARTTLS command first. f3sm9277120nfh.74 

    at javax.mail.Transport.send0(Transport.java:219) 
    at javax.mail.Transport.send(Transport.java:81) 
    at SendMailUsingAuthentication.postMail(SendMailUsingAuthentication.java:81) 
    at SendMailUsingAuthentication.main(SendMailUsingAuthentication.java:44) 

Billa zawiera następnego wiersza, który wydaje się mieć związek z błędem:

props.put("mail.smtp.starttls.enable","true"); 

Jednak to nie pomaga.

To są moje wypowiedzi import:

import java.util.Properties; 
import javax.mail.Authenticator; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 

Czy ktoś wie o tym błędzie?

Odpowiedz

4

Myślę, że ma to związek z używaniem SMTP zamiast SMTP do transportu poczty. Oto inna wersja, wzorowana na JavaMail FAQ on accessing Gmail. Zauważ, że dla jasności pominąłem obsługę wyjątków na poziomie dokładniejszym.

private static void send(
     final String username, 
     final String password, 
     final String recipients, 
     final String subject, 
     final String body) 
     throws Exception 
{ 
    final Session session = Session.getInstance(System.getProperties(), null); 
    final Message msg = new MimeMessage(session); 
    final String senderEmail = username.contains("@") ? username : (username + "@gmail.com"); 
    msg.setFrom(new InternetAddress(senderEmail)); 

    final Address[] recipientAddresses = InternetAddress.parse(recipients); 
    msg.setRecipients(Message.RecipientType.TO, recipientAddresses); 

    msg.setSentDate(new Date()); 
    msg.setSubject(subject); 
    msg.setText(body); 

    final Transport transport = session.getTransport("smtps"); 
    transport.connect(GMAIL_SMTP_HOST, GMAIL_SMTP_PORT, username, password); 
    transport.sendMessage(msg, recipientAddresses); 
    transport.close(); 
} 
+0

uzyskać n ext wyjątku podczas działania kodu: Wyjątek w wątku "główny" javax.mail.NoSuchProviderException: Brak dostawcy dla smtps –

+0

Wygląda na to, że brakuje plików zasobów JavaMail lub są one uszkodzone (zobacz http://java.sun.com/products/javamail/ javadocs/javax/mail/Session.html). Istnieją domyślne kopie plików wewnątrz pliku mail.jar/META-INF. –

+0

Dzięki, udało mi się. –

16

Znalazłem problem. Poprzednio używałem j2ee.jar do importowania javax.mail.

Usunąłem plik j2ee.jar ze ścieżki klas i pobrano JavaMail 1.4.1 i umieściłem w mojej ścieżce klasy dwa pliki jar, smtp.jar i mailapi.jar. Używam teraz SMTPS zamiast SMTP

Transport transport = session.getTransport("smtps");    

Teraz Bill kod jaszczurki działa.

8

Jest to wersja interfejsu API poczty Java. Wystąpiłem w obliczu tego problemu i właśnie zaktualizowałem interfejs API poczty java do wersji 1.4.3 To działa dobrze dla mnie!

Dzięki!

14

Ustaw następujące znaczniki. To będzie działać.

props.put("mail.smtp.user","username"); 
props.put("mail.smtp.host", "smtp.gmail.com"); 
props.put("mail.smtp.port", "25"); 
props.put("mail.debug", "true"); 
props.put("mail.smtp.auth", "true"); 
props.put("mail.smtp.starttls.enable","true"); 
props.put("mail.smtp.EnableSSL.enable","true"); 

props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
props.setProperty("mail.smtp.socketFactory.fallback", "false"); 
props.setProperty("mail.smtp.port", "465"); 
props.setProperty("mail.smtp.socketFactory.port", "465"); 
+1

wydaje się być rozsądny, ale dlaczego bałagan z portem 25?w większości jest zawsze blokowana przez dostawców usług internetowych i jest w rzeczywistości resetowana z powrotem do 465 kilka linii później ... –

1

To doprowadzało mnie do szału, więc chciałem tylko dodać to, co zadziałało. Musiałem zaktualizować moją wersję JavaMail (1.4.5), aby to działało - nie wiem, która wersja była wcześniej używana.

Raz zaktualizowany do nowej wersji JavaMail poniższy kod pracował dla mnie (można odkomentuj linie debugowania, aby uzyskać dodatkowe informacje debugowania - port był 587 i gospodarz był smtp.gmail.com):

public void sendMailWithAuth(String host, String user, String password, 
    String port, List<String> toList, String htmlBody, 
     String subject) throws Exception { 

    Properties props = System.getProperties(); 

    props.put("mail.smtp.user",user); 
    props.put("mail.smtp.password", password); 
    props.put("mail.smtp.host", host); 
    props.put("mail.smtp.port", port); 
    //props.put("mail.debug", "true"); 
    props.put("mail.smtp.auth", "true"); 
    props.put("mail.smtp.starttls.enable","true"); 
    props.put("mail.smtp.EnableSSL.enable","true"); 

    Session session = Session.getInstance(props, null); 
    //session.setDebug(true); 

    MimeMessage message = new MimeMessage(session); 
    message.setFrom(new InternetAddress(user)); 

    // To get the array of addresses 
    for (String to: toList) { 
     message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); 
    } 

    message.setSubject(subject); 
    message.setContent(htmlBody, "text/html"); 

    Transport transport = session.getTransport("smtp"); 
    try { 
     transport.connect(host, user, password); 
     transport.sendMessage(message, message.getAllRecipients()); 
    } finally { 
     transport.close(); 
    } 
} 
Powiązane problemy