2013-03-24 11 views
14

Na czym polega problem z tym kodem? Jakoś robi się w nieskończoność do pętli na linii linia Transport.send(message);, bez komunikatu o błędzie, bez wyjątku, tylko może nieskończoną pętlę (nie wiem, bo nie czekać dłużej niż 5-10minute)Wysyłanie wiadomości e-mail przez serwer SMTP w Gmailu w języku 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

Proponuję dodać 'catch (Exception e) {}' po 'MessagingException', aby sprawdzić, czy zgłoszony zostanie inny rodzaj wyjątku. Dodaj także blok "finally". Możesz też dodać 'log4j.xml' i ustawić klasę' javax.mail' na 'DEBUG', aby zobaczyć, co jeszcze może się dziać. – Bizmarck

+0

dobre wskazówki, dzięki! przetestuje to – czupe

+0

Niestety nadal czeka na linii Transport.send (wiadomość) ... Ktoś może potwierdzić poprawność tego kodu? – czupe

Odpowiedz

18

Tutaj daję pewne zmiany, które działają dobrze dla mnie:

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

możliwość wystąpienia wiadomość obiekt jak ty. I wreszcie:

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

Edit, to proszę dać mi przysługę i kopiuj/wklej i wypróbować ten przykład i pokazać to, co wyświetla:

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

dziękuję, ale właściwość mail.smtp.auth już istnieje ... I próbowałem również z innym portem. – czupe

+0

ah przepraszam za własność auth, to moja wina, nie widziałem tego. –

+0

jeśli spróbujesz z 25 lub 587 portami, w każdym razie sprawdź swoje rozwiązanie ... Wyjątek w wątku "główny" java.lang.RuntimeException: javax.mail.MessagingException: Nie można się połączyć z hostem SMTP: smtp.gmail.com, port: 25; wyjątek zagnieżdżony to: \t java.net.ConnectException: odmówiono połączenia: podłącz – czupe

1

mogę odtworzyć zachowanie opisane w pytaniu i napraw to.

Sposób send utknie w

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

Połączenie nie uda, bo masz niewłaściwy port hosta Gmail SMTP: 465

go zmienić na 587

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

i to zadziała.

+0

yeah , nie wiem, dlaczego jeździłem na porcie 465, ale mimo to nadal nie działa: ( – czupe

+0

jaki wyjątek/błąd otrzymujesz teraz? czy Twój plik java.exe jest dozwolony przez zaporę ogniową? – A4L

+0

To: java.lang.RuntimeException: javax.mail.MessagingException: Nie można się połączyć z hostem SMTP: smtp.gmail.com, port: 25; Zagnieżdżony wyjątek to: java.net.ConnectException: Połączenie odrzucone: połącz Zamknąłem całą zaporę systemu Windows. – czupe

3

Ok. To jest trochę bardziej skomplikowane niż myślałam po raz pierwszy ... Aby summorize co mam:

  • Jest bardzo przydatna komenda: session.setDebug(true);. Jeśli ustawisz to prawda, każdy ważny proces zostanie zdebugowany do konsoli. Polecam go użyć.
  • Drugi komputer mógł działać tylko z opcją secure, można to zmienić za pomocą: Transport transport = session.getTransport("smtps"); zamiast niezabezpieczonego smtp ... Obiekt transportowy API JavaMail zajmie się również portami (odpowiednio smtp: 587, smtps : 465)
  • Możesz użyć również statycznej metody klasy Transport do wysłania wiadomości i (zapisując ją wcześniej, nie statyczna metoda sendMessage nie zapisze wiadomości), ale tym razem musisz użyć javax.mail .Authenticator podczas tworzenia sesji, na przykład:

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

    });

1.4.2 JavaMailApi ma inny wyjątkiem niż 1.4.7 wersji dla tego problemu ...

Jeśli nie używasz go, nie można uwierzytelnionego metodą statyczną. Jeśli używasz metody instancji, możesz.

  • Jeden komputer ma maven i ma wersję 1.4.2 JavaMail API. Drugi komputer ma ściągniętą bibliotekę, z wersją 1.4.7, która, jak sądzę, również niesie ze sobą rzeczy
  • Pierwsza kompresja Netbeans, druga kompozycja Intellij ... +1) W Internecie istnieje wiele starych i złych przykładowych kodów, co utrudnia korzystanie z tego interfejsu API.

Więc całkiem pomieszane, ale były pewne podstawowe pojęcia, które powinny być skoncentrowane ...

1

Korzystanie Simple Java Mail powinna być prosta:

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

Jeśli dwuskładnikowe logowanie odwrócił musisz wygenerować numer application specific password ze swojego konta Google.

Powiązane problemy