it-swarm.com.de

Versenden von E-Mails über den Google Mail-SMTP-Server in JAVA

Was ist das Problem mit diesem Code? Irgendwie kommt es zu einer Endlosschleife an der Zeile Transport.send(message);, keine Fehlermeldung, keine Ausnahme, nur vielleicht eine 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);
}
14
czupe

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

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

Sie instanziieren ein 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 geben und dieses Beispiel kopieren und einfügen und zeigen, was angezeigt wird:

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

OK. Es ist etwas komplexer als ich zum ersten Mal unterrichtet habe ... Um zusammenzufassen, was ich bekam:

  • Es gibt einen sehr nützlichen Befehl:session.setDebug(true);. Wenn Sie diesen Wert auf "true" setzen, wird jeder wichtige Prozess in der Konsole debugiert. Ich empfehle es zu benutzen.
  • Der zweite Computer könnte nur mit der sicheren Option arbeiten. Sie können diese Option mit: Transport transport = session.getTransport("smtps"); anstelle des nicht sicheren SMTP-Moduls wechseln. Das JavaMail-API-Transportobjekt kümmert sich auch um die Ports (bzw. SMTP: 587, SMTP: 465).
  • Sie können auch die statische Methode der Transport-Klasse verwenden, um die Nachricht zu senden und (die vor dem Speichern durch die nicht statische sendMessage-Methode nicht gespeichert wird), aber dieses Mal müssen Sie 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 die 1.4.7-Version 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 hat die Version 1.4.2 der JavaMail-API erhalten. Der zweite Computer verfügt über eine heruntergeladene Bibliothek mit der Version 1.4.7, die sich vermutlich auch mit den Dingen vermischt 
  • First comp Netbeans, second comp Intellij ... + 1) Im Internet gibt es eine Menge alten und schlechten Beispielcodes, die die korrekte Verwendung dieser API erschweren.

So ziemlich durcheinander, aber es gab einige grundlegende Konzepte, die sich konzentrieren sollten ...

3
czupe

Verwenden Sie Simple Java Mail es sollte unkompliziert 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 das Zwei-Faktor-Login aktiviert haben, müssen Sie ein anwendungsspezifisches Passwort aus Ihrem Google-Konto erstellen.

1
Benny Bottema

Ich könnte 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, da Sie den falschen Port für den gmail SMTP-Host haben: 465

Ändern Sie es in 587.

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

und es wird funktionieren.

1
A4L