Kirim email menggunakan java


112

Saya mencoba mengirim email menggunakan 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 = "abcd@gmail.com";

      // Sender's email ID needs to be mentioned
      String from = "web@gmail.com";

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

Saya mendapatkan kesalahan:

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)

Akankah kode ini berfungsi untuk mengirim email?


11
Apakah Anda menjalankan server SMTP pada mesin yang sama yang mendengarkan pada porta 25?
Jeff

Saya akan berasumsi dengan alamat Anda bahwa Anda mencoba menyampaikan melalui gmail? Jika ini benar maka saya mungkin memiliki beberapa kode yang dapat Anda gunakan. Ini petunjuknya, Anda memerlukan TLS
Paul Gregoire

@Mondain Akan sangat membantu jika Anda dapat lima kode. Saya ingin menyampaikan menggunakan gmail
Mohit Bansal

Ini terkait dalam jawaban saya di bawah, satu-satunya tangkapan adalah tidak menggunakan perpustakaan JavaMail. Saya dapat mengirimkan sumber lengkapnya kepada Anda jika Anda mau.
Paul Gregoire

Jawaban:


98

Kode berikut bekerja sangat baik dengan server SMTP Google. Anda perlu memberikan nama pengguna dan sandi Google Anda.

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 tanggal 11 Desember 2015

Nama pengguna + kata sandi bukan lagi solusi yang disarankan. Ini berhubungan dengan

Saya mencoba ini dan Gmail mengirim email yang digunakan sebagai nama pengguna dalam kode ini, email yang mengatakan bahwa Kami baru-baru ini memblokir upaya masuk ke Akun Google Anda, dan mengarahkan saya ke halaman dukungan ini: support.google.com/accounts/answer/6010255 agar terlihat berfungsi, akun email yang digunakan untuk mengirim perlu mengurangi keamanannya sendiri

Google telah merilis API Gmail - https://developers.google.com/gmail/api/?hl=id . Kita harus menggunakan metode oAuth2, bukan nama pengguna + kata sandi.

Berikut cuplikan kode untuk bekerja dengan API Gmail.

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

Untuk membuat layanan Gmail resmi melalui oAuth2, berikut cuplikan kodenya.

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

Untuk menyediakan cara autentikasi oAuth2 yang ramah pengguna, saya menggunakan JavaFX, untuk menampilkan dialog input berikut

masukkan deskripsi gambar di sini

Kunci untuk menampilkan dialog oAuth2 yang ramah pengguna dapat ditemukan di MyAuthorizationCodeInstalledApp.java dan SimpleSwingBrowser.java


Mendapatkan Kesalahan: Pengecualian di utas "main" javax.mail.MessagingException: Tidak dapat menyambung ke host SMTP: smtp.gmail.com, porta: 465; pengecualian bersarang adalah: java.net.ConnectException: Waktu koneksi habis: sambungkan di com.sun.mail.smtp.SMTPTransport.openServer (SMTPTransport.java:1706)
Mohit Bansal

1
Jika Anda melakukan ping ke smtp.gmail.com, apakah Anda mendapat tanggapan?
Cheok Yan Cheng

Seperti yang saya katakan sebelumnya, saya baru mengenal STMP dan saya tidak tahu cara melakukan ping ke smtp.gmail.com.
Mohit Bansal

2
Di prompt perintah Anda, ketik 'ping smtp.gmail.com' dan tekan enter.
Cheok Yan Cheng

12
Saya tidak suka bahwa metode disebut Sendbukan sendtetapi merupakan kelas yang berguna. Ada pendapat tentang implikasi keamanan dari menyimpan sandi gmail dalam kode?
Simon Forsberg

48

Kode berikut berhasil untuk saya.

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 = "your_user_name@gmail.com";
        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("your_user_name@gmail.com"));
            message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("to_email_address@domain.com"));
            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);
        }
    }
}

1
Bekerja pada akun dengan otentikasi 2 faktor yang dinonaktifkan. Solusi ini bagus karena bersifat lokal dan paket matahari tidak diperlukan.
AlikElzin-kilaka

Untuk menggunakan kode ini, email yang akan dikirim harus memiliki akun gmail?
Erick

3
kode berfungsi untuk saya, tetapi pertama-tama saya perlu melakukan ini dan mengaktifkan "Akses untuk aplikasi yang kurang aman"

@ user4966430 Setuju! dan terimakasih!
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("username@yahoo.com", "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( "fromusername@yahoo.com" ) );
        msg.setRecipients( Message.RecipientType.TO,InternetAddress.parse("tousername@gmail.com") );
        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 );
    }
}
}

File jar yang diperlukan

Klik di sini - Cara menambahkan Jars Eksternal


11

Jawaban singkatnya - Tidak.

Jawaban panjang - tidak, karena kode bergantung pada keberadaan server SMTP yang berjalan di mesin lokal, dan mendengarkan pada port 25. Server SMTP (secara teknis MTA atau Agen Transfer Surat) bertanggung jawab untuk berkomunikasi dengan Agen Pengguna Email (MUA, yang dalam hal ini adalah proses Java) untuk menerima email keluar.

Sekarang, MTA biasanya bertanggung jawab untuk menerima email dari pengguna untuk domain tertentu. Jadi, untuk domain gmail.com, server email Google-lah yang bertanggung jawab untuk mengautentikasi agen pengguna email dan karenanya mentransfer email ke kotak masuk di server GMail. Saya tidak yakin apakah GMail mempercayai server relai email terbuka, tetapi tentunya bukan tugas yang mudah untuk melakukan otentikasi atas nama di Google, dan kemudian merelay email ke server GMail.

Jika Anda membaca FAQ JavaMail tentang menggunakan JavaMail untuk mengakses GMail , Anda akan melihat bahwa nama host dan port kebetulan mengarah ke server GMail, dan tentunya bukan ke localhost. Jika Anda berniat untuk menggunakan komputer lokal Anda, Anda harus melakukan relay atau forwarding.

Anda mungkin perlu memahami protokol SMTP secara mendalam jika Anda ingin pergi ke mana pun terkait SMTP. Anda dapat memulai dengan artikel Wikipedia di SMTP , tetapi kemajuan lebih lanjut sebenarnya akan memerlukan pemrograman terhadap server SMTP.


Dapatkah saya menggunakan Tomcat sebagai server SMTP saya? Bantuan tentang hal yang sama akan sangat kami hargai. :)
Cį““į“€Z

3
@ChaZ dari mana Anda mendapatkan ide Tomcat akan menjadi server SMTP?
eis

6

Anda memerlukan server SMTP untuk mengirim email. Ada server yang dapat Anda instal secara lokal di komputer Anda sendiri, atau Anda dapat menggunakan salah satu dari banyak server online. Salah satu server yang lebih terkenal adalah Google:

Saya baru saja berhasil menguji konfigurasi SMTP Google yang diizinkan menggunakan contoh pertama dari Simple Java Mail :

    final Email email = EmailBuilder.startingBlank()
        .from("lollypop", "lol.pop@somemail.com")
        .to("C.Cane", "candycane@candyshop.org")
        .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);

Perhatikan berbagai port dan strategi transport (yang menangani semua properti yang diperlukan untuk Anda).

Anehnya, Google juga membutuhkan TLS pada porta 25, meskipun instruksi Google mengatakan sebaliknya .


1
seperti namanya, itu Sederhana
Kai Wang

4

Sudah cukup lama sejak ini diposting. Namun mulai 13 November 2012 saya dapat memverifikasi bahwa port 465 masih berfungsi.

Lihat jawaban GaryM di forum ini . Saya harap ini membantu lebih banyak orang.

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

1
Meskipun tautan ini mungkin menjawab pertanyaan, lebih baik menyertakan bagian penting dari jawaban di sini dan menyediakan tautan untuk referensi. Jawaban link saja bisa menjadi tidak valid jika halaman tertaut berubah. - Dari Ulasan
swiftBoy

1
Menambahkan jawaban dari postingan.
Mukus

1
@Tokopedia yang akan membantu seseorang di masa depan.
swiftBoy

3

Kode berikut bekerja dengan sangat baik. Coba ini sebagai aplikasi java dengan javamail-1.4.5.jar

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

public class MailSender
{
    final String senderEmailID = "typesendermailid@gmail.com";
    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("typereceivermailid@gmail.com",emailSubject,emailBody);
    }
}

2

Akankah kode ini berfungsi untuk mengirim email?

Ya, tidak, tidak tanpa mengubah beberapa bagian karena Anda mendapatkan kesalahan. Anda saat ini mencoba mengirim email melalui server SMTP yang berjalan di localhost tetapi Anda tidak menjalankannya ConnectException.

Dengan asumsi kodenya OK (saya tidak benar-benar memeriksa), Anda harus menjalankan server SMTP lokal, atau menggunakan server (jarak jauh) (dari ISP Anda).

Mengenai kodenya, Anda dapat menemukan contoh di paket unduhan JavaMail seperti yang disebutkan di FAQ :

Di mana saya dapat menemukan beberapa program contoh yang menunjukkan cara menggunakan JavaMail?

T: Di mana saya dapat menemukan beberapa program contoh yang menunjukkan cara menggunakan JavaMail?
J: Ada banyak program contoh yang disertakan dalam paket unduhan JavaMail , termasuk program baris perintah sederhana yang menggambarkan berbagai aspek API JavaMail, aplikasi GUI berbasis Swing, aplikasi berbasis servlet sederhana, dan aplikasi web lengkap menggunakan halaman JSP dan perpustakaan tag.


Hai, apa sebenarnya server smtp itu? Apakah itu termasuk dan dibundel di server Email? Atau kita harus mengatur smtp secara terpisah?
GMsoF

dovecot adalah server SMTP. Tanyakan kepada diri Anda pertanyaan ini: apa software tidak Google run bahwa Anda mengirim e-mail ini ke ? Mereka menjalankan semacam server smtp. Dovecot itu bagus; dovecot dan postfix bersama-sama lebih baik. Saya pikir postfix adalah bagian smtp dan dovecot adalah bagian imap.
Thufir

2

Coba ini. itu bekerja dengan baik untuk saya. Pastikan sebelum mengirim email Anda perlu memberikan akses untuk aplikasi yang kurang aman di akun gmail Anda. Jadi buka tautan berikut dan coba dengan kode java ini.
Aktifkan gmail untuk aplikasi yang kurang aman

Anda perlu mengimpor file javax.mail.jar dan file activation.jar ke proyek Anda.

Ini adalah kode lengkap untuk mengirim email di 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");
    }

}

2

Ini solusi yang berhasil bro. Ini dijamin.

  1. Pertama-tama buka akun gmail Anda dari mana Anda ingin mengirim email, seperti dalam kasus Anda xyz@gmail.com
  2. Buka tautan di bawah ini:

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

  3. Klik "Buka bagian" Aplikasi yang kurang aman "di Akun Saya". pilihan
  4. Lalu nyalakan
  5. Itu dia (:

Ini kode saya:

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

}

Terima kasih! Itu berhasil untuk saya! Saya membuka opsi "Aplikasi yang kurang aman" di Akun Saya. "Dan membuat kata sandi untuk digunakan MyApp.
raikumardipak

1

Saya telah meletakkan kelas java gmail saya di atas pastebin untuk Anda tinjau, berikan perhatian khusus pada metode "startSessionWithTLS" dan Anda mungkin dapat menyesuaikan JavaMail untuk menyediakan fungsi yang sama. http://pastebin.com/VE8Mqkqp


mungkin Anda juga bisa memberikan jawaban yang lebih sedikit?
Antti Haapala

1

Kode Anda berfungsi, selain menyiapkan sambungan dengan server SMTP. Anda memerlukan server email berjalan (SMTP) untuk mengirimkan email untuk Anda.

Ini kode modifikasi Anda. Saya mengomentari bagian yang tidak diperlukan dan mengubah pembuatan Sesi sehingga membutuhkan Authenticator. Sekarang cari tahu SMPT_HOSTNAME, USERNAME dan PASSWORD yang ingin Anda gunakan (penyedia Internet Anda biasanya menyediakannya).

Saya selalu melakukannya seperti ini (menggunakan server SMTP jarak jauh yang saya tahu) karena menjalankan server email lokal tidak sepele di Windows (tampaknya cukup mudah di Linux).

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 = "abcd@gmail.com";

        // Sender's email ID needs to be mentioned
        String from = "web@gmail.com";

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

1

Memang 465 berfungsi dan pengecualian yang Anda dapatkan adalah mungkin karena port SMTP yang tidak terbuka 25. Secara default nomor port adalah 25. Namun Anda dapat mengkonfigurasinya menggunakan agen surat yang tersedia sebagai sumber terbuka - Mercury

Untuk kesederhanaan, cukup gunakan konfigurasi berikut dan Anda akan baik-baik saja.

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

Untuk lebih banyak lagi: lihat contoh kerja lengkap dari awal di sini


1

Saya mendapat pengecualian yang sama seperti yang Anda dapatkan. Alasan untuk ini adalah tidak memiliki dan menjalankan server smpt di komputer Anda (karena host Anda adalah localhost). Jika Anda menggunakan windows 7 itu tidak memiliki server SMTP. jadi Anda harus mengunduh, menginstal, dan mengkonfigurasi dengan domain dan membuat akun. Saya menggunakan hmailserver sebagai server smtp yang diinstal dan dikonfigurasi di mesin lokal saya. https://www.hmailserver.com/download


-2

Anda dapat menemukan kelas java yang lengkap dan sangat sederhana untuk mengirim email menggunakan akun Google (gmail) di sini,

Kirim email menggunakan java dan akun Google

Ini menggunakan properti berikut

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

1
Perhatikan bahwa jawaban hanya-tautan tidak disarankan di SO. Lebih baik memasukkan jawabannya ke dalam jawaban itu sendiri.
laalto
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.