Wyślij e-mail za pomocą java

112

Próbuję wysłać wiadomość e-mail za pomocą Java:

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

Otrzymuję błąd:

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)

Czy ten kod będzie działał do wysyłania wiadomości e-mail?

Mohit Bansal
źródło
11
Czy używasz serwera SMTP na tym samym komputerze, który nasłuchuje na porcie 25?
Jeff,
Mam zamiar założyć na podstawie twoich adresów, że próbujesz przekazywać przez Gmaila? Jeśli to prawda, być może mam kod, którego możesz użyć. Oto wskazówka, potrzebujesz TLS
Paul Gregoire,
@Mondain Dobrze byłoby, gdybyś umieścił kod. Chcę przekazywać za pomocą Gmaila
Mohit Bansal
Jest powiązany w mojej odpowiedzi poniżej, jedynym haczykiem jest to, że nie używa biblioteki JavaMail. Jeśli chcesz, mogę przesłać Ci pełne źródło informacji.
Paul Gregoire,

Odpowiedzi:

98

Poniższy kod działa bardzo dobrze z serwerem Google SMTP. Musisz podać swoją nazwę użytkownika i hasło Google.

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

Aktualizacja 11 grudnia 2015 r

Nazwa użytkownika i hasło nie są już zalecanym rozwiązaniem. Jest to spowodowane

Próbowałem tego, a Gmail wysłał e-mail używany jako nazwa użytkownika w tym kodzie, e-mail z informacją, że niedawno zablokowaliśmy próbę zalogowania się na Twoje konto Google i przekierował mnie na tę stronę pomocy: support.google.com/accounts/answer/6010255 więc wygląda na to, że działa, konto e-mail używane do wysyłania musi zmniejszyć ich własne bezpieczeństwo

Firma Google udostępniła interfejs API Gmaila - https://developers.google.com/gmail/api/?hl=en . Powinniśmy użyć metody oAuth2 zamiast nazwy użytkownika i hasła.

Oto fragment kodu do pracy z interfejsem Gmail 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();
    }
}

Oto fragment kodu, aby utworzyć autoryzowaną usługę Gmail za pośrednictwem protokołu oAuth2.

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

Aby zapewnić przyjazny dla użytkownika sposób uwierzytelniania oAuth2, skorzystałem z JavaFX, aby wyświetlić następujące okno dialogowe

wprowadź opis obrazu tutaj

Klucz do wyświetlenia przyjaznego dla użytkownika okna dialogowego oAuth2 można znaleźć w MyAuthorizationCodeInstalledApp.java i SimpleSwingBrowser.java

Cheok Yan Cheng
źródło
Błąd pobierania: wyjątek w wątku „main” javax.mail.MessagingException: nie można połączyć się z hostem SMTP: smtp.gmail.com, port: 465; zagnieżdżony wyjątek to: java.net.ConnectException: Przekroczono limit czasu połączenia: połącz się pod adresem com.sun.mail.smtp.SMTPTransport.openServer (SMTPTransport.java:1706)
Mohit Bansal
1
Jeśli pingujesz smtp.gmail.com, czy otrzymujesz odpowiedź?
Cheok Yan Cheng
Jak powiedziałem wcześniej, jestem nowy w STMP i nie wiem, jak pingować smtp.gmail.com.
Mohit Bansal,
2
W wierszu poleceń wpisz „ping smtp.gmail.com” i naciśnij Enter.
Cheok Yan Cheng
12
Nie podoba mi się to, że metody są wywoływane Sendzamiast, sendale jest to przydatna klasa. Masz jakieś przemyślenia na temat wpływu przechowywania hasła Gmaila w kodzie na bezpieczeństwo?
Simon Forsberg
48

Poniższy kod zadziałał dla mnie.

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
źródło
1
Pracował na koncie z wyłączonym uwierzytelnianiem dwuskładnikowym. To świetne rozwiązanie, ponieważ jest lokalne, a pakiety słoneczne nie są wymagane.
AlikElzin-kilaka
Aby użyć tego kodu, e-mail, z którego ma być wysłany, musi być kontem Gmail?
Erick
3
kod pracował dla mnie, ale najpierw muszę zrobić to i włącz „Dostęp dla mniej bezpiecznych aplikacji”
@ user4966430 Zgoda! i dzięki!
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 );
    }
}
}

Wymagane pliki jar

Kliknij tutaj - Jak dodać zewnętrzne słoiki

Kirit Vaghela
źródło
11

Krótka odpowiedź - nie.

Długa odpowiedź - nie, ponieważ kod opiera się na obecności serwera SMTP działającego na komputerze lokalnym i nasłuchiwania na porcie 25. Serwer SMTP (technicznie MTA lub Mail Transfer Agent) jest odpowiedzialny za komunikację z Mail User Agent (MUA, który w tym przypadku jest procesem Java) do odbierania wychodzących wiadomości e-mail.

Obecnie MTA są zazwyczaj odpowiedzialne za odbieranie wiadomości od użytkowników z określonej domeny. Tak więc w przypadku domeny gmail.com to serwery poczty Google są odpowiedzialne za uwierzytelnianie programów pocztowych, a tym samym przesyłanie wiadomości do skrzynek odbiorczych na serwerach Gmaila. Nie jestem pewien, czy GMail ufa otwartym serwerom przekazującym pocztę, ale z pewnością nie jest łatwym zadaniem przeprowadzenie uwierzytelnienia w imieniu Google, a następnie przekazanie poczty do serwerów Gmaila.

Jeśli przeczytasz FAQ JavaMail na temat używania JavaMail do uzyskiwania dostępu do Gmaila , zauważysz, że nazwa hosta i port wskazują na serwery GMail, a na pewno nie na localhost. Jeśli zamierzasz korzystać z komputera lokalnego, musisz wykonać przekazywanie lub przekazywanie.

Prawdopodobnie będziesz musiał dogłębnie zrozumieć protokół SMTP, jeśli zamierzasz dotrzeć gdziekolwiek, jeśli chodzi o SMTP. Możesz zacząć od artykułu w Wikipedii na temat SMTP , ale dalszy postęp w rzeczywistości będzie wymagał programowania na serwerze SMTP.

Vineet Reynolds
źródło
Czy mogę używać Tomcat jako mojego serwera SMTP? Będziemy wdzięczni za pomoc dotyczącą tego samego. :)
CᴴᴀZ
3
@ChaZ, skąd pomysł, że Tomcat będzie serwerem SMTP?
eis
6

Do wysyłania e-maili potrzebny jest serwer SMTP. Istnieją serwery, które możesz zainstalować lokalnie na swoim komputerze lub możesz użyć jednego z wielu serwerów online. Jednym z bardziej znanych serwerów jest Google:

Właśnie pomyślnie przetestowałem dozwolone konfiguracje SMTP Google na pierwszym przykładzie z Simple Java Mail :

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

Zwróć uwagę na różne porty i strategie transportu (które obsługują wszystkie niezbędne właściwości).

Co ciekawe, Google wymaga TLS również na porcie 25, mimo że instrukcje Google mówią inaczej .

Benny Bottema
źródło
1
jak sama nazwa wskazuje, to proste
Kai Wang
4

Minęło sporo czasu, odkąd to zostało opublikowane. Ale od 13 listopada 2012 mogę sprawdzić, czy port 465 nadal działa.

Zapoznaj się z odpowiedzią GaryMa na tym forum . Mam nadzieję, że pomoże to jeszcze kilku osobom.

/*
* 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
źródło
1
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest zawrzeć tutaj zasadnicze części odpowiedzi i podać link do odniesienia. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie. - Z recenzji
swiftBoy
1
Dodano odpowiedź z postu.
Mukus
1
@Mukush Geat !! który pomoże komuś w przyszłości.
swiftBoy
3

Poniższy kod działa bardzo dobrze. Wypróbuj go jako aplikację java z 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
źródło
2

Czy ten kod będzie działał do wysyłania wiadomości e-mail?

Cóż, nie, nie bez wymiany niektórych części, ponieważ pojawia się błąd. Obecnie próbujesz wysłać pocztę za pośrednictwem serwera SMTP działającego na hoście lokalnym, ale nie masz uruchomionego, stąd ConnectException.

Zakładając, że kod jest OK (tak naprawdę nie sprawdzałem), będziesz musiał albo uruchomić lokalny serwer SMTP, albo użyć (zdalnego) serwera (od twojego ISP).

Jeśli chodzi o kod, przykłady można znaleźć w pakiecie pobierania JavaMail, jak wspomniano w FAQ :

Gdzie mogę znaleźć przykładowe programy, które pokazują, jak używać JavaMail?

P: Gdzie mogę znaleźć przykładowe programy, które pokazują, jak używać JavaMail?
Odp .: W pakiecie pobierania JavaMail znajduje się wiele przykładowych programów , w tym proste programy wiersza poleceń ilustrujące różne aspekty API JavaMail, aplikacja GUI oparta na Swing, prosta aplikacja oparta na serwletach oraz kompletna aplikacja internetowa korzystająca ze stron JSP i biblioteka znaczników.

Pascal Thivent
źródło
Cześć, czym właściwie jest serwer SMTP? Czy jest dołączony i dołączony do serwera e-mail? Czy też musimy osobno skonfigurować smtp?
GMsoF
dovecot to serwer SMTP. Zadaj sobie pytanie: co robi Google Uruchom oprogramowanie, które wysyłasz ten e-mail , aby ? Działają na jakimś serwerze SMTP. Dovecot jest dobry; dovecot i postfix razem są lepsze. Myślę, że postfix to część smtp, a dovecot część imap.
Thufir
2

Wypróbuj to. To działa dobrze dla mnie. Upewnij się, że przed wysłaniem wiadomości e-mail musisz przyznać dostęp do mniej bezpiecznej aplikacji na swoim koncie Gmail. Więc przejdź do poniższego linku i wypróbuj ten kod java.
Aktywuj Gmaila dla mniej bezpiecznej aplikacji

Musisz zaimportować do projektu plik javax.mail.jar i plik aktywacja.jar.

To jest pełny kod do wysyłania wiadomości e-mail w języku 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
źródło
2

Oto działające rozwiązanie brachu. To jest gwarantowane.

  1. Przede wszystkim otwórz swoje konto Gmail, z którego chciałeś wysyłać pocztę, tak jak w twoim przypadku [email protected]
  2. Otwórz ten link poniżej:

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

  3. Kliknij „Przejdź do sekcji„ Mniej bezpieczne aplikacje ”na stronie Moje konto”. opcja
  4. Następnie włącz go
  5. Otóż ​​to (:

Oto mój kod:

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
źródło
Dzięki! U mnie zadziałało! Poszedłem do opcji „Mniej bezpieczne aplikacje” na moim koncie. ”I wygenerowałem hasło do mojej aplikacji.
raikumardipak,
1

Umieściłem moją działającą klasę Java w Gmailu na pastebin do przeglądu, zwróć szczególną uwagę na metodę "startSessionWithTLS", a być może będziesz w stanie dostosować JavaMail, aby zapewniał tę samą funkcjonalność. http://pastebin.com/VE8Mqkqp

Paul Gregoire
źródło
może mógłbyś również udzielić trochę więcej w swojej odpowiedzi?
Antti Haapala
1

Twój kod działa poza zestawieniem połączenia z serwerem SMTP. Aby wysyłać do Ciebie wiadomości e-mail, potrzebujesz działającego serwera poczty (SMTP).

Oto twój zmodyfikowany kod. Skomentowałem części, które nie są potrzebne, i zmieniłem tworzenie sesji, więc wymaga Authenticator. Teraz po prostu znajdź SMPT_HOSTNAME, NAZWA UŻYTKOWNIKA i HASŁO, których chcesz użyć (Twój dostawca Internetu zwykle je dostarcza).

Zawsze robię to w ten sposób (używając zdalnego serwera SMTP, który znam), ponieważ uruchomienie lokalnego serwera poczty nie jest takie proste w systemie Windows (najwyraźniej jest to dość łatwe pod Linuksem).

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
źródło
1

Rzeczywiście 465 działa, a wyjątek, który otrzymujesz, może być spowodowany nieotwartym portem SMTP 25. Domyślnie numer portu to 25. Jednak możesz go skonfigurować za pomocą agenta pocztowego, który jest dostępny jako open source - Mercury

Dla uproszczenia wystarczy użyć następującej konfiguracji i wszystko będzie dobrze.

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

Aby uzyskać więcej informacji: zapoznaj się z pełnym przykładem roboczym od podstaw tutaj

Atif Imran
źródło
1

Mam taki sam wyjątek jak ty. Przyczyną tego jest brak zainstalowanego i uruchomionego serwera SMPT na twojej maszynie (ponieważ twój host to localhost). Jeśli używasz systemu Windows 7, nie ma on serwera SMTP. więc będziesz musiał pobrać, zainstalować i skonfigurować domenę oraz utworzyć konta. Użyłem hmailserver jako serwera smtp zainstalowanego i skonfigurowanego na moim lokalnym komputerze. https://www.hmailserver.com/download

Lasan
źródło
-2

Pełną i bardzo prostą klasę java do wysyłania e-maili za pomocą konta Google (gmail) można znaleźć tutaj,

Wyślij e-mail za pomocą java i konta Google

Wykorzystuje następujące właściwości

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
źródło
1
Zwróć uwagę, że odpowiedzi zawierające tylko łącze są odradzane w SO. Lepiej jest zawrzeć odpowiedź w samej odpowiedzi.
laalto