Selasa, 29 Oktober 2013

Mengirim Email dengan Java Mail

Java Mail adalah library optional dari bahasa  Java yang dapat digunakan sebagai sarana untuk mengirim email.
Suatu aplikasi web terkadang membutuhkan mengirimkan email balasan otomatis pada saat seorang user mendaftar.
Karena library ini sifatnya optional yang artinya tidak langsung satu bundle dengan JDK yang kita download, maka kita harus mendownloadnya sendiri.
Jika kita masih menggunakan Java 5 maka kita harus mendownload secara terpisah JavaBean Activation Framework, tapi jika kita menggunakan Java 6 ( JDK 1.6 ) ke atas maka JavaBean Activation Framework sudah satu bundle dengannya.

1. Download Java Mail

2. Tambahkan library .jar dari Java Mail ke ClassPath projek kita.

    Berikut contoh menggunakan Netbeans :

       

3. Time for Coding

    Ada 2 cara dasar untuk mengirim email :

    1. Menggunakan metode static ( paling praktis )

import java.io.IOException;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class SendEmail {
    public static void main(String[] args) throws IOException {
        try {
            
            Properties properties=new Properties();
            properties.put("mail.smtp.host","smtp.gmail.com");
            properties.put("mail.smtp.auth","true");
            properties.put("mail.smtp.ssl.enable","true");
            properties.put("mail.smtp.port", "465");//default port dari smptp
            
            Session session=Session.getInstance(properties);
            session.setDebug(true);
            
            MimeMessage pesan=new MimeMessage(session);
            pesan.setFrom("xxxxxx@gmail.com");//isi dengan gmail kalian sendiri, biasanya sama nanti dengan username
            pesan.setRecipient(Message.RecipientType.TO, new InternetAddress("xxxxx@yahoo.com"));//isi dengan tujuan email
            pesan.setSubject("Java Mail");
            pesan.setText("Email dikirim menggunakan Java Mail.");
            
            String username="xxxxx@gmail.com"; //ganti dengan gmail kalian sendiri
            String password="xxxxxxx"; //ganti dengan password kalian sendiri
            Transport.send(pesan, username, password);
            
        } catch (MessagingException ex) {
            ex.printStackTrace();
        }
    }
}

       2. Menggunakan fungsi send(...) tidak static dari class Transport


import java.io.IOException;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmail {
    public static void main(String[] args) throws IOException {
        try {
            
            Properties properties=new Properties();
            properties.put("mail.smtps.host","smtp.gmail.com");
            properties.put("mail.smtps.auth","true");
            properties.put("mail.smtps.ssl.enable","true");
            properties.put("mail.smtps.port", "465");//default port dari smptp
            
            Session session=Session.getInstance(properties);
            session.setDebug(true);
            
            MimeMessage pesan=new MimeMessage(session);
            pesan.setFrom("xxxxx@gmail.com");//isi dengan gmail kalian sendiri, biasanya sama nanti dengan username
            pesan.setRecipient(Message.RecipientType.TO, new InternetAddress("xxxxx@yahoo.com"));//isi dengan tujuan email
            pesan.setSubject("Java Mail");
            pesan.setText("Email dikirim menggunakan Java Mail.");
            
            String username="xxxxxx@gmail.com";//isi dengan gmail kalian sendiri
            String password="xxxxx";//isi dengan password sendiri
            
            Transport transport = session.getTransport("smtps");
            transport.connect(username, password);
            transport.sendMessage(pesan, pesan.getAllRecipients());
            transport.close();
        } catch (MessagingException ex) {
            ex.printStackTrace();
        }
    }
}

Pembahasan :
·         Alamat host SMTP

Cara 1:

properties.put("mail.smtp.host","smtp.gmail.com");

Cara 2 :

properties.put("mail.smtps.host","smtp.gmail.com");

Jika Transport diambil dari class Session dan dinyatakan secara eksplisit menggunakan SSLuntuk pengirimannya seperti dibawah :
Transport transport=session.getTransport("smtps");

maka seluruh properti untuk cara ini harus menjadi smtps, bukan smtp, seperti mail.smtp.host menjadi mail.smtps.host, dan begitu juga untuk property lainnya.

·         Authentikasi

properties.put("mail.smtp.auth","true");
atau
properties.put("mail.smtps.auth","true");

Properti diatas mengisyaratkan Java Mail untuk melakukan authentikasi menggunakan username dan password untuk account email yang bersangkutan.
Kebanyakan email server memerlukan authentikasi untuk memastikan server tidak digunakan untuk open relay sehingga disalahgunakan untuk mengirim spam.

·         TLS atau SSL
Gunakan salah satu jangan keduanya di setting propertinya.
Server SMTP bisa mendukung keduanya atau hanya salah satu, jika mendukung keduanya disarankan menggunakan TLS karena TLS adalah generasi berikutnya dari SSL.

SSL :
properties.put("mail.smtp.ssl.enable","true");

Properti diatas bisa dihilangkan jika kita memanggil Transport seperti di bawah ini :
Transport transport=session.getTransport("smtps");
Properti yang menyatakan bahwa sambungan harus menggunakan Security Socket Layer ( SSL ).
Default port untuk SSL adalah 465 dan jika tidak menggunakan SSL port default server SMTP adalah 25.
Kebanyakan server SMTP gagal terhubung jika menggunakan port lama 25 yang artinya tidak bisa menggunakan port tidak aman karena port 25 itu berarti tidak menggunakan SSL.

TLS :
   props.put("mail.smtp.starttls.enable","true");

Properti untuk menggunakan TLS, dimana TLS adalah penerus dari SSL.
Default portnya adalah 587.

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

Properti untuk mengatur port dari server SMTP. Jika tidak diatur maka akan menggunakan port default yang sesuai dengan metode pengirimannya, jika SSL menggunakan 465 dan jika TLS menggunakan 587 dan jika tidak diatur SSL atau TLS maka akan menggunakan port lama 25.

·         Session
Session session=Session.getInstance(props);
session.setDebug(true);

Properti yang sudah diatur dijadikan argument untuk Session yang nantinya akan terhubung ke server SMTP.
Jika setDebug(…) pada Session di set true , maka detail proses pengiriman akan ditampilan di stdout, sehingga kita bisa menganalisa proses pengiriman.
Gambar dibawah ini salah satu contoh outputnya:



·         Transport
Static method :
Transport.send(pesan, username,password);

Dengan menggunakan fungsi static maka kita tidak perlu menutup koneksi karena akan otomatis tertutup setelah pengiriman.
Kekurangannya adalah kita tidak bisa meng-attach listener untuk mendapat callback untuk diproses ketika terjadi proses pengiriman.

Fungsi biasa :
Transport transport=session.getTransport("smtps");
transport.connect(username, password);
transport.sendMessage(pesan, pesan.getAllRecipients());
transport.close();

Dengan cara ini koneksi harus secara eksplisit ditutup close() tapi dengan cara ini kita bisa meng-attach listener untuk mendapat callback sewaktu proses pengiriman.

Dan ini hasilnya di email penerima :








    

Selamat Mencoba!

Anda bisa melihat nama host untuk berbagai email server dari gmail, yahoo mail, hotmail dll di sini daftar nama host email server atau silakan googling juga banyak

     

4 komentar:

  1. thanks your tutorial,,
    it is work :D

    BalasHapus
  2. Agan kenapa pas program saya jalankan keterangan errornya : AUTH LOGIN command trace suppressed , padahal login saya benar

    BalasHapus
  3. kalau saya mau buat kirim ke banyak address bagaimana?

    BalasHapus