Senden von E-Mails über Gmail SMTP-Server in JAVA

Lesezeit: 6 Minuten

Was ist das Problem mit diesem Code? Irgendwie gerät es an der Linie in eine Endlosschleife Transport.send(message); Zeile, keine Fehlermeldung, keine Ausnahme, nur vielleicht Endlosschleife (ich weiß es nicht, weil ich nicht länger als 5-10 Minuten warte)

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

  • Ich würde vorschlagen, eine hinzuzufügen catch (Exception e){} nach dem MessagingException, um zu sehen, ob eine andere Art von Ausnahme ausgelöst wird. Fügen Sie auch ein hinzu finally Block. Sie könnten auch hinzufügen log4j.xml und setze die javax.mail Klasse zu DEBUG um zu sehen, was noch passieren könnte.

    – Bizmark

    24. März 2013 um 11:04 Uhr

  • gute hinweise, danke! werde es testen

    – czupe

    24. März 2013 um 11:06 Uhr

  • Leider immer noch in der Transport.send(message)-Zeile warten… Kann jemand diesen Code auf Korrektheit überprüfen?

    – czupe

    24. März 2013 um 11:28 Uhr

Senden von E Mails uber Gmail SMTP Server in JAVA
Laabidi Raissi

Hier gebe ich einige Änderungen vor, die für mich gut funktionieren:

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

Sie instanziieren das Nachrichtenobjekt wie Sie es getan haben. Und schlussendlich:

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

Bearbeiten, würden Sie mir bitte einen Gefallen tun und dieses Beispiel kopieren / einfügen und ausprobieren und zeigen, was es anzeigt:

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

  • danke, aber die Eigenschaft mail.smtp.auth ist bereits vorhanden … Und ich habe es auch mit dem anderen Port versucht.

    – czupe

    24. März 2013 um 12:07 Uhr

  • ah tut mir leid für die auth-Eigenschaft, es ist meine Schuld, ich habe es nicht gesehen.

    – Laabidi Raissi

    24. März 2013 um 12:09 Uhr

  • Wenn Sie es mit 25 oder 587 Ports versuchen, suchen Sie trotzdem nach Ihrer Lösung … Ausnahme im Thread “main” java.lang.RuntimeException: javax.mail.MessagingException: Verbindung zum SMTP-Host konnte nicht hergestellt werden: smtp.gmail.com, Port: 25; verschachtelte Ausnahme ist: java.net.ConnectException: Verbindung abgelehnt: connect

    – czupe

    24. März 2013 um 12:23 Uhr


  • immer noch die selbe ausnahme, kann es sein das meine netzwerkkonfiguration nicht stimmt?

    – czupe

    24. März 2013 um 12:27 Uhr

  • Gute Nachrichten endlich, wir haben eine Ausnahme. Ihre Ausnahme ist klassisch: stackoverflow.com/questions/7158951/…

    – Laabidi Raissi

    24. März 2013 um 12:27 Uhr

Senden von E Mails uber Gmail SMTP Server in JAVA
czupe

OK. Es ist ein wenig komplexer, als ich beim ersten Mal dachte … Um zusammenzufassen, was ich habe:

  • Es gibt einen sehr nützlichen Befehl: session.setDebug(true);. Wenn Sie dies auf wahr setzen, wird jeder wichtige Prozess auf der Konsole debuggt. Ich empfehle es zu benutzen.
  • Der zweite Computer könnte nur mit der sicheren Option funktionieren, Sie können diesen wechseln mit: Transport transport = session.getTransport("smtps"); eher das nicht sichere smtp … Das JavaMail-API-Transportobjekt kümmert sich auch um die Ports (bzw. smtp: 587, smtps: 465)
  • Sie können auch die statische Methode der Transport-Klasse zum Senden der Nachricht verwenden und (vorher speichern, nicht statische sendMessage-Methode speichert die Nachricht nicht), aber dieses Mal müssen Sie den javax.mail.Authenticator bei der Sitzungserstellung verwenden, so was:

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

    });

1.4.2 JavaMailApi hat eine andere Ausnahme als Version 1.4.7 für dieses Problem …

Wenn Sie es nicht verwenden, können Sie sich nicht mit der statischen Methode authentifizieren. Wenn Sie die Instanzmethode verwenden, können Sie dies tun.

  • Ein Computer hat Maven und die Version 1.4.2 der JavaMail-API. Der zweite Computer hat eine heruntergeladene Bibliothek mit Version 1.4.7, die meiner Meinung nach auch die Dinger durcheinander bringt
  • Erstes Comp Netbeans, zweites Comp Intellij … +1) Es gibt viel alten und schlechten Beispielcode im Internet, was die richtige Verwendung dieser API erschwert.

So ziemlich durcheinander, aber es gab ein grundlegendes Konzept, auf das man sich konzentrieren sollte …

Ich konnte das in Ihrer Frage beschriebene Verhalten reproduzieren und beheben.

Die send Methode bleibt hängen

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

Die Verbindung schlägt fehl, weil Sie den falschen Port für den SMTP-Host von Gmail haben: 465

ändern Sie es zu 587

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

und es wird funktionieren.

  • Ja, ich weiß nicht, warum ich den 465-Port gefahren bin, aber trotzdem funktioniert es immer noch nicht : (

    – czupe

    24. März 2013 um 12:33 Uhr

  • Welche Ausnahme/Fehler bekommst du jetzt? Ist Ihre java.exe durch die Firewall gelassen?

    – A4L

    24. März 2013 um 12:40 Uhr

  • This:java.lang.RuntimeException: javax.mail.MessagingException: Verbindung zum SMTP-Host konnte nicht hergestellt werden: smtp.gmail.com, Port: 25; verschachtelte Ausnahme ist: java.net.ConnectException: Verbindung abgelehnt: Verbindung herstellen Ich habe die gesamte Windows-Firewall heruntergefahren.

    – czupe

    24. März 2013 um 12:45 Uhr

  • Es scheint, dass Ihre Anwendung SSL nicht unterstützt. smtp.gmail.com erfordert eine sichere Verbindung, andernfalls müssen Sie einen anderen Host wählen, Siehe Google-Support-Seite. Sie müssen es wahrscheinlich explizit angeben, indem Sie a erwerben Transport Instanz, die das sichere Protokoll unterstützt smtps und verwenden Sie es, um Ihre Nachricht zu senden. Bitte beachten Sie die akzeptierte Antwort für diese Frage

    – A4L

    24. März 2013 um 13:27 Uhr


Senden von E Mails uber Gmail SMTP Server in JAVA
Benni Bottema

Verwenden Einfache Java-Mail es sollte einfach sein:

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

Wenn Sie die Zwei-Faktor-Anmeldung aktiviert haben, müssen Sie eine generieren anwendungsspezifisches Passwort aus Ihrem Google-Konto.

843020cookie-checkSenden von E-Mails über Gmail SMTP-Server in JAVA

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy