Senden Sie eine E-Mail mit Java

112

Ich versuche eine E-Mail mit Java zu senden:

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class SendEmail {

   public static void main(String [] args) {

      // Recipient's email ID needs to be mentioned.
      String to = "[email protected]";

      // Sender's email ID needs to be mentioned
      String from = "[email protected]";

      // Assuming you are sending email from localhost
      String host = "localhost";

      // Get system properties
      Properties properties = System.getProperties();

      // Setup mail server
      properties.setProperty("mail.smtp.host", host);

      // Get the default Session object.
      Session session = Session.getDefaultInstance(properties);

      try{
         // Create a default MimeMessage object.
         MimeMessage message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.addRecipient(Message.RecipientType.TO,
                                  new InternetAddress(to));

         // Set Subject: header field
         message.setSubject("This is the Subject Line!");

         // Now set the actual message
         message.setText("This is actual message");

         // Send message
         Transport.send(message);
         System.out.println("Sent message successfully....");
      }catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
}

Ich erhalte den Fehler:

javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;
  nested exception is:java.net.ConnectException: Connection refused: connect
        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1706)
        at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:525)

Funktioniert dieser Code zum Senden von E-Mails?

Mohit Bansal
quelle
11
Führen Sie einen SMTP-Server auf demselben Computer aus, der Port 25 überwacht?
Jeff
Ich gehe von Ihren Adressen aus, dass Sie versuchen, über Google Mail weiterzuleiten? Wenn dies zutrifft, habe ich möglicherweise Code, den Sie verwenden können. Hier ist ein Hinweis, Sie brauchen TLS
Paul Gregoire
@Mondain Es wird hilfreich sein, wenn Sie fünf Code können. Ich möchte mit Google Mail weiterleiten
Mohit Bansal
Der einzige Haken in meiner Antwort unten ist, dass die JavaMail-Bibliothek nicht verwendet wird. Ich kann Ihnen die vollständige Quelle senden, wenn Sie möchten.
Paul Gregoire

Antworten:

98

Der folgende Code funktioniert sehr gut mit dem Google SMTP-Server. Sie müssen Ihren Google-Nutzernamen und Ihr Passwort eingeben.

import com.sun.mail.smtp.SMTPTransport;
import java.security.Security;
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 *
 * @author doraemon
 */
public class GoogleMail {
    private GoogleMail() {
    }

    /**
     * Send email using GMail SMTP server.
     *
     * @param username GMail username
     * @param password GMail password
     * @param recipientEmail TO recipient
     * @param title title of the message
     * @param message message to be sent
     * @throws AddressException if the email address parse failed
     * @throws MessagingException if the connection is dead or not in the connected state or if the message is not a MimeMessage
     */
    public static void Send(final String username, final String password, String recipientEmail, String title, String message) throws AddressException, MessagingException {
        GoogleMail.Send(username, password, recipientEmail, "", title, message);
    }

    /**
     * Send email using GMail SMTP server.
     *
     * @param username GMail username
     * @param password GMail password
     * @param recipientEmail TO recipient
     * @param ccEmail CC recipient. Can be empty if there is no CC recipient
     * @param title title of the message
     * @param message message to be sent
     * @throws AddressException if the email address parse failed
     * @throws MessagingException if the connection is dead or not in the connected state or if the message is not a MimeMessage
     */
    public static void Send(final String username, final String password, String recipientEmail, String ccEmail, String title, String message) throws AddressException, MessagingException {
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

        // Get a Properties object
        Properties props = System.getProperties();
        props.setProperty("mail.smtps.host", "smtp.gmail.com");
        props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.port", "465");
        props.setProperty("mail.smtp.socketFactory.port", "465");
        props.setProperty("mail.smtps.auth", "true");

        /*
        If set to false, the QUIT command is sent and the connection is immediately closed. If set 
        to true (the default), causes the transport to wait for the response to the QUIT command.

        ref :   http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package-summary.html
                http://forum.java.sun.com/thread.jspa?threadID=5205249
                smtpsend.java - demo program from javamail
        */
        props.put("mail.smtps.quitwait", "false");

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

        // -- Create a new message --
        final MimeMessage msg = new MimeMessage(session);

        // -- Set the FROM and TO fields --
        msg.setFrom(new InternetAddress(username + "@gmail.com"));
        msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientEmail, false));

        if (ccEmail.length() > 0) {
            msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(ccEmail, false));
        }

        msg.setSubject(title);
        msg.setText(message, "utf-8");
        msg.setSentDate(new Date());

        SMTPTransport t = (SMTPTransport)session.getTransport("smtps");

        t.connect("smtp.gmail.com", username, password);
        t.sendMessage(msg, msg.getAllRecipients());      
        t.close();
    }
}

Update am 11. Dezember 2015

Benutzername + Passwort werden nicht mehr empfohlen. Das ist wegen

Ich habe dies versucht und Google Mail hat der in diesem Code als Benutzername verwendeten E-Mail eine E-Mail gesendet, in der darauf hingewiesen wird, dass wir kürzlich einen Anmeldeversuch für Ihr Google-Konto blockiert haben, und mich auf diese Support-Seite weitergeleitet: support.google.com/accounts/answer/6010255 Damit es funktioniert, muss das zum Senden verwendete E-Mail-Konto die eigene Sicherheit verringern

Google hatte die Google Mail-API https://developers.google.com/gmail/api/?hl=de veröffentlicht . Wir sollten die oAuth2-Methode anstelle von Benutzername + Passwort verwenden.

Hier ist das Code-Snippet für die Arbeit mit der Google Mail-API.

GoogleMail.java

import com.google.api.client.util.Base64;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.model.Message;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Properties;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 *
 * @author doraemon
 */
public class GoogleMail {
    private GoogleMail() {
    }

    private static MimeMessage createEmail(String to, String cc, String from, String subject, String bodyText) throws MessagingException {
        Properties props = new Properties();
        Session session = Session.getDefaultInstance(props, null);

        MimeMessage email = new MimeMessage(session);
        InternetAddress tAddress = new InternetAddress(to);
        InternetAddress cAddress = cc.isEmpty() ? null : new InternetAddress(cc);
        InternetAddress fAddress = new InternetAddress(from);

        email.setFrom(fAddress);
        if (cAddress != null) {
            email.addRecipient(javax.mail.Message.RecipientType.CC, cAddress);
        }
        email.addRecipient(javax.mail.Message.RecipientType.TO, tAddress);
        email.setSubject(subject);
        email.setText(bodyText);
        return email;
    }

    private static Message createMessageWithEmail(MimeMessage email) throws MessagingException, IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        email.writeTo(baos);
        String encodedEmail = Base64.encodeBase64URLSafeString(baos.toByteArray());
        Message message = new Message();
        message.setRaw(encodedEmail);
        return message;
    }

    public static void Send(Gmail service, String recipientEmail, String ccEmail, String fromEmail, String title, String message) throws IOException, MessagingException {
        Message m = createMessageWithEmail(createEmail(recipientEmail, ccEmail, fromEmail, title, message));
        service.users().messages().send("me", m).execute();
    }
}

Um einen autorisierten Google Mail-Dienst über oAuth2 zu erstellen, finden Sie hier das Code-Snippet.

Utils.java

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.GmailScopes;
import com.google.api.services.oauth2.Oauth2;
import com.google.api.services.oauth2.model.Userinfoplus;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.GeneralSecurityException;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.yccheok.jstock.engine.Pair;

/**
 *
 * @author yccheok
 */
public class Utils {
    /** Global instance of the JSON factory. */
    private static final GsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();

    /** Global instance of the HTTP transport. */
    private static HttpTransport httpTransport;

    private static final Log log = LogFactory.getLog(Utils.class);

    static {
        try {
            // initialize the transport
            httpTransport = GoogleNetHttpTransport.newTrustedTransport();

        } catch (IOException ex) {
            log.error(null, ex);
        } catch (GeneralSecurityException ex) {
            log.error(null, ex);
        }
    }

    private static File getGmailDataDirectory() {
        return new File(org.yccheok.jstock.gui.Utils.getUserDataDirectory() + "authentication" + File.separator + "gmail");
    }

    /**
     * Send a request to the UserInfo API to retrieve the user's information.
     *
     * @param credentials OAuth 2.0 credentials to authorize the request.
     * @return User's information.
     * @throws java.io.IOException
     */
    public static Userinfoplus getUserInfo(Credential credentials) throws IOException
    {
        Oauth2 userInfoService =
            new Oauth2.Builder(httpTransport, JSON_FACTORY, credentials).setApplicationName("JStock").build();
        Userinfoplus userInfo  = userInfoService.userinfo().get().execute();
        return userInfo;
    }

    public static String loadEmail(File dataStoreDirectory)  {
        File file = new File(dataStoreDirectory, "email");
        try {
            return new String(Files.readAllBytes(Paths.get(file.toURI())), "UTF-8");
        } catch (IOException ex) {
            log.error(null, ex);
            return null;
        }
    }

    public static boolean saveEmail(File dataStoreDirectory, String email) {
        File file = new File(dataStoreDirectory, "email");
        try {
            //If the constructor throws an exception, the finally block will NOT execute
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
            try {
                writer.write(email);
            } finally {
                writer.close();
            }
            return true;
        } catch (IOException ex){
            log.error(null, ex);
            return false;
        }
    }

    public static void logoutGmail() {
        File credential = new File(getGmailDataDirectory(), "StoredCredential");
        File email = new File(getGmailDataDirectory(), "email");
        credential.delete();
        email.delete();
    }

    public static Pair<Pair<Credential, String>, Boolean> authorizeGmail() throws Exception {
        // Ask for only the permissions you need. Asking for more permissions will
        // reduce the number of users who finish the process for giving you access
        // to their accounts. It will also increase the amount of effort you will
        // have to spend explaining to users what you are doing with their data.
        // Here we are listing all of the available scopes. You should remove scopes
        // that you are not actually using.
        Set<String> scopes = new HashSet<>();

        // We would like to display what email this credential associated to.
        scopes.add("email");

        scopes.add(GmailScopes.GMAIL_SEND);

        // load client secrets
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(Utils.JSON_FACTORY,
            new InputStreamReader(Utils.class.getResourceAsStream("/assets/authentication/gmail/client_secrets.json")));

        return authorize(clientSecrets, scopes, getGmailDataDirectory());
    }

    /** Authorizes the installed application to access user's protected data.
     * @return 
     * @throws java.lang.Exception */
    private static Pair<Pair<Credential, String>, Boolean> authorize(GoogleClientSecrets clientSecrets, Set<String> scopes, File dataStoreDirectory) throws Exception {
        // Set up authorization code flow.

        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
            httpTransport, JSON_FACTORY, clientSecrets, scopes)
            .setDataStoreFactory(new FileDataStoreFactory(dataStoreDirectory))
            .build();
        // authorize
        return new MyAuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
    }

    public static Gmail getGmail(Credential credential) {
        Gmail service = new Gmail.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName("JStock").build();
        return service;        
    }
}

Um eine benutzerfreundliche Möglichkeit der oAuth2-Authentifizierung bereitzustellen, habe ich JavaFX verwendet, um den folgenden Eingabedialog anzuzeigen

Geben Sie hier die Bildbeschreibung ein

Der Schlüssel zum Anzeigen des benutzerfreundlichen oAuth2-Dialogfelds befindet sich in MyAuthorizationCodeInstalledApp.java und SimpleSwingBrowser.java

Cheok Yan Cheng
quelle
Fehler erhalten: Ausnahme im Thread "main" javax.mail.MessagingException: Verbindung zum SMTP-Host konnte nicht hergestellt werden: smtp.gmail.com, Port: 465; verschachtelte Ausnahme ist: java.net.ConnectException: Zeitüberschreitung der Verbindung: Verbindung unter com.sun.mail.smtp.SMTPTransport.openServer (SMTPTransport.java:1706)
Mohit Bansal
1
Wenn Sie smtp.gmail.com anpingen, erhalten Sie eine Antwort?
Cheok Yan Cheng
Wie ich bereits sagte, bin ich neu bei STMP und weiß nicht, wie ich smtp.gmail.com pingen soll.
Mohit Bansal
2
Geben Sie an Ihrer Eingabeaufforderung "ping smtp.gmail.com" ein und drücken Sie die Eingabetaste.
Cheok Yan Cheng
12
Ich mag es nicht, dass die Methoden Sendstatt aufgerufen werden, sendaber es ist eine nützliche Klasse. Irgendwelche Gedanken zu den Sicherheitsauswirkungen des Speicherns des Google Mail-Passworts im Code?
Simon Forsberg
48

Der folgende Code hat bei mir funktioniert.

import java.io.UnsupportedEncodingException;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;


public class SendMail {

    public static void main(String[] args) {

        final String username = "[email protected]";
        final String password = "yourpassword";

        Properties props = new Properties();
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");

        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("[email protected]"));
            message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("[email protected]"));
            message.setSubject("Testing Subject");
            message.setText("Dear Mail Crawler,"
                + "\n\n No spam to my email, please!");

            Transport.send(message);

            System.out.println("Done");

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}
AndroidDev
quelle
1
Arbeitete an einem Konto mit einer deaktivierten 2-Faktor-Authentifizierung. Diese Lösung ist großartig, da sie lokal ist und keine Sonnenpakete erforderlich sind.
AlikElzin-Kilaka
Um diesen Code verwenden zu können, muss die E-Mail, von der gesendet werden soll, ein Google Mail-Konto sein.
Erick
3
Der Code funktionierte für mich, aber zuerst musste ich dies tun und "Zugriff für weniger sichere Apps"
@ user4966430 Einverstanden! und danke!
Raikumardipak
17
import java.util.Date;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;


public class SendEmail extends Object{

public static void main(String [] args)
{

    try{

        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.mail.yahoo.com"); // for gmail use smtp.gmail.com
        props.put("mail.smtp.auth", "true");
        props.put("mail.debug", "true"); 
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.port", "465");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");

        Session mailSession = Session.getInstance(props, new javax.mail.Authenticator() {

            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("[email protected]", "password");
            }
        });

        mailSession.setDebug(true); // Enable the debug mode

        Message msg = new MimeMessage( mailSession );

        //--[ Set the FROM, TO, DATE and SUBJECT fields
        msg.setFrom( new InternetAddress( "[email protected]" ) );
        msg.setRecipients( Message.RecipientType.TO,InternetAddress.parse("[email protected]") );
        msg.setSentDate( new Date());
        msg.setSubject( "Hello World!" );

        //--[ Create the body of the mail
        msg.setText( "Hello from my first e-mail sent with JavaMail" );

        //--[ Ask the Transport class to send our mail message
        Transport.send( msg );

    }catch(Exception E){
        System.out.println( "Oops something has gone pearshaped!");
        System.out.println( E );
    }
}
}

Erforderliche JAR-Dateien

Klicken Sie hier - So fügen Sie externe Gläser hinzu

Kirit Vaghela
quelle
11

Die kurze Antwort - Nein.

Die lange Antwort - nein, da der Code auf dem Vorhandensein eines SMTP-Servers beruht, der auf dem lokalen Computer ausgeführt wird und Port 25 überwacht. Der SMTP-Server (technisch der MTA oder Mail Transfer Agent) ist für die Kommunikation mit dem Mail User Agent verantwortlich (MUA, in diesem Fall der Java-Prozess) zum Empfangen ausgehender E-Mails.

MTAs sind normalerweise für den Empfang von E-Mails von Benutzern für eine bestimmte Domäne verantwortlich. Für die Domain gmail.com sind es also die Google Mail-Server, die für die Authentifizierung der Mail-Benutzeragenten und damit für die Übertragung von Mails in Posteingänge auf den GMail-Servern verantwortlich sind. Ich bin nicht sicher, ob GMail offenen Mail-Relay-Servern vertraut, aber es ist sicherlich keine leichte Aufgabe, die Authentifizierung im Auftrag von Google durchzuführen und dann Mail an die GMail-Server weiterzuleiten.

Wenn Sie die JavaMail-FAQ zur Verwendung von JavaMail für den Zugriff auf GMail lesen , werden Sie feststellen, dass der Hostname und der Port zufällig auf die GMail-Server und sicherlich nicht auf localhost verweisen. Wenn Sie Ihren lokalen Computer verwenden möchten, müssen Sie entweder eine Weiterleitung oder eine Weiterleitung durchführen.

Sie müssen das SMTP-Protokoll wahrscheinlich gründlich verstehen, wenn Sie in Bezug auf SMTP irgendwohin gelangen möchten. Sie können mit dem Wikipedia-Artikel über SMTP beginnen , aber jeder weitere Fortschritt erfordert tatsächlich die Programmierung gegen einen SMTP-Server.

Vineet Reynolds
quelle
Kann ich Tomcat als meinen SMTP-Server verwenden? Hilfe in Bezug auf das gleiche wäre dankbar. :)
CᴴᴀZ
3
@ChaZ Woher kam die Idee, dass Tomcat ein SMTP-Server sein würde?
Eis
6

Sie benötigen einen SMTP-Server zum Senden von E-Mails. Es gibt Server, die Sie lokal auf Ihrem eigenen PC installieren können, oder Sie können einen der vielen Online-Server verwenden. Einer der bekannteren Server ist der von Google:

Ich habe gerade die zulässigen Google SMTP-Konfigurationen anhand des ersten Beispiels aus Simple Java Mail erfolgreich getestet :

    final Email email = EmailBuilder.startingBlank()
        .from("lollypop", "[email protected]")
        .to("C.Cane", "[email protected]")
        .withPlainText("We should meet up!")
        .withHTMLText("<b>We should meet up!</b>")
        .withSubject("hey");

    // starting 5.0.0 do the following using the MailerBuilder instead...
    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);

Beachten Sie die verschiedenen Häfen und Transportstrategien (die alle für Sie erforderlichen Eigenschaften verwalten).

Seltsamerweise benötigt Google TLS auch für Port 25, obwohl die Anweisungen von Google etwas anderes aussagen .

Benny Bottema
quelle
1
Wie der Name schon sagt, ist es einfach
Kai Wang
4

Es ist schon eine Weile her, seit dies veröffentlicht wurde. Ab dem 13. November 2012 kann ich jedoch überprüfen, ob Port 465 noch funktioniert.

Lesen Sie die Antwort von GaryM in diesem Forum . Ich hoffe das hilft noch ein paar Leuten.

/*
* Created on Feb 21, 2005
*
*/

import java.security.Security;
import java.util.Properties;

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;

public class GoogleTest {

    private static final String SMTP_HOST_NAME = "smtp.gmail.com";
    private static final String SMTP_PORT = "465";
    private static final String emailMsgTxt = "Test Message Contents";
    private static final String emailSubjectTxt = "A test from gmail";
    private static final String emailFromAddress = "";
    private static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
    private static final String[] sendTo = { "" };


    public static void main(String args[]) throws Exception {

        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

        new GoogleTest().sendSSLMessage(sendTo, emailSubjectTxt,
            emailMsgTxt, emailFromAddress);
        System.out.println("Sucessfully mail to All Users");
    }

    public void sendSSLMessage(String recipients[], String subject,
                               String message, String from) throws MessagingException {
        boolean debug = true;

        Properties props = new Properties();
        props.put("mail.smtp.host", SMTP_HOST_NAME);
        props.put("mail.smtp.auth", "true");
        props.put("mail.debug", "true");
        props.put("mail.smtp.port", SMTP_PORT);
        props.put("mail.smtp.socketFactory.port", SMTP_PORT);
        props.put("mail.smtp.socketFactory.class", SSL_FACTORY);
        props.put("mail.smtp.socketFactory.fallback", "false");

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

        session.setDebug(debug);

        Message msg = new MimeMessage(session);
        InternetAddress addressFrom = new InternetAddress(from);
        msg.setFrom(addressFrom);

        InternetAddress[] addressTo = new InternetAddress[recipients.length];
        for (int i = 0; i < recipients.length; i++) {
            addressTo[i] = new InternetAddress(recipients);
        }
        msg.setRecipients(Message.RecipientType.TO, addressTo);

        // Setting the Subject and Content Type
        msg.setSubject(subject);
        msg.setContent(message, "text/plain");
        Transport.send(msg);
    }
}
Mukus
quelle
1
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - Von der Überprüfung
swiftBoy
1
Die Antwort aus dem Beitrag wurde hinzugefügt.
Mukus
1
@ Mukush Geat !! das wird in Zukunft jemandem helfen.
SwiftBoy
3

Der folgende Code funktioniert sehr gut. Versuchen Sie dies als Java-Anwendung mit javamail-1.4.5.jar

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public class MailSender
{
    final String senderEmailID = "[email protected]";
    final String senderPassword = "typesenderpassword";
    final String emailSMTPserver = "smtp.gmail.com";
    final String emailServerPort = "465";
    String receiverEmailID = null;
    static String emailSubject = "Test Mail";
    static String emailBody = ":)";

    public MailSender(
            String receiverEmailID,
            String emailSubject,
            String emailBody
    ) {
        this.receiverEmailID=receiverEmailID;
        this.emailSubject=emailSubject;
        this.emailBody=emailBody;
        Properties props = new Properties();
        props.put("mail.smtp.user",senderEmailID);
        props.put("mail.smtp.host", emailSMTPserver);
        props.put("mail.smtp.port", emailServerPort);
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.socketFactory.port", emailServerPort);
        props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");
        SecurityManager security = System.getSecurityManager();
        try {
            Authenticator auth = new SMTPAuthenticator();
            Session session = Session.getInstance(props, auth);
            MimeMessage msg = new MimeMessage(session);
            msg.setText(emailBody);
            msg.setSubject(emailSubject);
            msg.setFrom(new InternetAddress(senderEmailID));
            msg.addRecipient(Message.RecipientType.TO,
                    new InternetAddress(receiverEmailID));
            Transport.send(msg);
            System.out.println("Message send Successfully:)");
        }
        catch (Exception mex)
        {
            mex.printStackTrace();
        }
    }

    public class SMTPAuthenticator extends javax.mail.Authenticator
    {
        public PasswordAuthentication getPasswordAuthentication()
        {
            return new PasswordAuthentication(senderEmailID, senderPassword);
        }
    }

    public static void main(String[] args)
    {
        MailSender mailSender=new
            MailSender("[email protected]",emailSubject,emailBody);
    }
}
Gayathri Rajan
quelle
2

Funktioniert dieser Code zum Senden von E-Mails?

Nun, nein, nicht ohne einige Teile zu wechseln, da Sie eine Fehlermeldung erhalten. Sie versuchen derzeit, E-Mails über einen SMTP-Server zu senden, der auf localhost ausgeführt wird, aber Sie führen keine aus ConnectException.

Angenommen, der Code ist in Ordnung (ich habe ihn nicht wirklich überprüft), müssen Sie entweder einen lokalen SMTP-Server ausführen oder einen (Remote-) Server (von Ihrem ISP) verwenden.

In Bezug auf den Code finden Sie Beispiele im JavaMail-Download-Paket, wie in den FAQ erwähnt :

Wo finde ich einige Beispielprogramme, die zeigen, wie JavaMail verwendet wird?

F: Wo finde ich einige Beispielprogramme, die zeigen, wie JavaMail verwendet wird?
A: Das JavaMail-Downloadpaket enthält viele Beispielprogramme , darunter einfache Befehlszeilenprogramme, die verschiedene Aspekte der JavaMail-API veranschaulichen, eine Swing-basierte GUI-Anwendung, eine einfache Servlet-basierte Anwendung und eine vollständige Webanwendung mit JSP-Seiten und eine Tag-Bibliothek.

Pascal Thivent
quelle
Hallo, was ist eigentlich ein SMTP-Server? Ist es im E-Mail-Server enthalten und gebündelt? Oder müssen wir SMTP separat einrichten?
GMsoF
Dovecot ist ein SMTP-Server. Stellen Sie sich diese Frage: Was Software macht Google laufen , dass Sie diese E-Mail sind zu senden an ? Sie betreiben eine Art SMTP-Server. Dovecot ist gut; Taubenschlag und Postfix zusammen sind besser. Ich denke, Postfix ist der SMTP-Teil und Dovecot der IMAP-Teil.
Thufir
2

Probieren Sie es aus. es funktioniert gut für mich. Stellen Sie sicher, dass Sie vor dem Senden einer E-Mail den Zugriff für eine weniger sichere App in Ihrem Google Mail-Konto gewähren müssen. Gehen Sie also zum folgenden Link und probieren Sie diesen Java-Code aus.
Aktivieren Sie Google Mail für eine weniger sichere App

Sie müssen die Datei javax.mail.jar und die Datei activity.jar in Ihr Projekt importieren.

Dies ist der vollständige Code zum Senden von E-Mails in Java

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public class SendEmail {

    final String senderEmail = "your email address";
    final String senderPassword = "your password";
    final String emailSMTPserver = "smtp.gmail.com";
    final String emailServerPort = "587";
    String receiverEmail = null;
    String emailSubject = null;
    String emailBody = null;

    public SendEmail(String receiverEmail, String Subject, String message) {
        this.receiverEmail = receiverEmail;
        this.emailSubject = Subject;
        this.emailBody = message;

        Properties props = new Properties();
        props.put("mail.smtp.user", senderEmail);
        props.put("mail.smtp.host", emailSMTPserver);
        props.put("mail.smtp.port", emailServerPort);
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.socketFactory.port", emailServerPort);
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

        SecurityManager security = System.getSecurityManager();

        try {
            Authenticator auth = new SMTPAuthenticator();
            Session session = Session.getInstance(props, auth);

            Message msg = new MimeMessage(session);
            msg.setText(emailBody);
            msg.setSubject(emailSubject);
            msg.setFrom(new InternetAddress(senderEmail));
            msg.addRecipient(Message.RecipientType.TO,
                    new InternetAddress(receiverEmail));
            Transport.send(msg);
            System.out.println("send successfully");
        } catch (Exception ex) {
            System.err.println("Error occurred while sending.!");
        }

    }

    private class SMTPAuthenticator extends javax.mail.Authenticator {

        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(senderEmail, senderPassword);
        }
    }

    public static void main(String[] args) {
        SendEmail send = new SendEmail("receiver email address", "subject", "message");
    }

}
Sumith Madhushan
quelle
2

Hier ist die Arbeitslösung bro. Es ist garantiert.

  1. Öffnen Sie zunächst Ihr Google Mail-Konto, von dem aus Sie E-Mails senden möchten, wie in Ihrem Fall [email protected]
  2. Öffnen Sie diesen Link unten:

    https://support.google.com/accounts/answer/6010255?hl=de

  3. Klicken Sie unter "Mein Konto" auf "Zum Abschnitt" Weniger sichere Apps "." Möglichkeit
  4. Dann schalten Sie es ein
  5. Das ist es (:

Hier ist mein Code:

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public class SendEmail {

   final String senderEmailID = "Sender Email id";
final String senderPassword = "Sender Pass word";
final String emailSMTPserver = "smtp.gmail.com";
final String emailServerPort = "465";
String receiverEmailID = null;
static String emailSubject = "Test Mail";
static String emailBody = ":)";
public SendEmail(String receiverEmailID, String emailSubject, String emailBody)
{
this.receiverEmailID=receiverEmailID;
this.emailSubject=emailSubject;
this.emailBody=emailBody;
Properties props = new Properties();
props.put("mail.smtp.user",senderEmailID);
props.put("mail.smtp.host", emailSMTPserver);
props.put("mail.smtp.port", emailServerPort);
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.socketFactory.port", emailServerPort);
props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
SecurityManager security = System.getSecurityManager();
try
{
Authenticator auth = new SMTPAuthenticator();
Session session = Session.getInstance(props, auth);
MimeMessage msg = new MimeMessage(session);
msg.setText(emailBody);
msg.setSubject(emailSubject);
msg.setFrom(new InternetAddress(senderEmailID));
msg.addRecipient(Message.RecipientType.TO,
new InternetAddress(receiverEmailID));
Transport.send(msg);
System.out.println("Message send Successfully:)");
}
catch (Exception mex)
{
mex.printStackTrace();
}
}
public class SMTPAuthenticator extends javax.mail.Authenticator
{
public PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(senderEmailID, senderPassword);
}
}
    public static void main(String[] args) {
       SendEmail mailSender;
        mailSender = new SendEmail("Receiver Email id","Testing Code 2 example","Testing Code Body yess");
    }

}
Zulfiqar Ali
quelle
Vielen Dank! Es hat bei mir funktioniert! Ich ging zu "Weniger sichere Apps" in der Option "Mein Konto" und generierte ein Passwort für MyApp.
raikumardipak
1

Ich habe meine funktionierende Google Mail-Java-Klasse für Ihre Überprüfung auf Pastebin gestellt. Achten Sie besonders auf die Methode "startSessionWithTLS", und Sie können möglicherweise JavaMail anpassen, um dieselbe Funktionalität bereitzustellen. http://pastebin.com/VE8Mqkqp

Paul Gregoire
quelle
Vielleicht könnten Sie in Ihrer Antwort auch etwas mehr angeben?
Antti Haapala
1

Ihr Code funktioniert, abgesehen vom Einrichten der Verbindung mit dem SMTP-Server. Sie benötigen einen SMTP-Server (Running Mail), um E-Mails für Sie zu senden.

Hier ist Ihr geänderter Code. Ich habe die nicht benötigten Teile auskommentiert und die Sitzungserstellung so geändert, dass ein Authenticator erforderlich ist. Finden Sie jetzt einfach die SMPT_HOSTNAME, USERNAME und PASSWORD heraus, die Sie verwenden möchten (Ihr Internetprovider stellt sie normalerweise zur Verfügung).

Ich mache das immer so (mit einem mir bekannten Remote-SMTP-Server), weil das Ausführen eines lokalen Mailservers unter Windows nicht so trivial ist (unter Linux ist es anscheinend recht einfach).

import java.util.*;

import javax.mail.*;
import javax.mail.internet.*;

//import javax.activation.*;

public class SendEmail {

    private static String SMPT_HOSTNAME = "";
    private static String USERNAME = "";
    private static String PASSWORD = "";

    public static void main(String[] args) {

        // Recipient's email ID needs to be mentioned.
        String to = "[email protected]";

        // Sender's email ID needs to be mentioned
        String from = "[email protected]";

        // Assuming you are sending email from localhost
        // String host = "localhost";

        // Get system properties
        Properties properties = System.getProperties();

        // Setup mail server
        properties.setProperty("mail.smtp.host", SMPT_HOSTNAME);

        // Get the default Session object.
        // Session session = Session.getDefaultInstance(properties);

        // create a session with an Authenticator
        Session session = Session.getInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USERNAME, PASSWORD);
            }
        });

        try {
            // Create a default MimeMessage object.
            MimeMessage message = new MimeMessage(session);

            // Set From: header field of the header.
            message.setFrom(new InternetAddress(from));

            // Set To: header field of the header.
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(
                    to));

            // Set Subject: header field
            message.setSubject("This is the Subject Line!");

            // Now set the actual message
            message.setText("This is actual message");

            // Send message
            Transport.send(message);
            System.out.println("Sent message successfully....");
        } catch (MessagingException mex) {
            mex.printStackTrace();
        }
    }
}
Adriaan Koster
quelle
1

In der Tat funktioniert 465, und die Ausnahme, die Sie erhalten, kann auf den nicht geöffneten SMTP-Port 25 zurückzuführen sein. Standardmäßig lautet die Portnummer 25. Sie können sie jedoch mithilfe des Mail-Agenten konfigurieren, der als Open Source verfügbar ist - Mercury

Verwenden Sie der Einfachheit halber einfach die folgende Konfiguration, und alles wird gut.

// Setup your mail server
props.put("mail.smtp.host", SMTP_HOST); 
props.put("mail.smtp.user",FROM_NAME);
props.put("mail.smtp.ssl.enable", "true");
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");

Für noch mehr: Schauen Sie sich hier das komplette Arbeitsbeispiel von Grund auf an

Atif Imran
quelle
1

Ich habe die gleiche Ausnahme wie du. Grund dafür ist, dass auf Ihrem Computer kein SMTP-Server eingerichtet ist (da Ihr Host localhost ist). Wenn Sie Windows 7 verwenden, verfügt es nicht über einen SMTP-Server. Sie müssen also hmailserver als SMTP-Server verwenden, der auf meinem lokalen Computer installiert und konfiguriert ist. https://www.hmailserver.com/download

Lasan
quelle
-2

Eine vollständige und sehr einfache Java-Klasse zum Senden von E-Mails über ein Google-Konto (Google Mail) finden Sie hier.

Senden Sie E-Mails mit Java und Google-Konto

Es werden die folgenden Eigenschaften verwendet

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", "587");
Lasa
quelle
1
Beachten Sie, dass bei SO nur von Link-Antworten abgeraten wird. Es ist besser, die Antwort in die Antwort selbst aufzunehmen.
Laalto