2008-12-22 8 views
18

Google Apps kullanarak bir e-posta göndermek için Bill the Lizard's code kullanmaya çalışıyorum. Ben bu hatayı alıyorum:Önce bir STARTTLS komutu vermeli. Java ve Google Apps ile e-posta gönderme

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

Ancak, yardımcı olmuyor:

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) 

Bill'in kod hatayla ilgili görünüyor sonraki satırını içerir.

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; 

herkes bu hata hakkında biliyor mu:

Bunlar

benim ithalat ifadeleridir?

cevap

4

Posta aktarımı için SMTP yerine SMTPS kullanarak yapılması gerektiğini düşünüyorum. İşte, JavaMail FAQ on accessing Gmail'dan sonra modellenen farklı bir versiyon. Netlik için tüm daha ince düzey istisna işlemlerini dışarıda bıraktığımı unutmayın.

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

Ben n almak gmail hesabı için daha az güvenli uygulamalara izin ver: on

dönüş kod çalıştırırken istisna: istisna "ana" javax.mail.NoSuchProviderException özel: smtps –

+0

için sağlayıcı yok JavaMail kaynak dosyaları eksik veya bozuk gibi görünüyor (bkz. http://java.sun.com/products/javamail/ javadocs/javax/posta/Session.html). Mail.jar/META-INF içindeki dosyaların varsayılan kopyaları vardır. –

+0

Teşekkürler, çalıştım. –

16

Sorunu buldum. Daha önce javax.mail dosyasını içe aktarmak için j2ee.jar kullanıyordum.

j2ee.jar'i sınıf yolundan kaldırdım ve JavaMail 1.4.1 yükledim ve sınıf yoluma iki kavanoz, smtp.jar ve mailapi.jar koydum. Şimdi yerine smtp

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

Artık Barış Lizard'ın kod çalışır SMTPS kullanırlar.

8

Java posta API'sinin sürümüdür. Bu sorunla karşı karşıyaydım ve java posta API'sini 1.4.3 sürümüne güncelledim. Bu benim için iyi çalışıyor!

Teşekkürler!

14

Aşağıdaki etiketleri ayarlayın. Çalışacak.

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

mantıklı görünüyor, ama neden 25 numaralı limana bulaşıyorsunuz?Çoğunlukla ISS'ler tarafından her zaman engellenir ve aslında daha sonra 465'e geri dönülür. –

1

Bu beni deli ediyordu ve sadece benim için neyin işe yaradığını eklemek istedim. Bunun çalışması için JavaMail (1.4.5) sürümümü güncellemeliydim - hangi sürümün daha önce kullanıldığından emin değilim. (Ek ayıklama bilgi almak için hata ayıklama satırları uncomment olabilir - liman 587 ve ev sahibi smtp.gmail.com idi) Ben JavaMail yeni sürümüne güncellenmiş kez

, aşağıdaki kod benim için çalıştı:

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