Tuesday, 31 January 2017

Membuat Blasting Email Menggunakan Java.

Tuesday, 31 January 2017
Membuat Blasting Email Menggunakan Java.
Met malem COEG :D ! barusan gue pulang kerja terus ujan gede banget, biarpun gue udah pake jas ujan tapi sempak tetep rembes, kaco dah. demi pengen cepet sampe rumah buat bikin tutorial ini !! Tsaahh Elaahh :v . Hhehe oke guys, kali ini gue pengen bikin tutorial buat kalian yang pengen blasting email, ya kali aja bisa buat promo product kalian kan ;) lumayan kan. istilah blasting email ini sebenernya kirim email dengan tujuan ke alamat yang banyak, dan juga bukan pake BCC yaa, jadi serasa Exclusive untuk kirim email'ya hhehe ;). Udah deh basa basinya, gue udah gak sabar pengen ngelanjutin ke problema koding'nya biarin kalian pusing hahha, just kidding guys :v !

Yepp yang kalian butuh buat bikin project ini, yaitu buka IDE Eclipse versi apa aja boleh yang penting support java, kalo belom punya IDE'nya klik disini IDE ECLIPSE MARS !

Nahh lanjut yaa, gue anggep kalian udah punya IDE'nya, dan sekarang lanjut ke Library yang kita butuhin, yaitu Apache POI - Library ini dibutuhin cuma buat Read File Excel, soalnya nanti kebutuhan kita itu membuat list Email yang dituju buat Newsletter.

Okee selanjutnya kita langsung masuk aja ke koding'nya ;), langsung aja bikin New Project dan caranya open IDE Eclipse dan dipojok kiri atas ada FILE > New > Java Project. dan kalo udah, bikin file Main.Java dan copy paste kode dibawah ini :

package com.bye.project;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Main {

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

   try
  {
   FileInputStream file = new FileInputStream(new File("/PATH_FILE_EXCEL/example_user_email.xlsx"));

   //Create Workbook instance holding reference to .xlsx file
   XSSFWorkbook workbook = new XSSFWorkbook(file);

   //Get first/desired sheet from the workbook
   XSSFSheet sheet = workbook.getSheetAt(0);
   List users = new ArrayList();
   
   //Iterate through each rows one by one
   Iterator rowIterator = sheet.iterator();
   while (rowIterator.hasNext()) 
   {
    Row row = rowIterator.next();
    //For each row, iterate through all the columns
    Iterator cellIterator = row.cellIterator();
    
    while (cellIterator.hasNext()) 
    {
     Cell cell = cellIterator.next();
     //Check the cell type and format accordingly
     switch (cell.getCellType()) 
     {
      case Cell.CELL_TYPE_NUMERIC:
       //System.out.print(cell.getNumericCellValue() + "\t");
       break;
      case Cell.CELL_TYPE_STRING:
       //System.out.print(cell.getStringCellValue() + "\t");
       if(cell.getStringCellValue().contains("@")){
        users.add(cell.getStringCellValue());
       }
       break;
     }
    }
    System.out.println("");
   }
   file.close();
   SendGmail.sendToMail(users);
  } 
  catch (Exception e) 
  {
   e.printStackTrace();
  }
  }
  
}

Oke kalo udah di copy gue jelasin dikit, kalo kode diatas itu fungsinya cuman buat Read File Excel yang didalamnya berisi kumpulan list email yang mau dituju buat pengiriman. Jangan lupa buat rubah "PATH_FILE" yang diatas yaa ;) soalnya gue mau lanjut lagi nih sebelom ngantuk :v

Nah yang selanjutnya kita buat File SendGmail.java dan coba langsung paste aja kode dibawah ini, biar nanti gw jelasin fungsinya untuk apa :
package com.bye.project;
import javax.mail.*;
import javax.mail.internet.*;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
 
 
public class SendGmail {
 
    private static final String SMTP_HOST_NAME = "smtp.gmail.com";
    private static final int SMTP_HOST_PORT = 465;
    private static final String SMTP_AUTH_USER = "bye.webster@gmail.com";
    private static final String SMTP_AUTH_PWD  = "***ISI_PASSWORD_LOE***";
 
    public static void sendToMail(List data) throws Exception {

       int i = 0;
     while (i < data.size()) {
      sendToMail(data.get(i));
      i++;
     }
    }
    
    public static void sendToMail(String email) throws Exception {
     Properties props = new Properties();

        props.put("mail.transport.protocol", "smtps");
        props.put("mail.smtps.host", SMTP_HOST_NAME);
        props.put("mail.smtps.auth", true);
        // props.put("mail.smtps.quitwait", "false");
 
        Session mailSession = Session.getDefaultInstance(props);
        mailSession.setDebug(true);
        Transport transport = mailSession.getTransport();
        /*
        // Buka Ini Kalo Mau Replace Some Kata Didalem File Template
        Map input = new HashMap();
     input.put("Author", "bye.webster@gmail.com");
     input.put("Topic", "HTML Template for Email");
     input.put("Content In", "English");
        //HTML mail content
  String htmlText = readEmailFromHtml("/PATH_FILE_TEMPLATE_NEWSLETER/template.html", input);
  */
     String fileName = "/PATH_FILE_TEMPLATE_NEWSLETER//template.html";
 
        MimeMessage message = new MimeMessage(mailSession);
        message.setSubject("Testing MAILBLAST Gan !");
        message.setContent(readContentFromFile(fileName), "text/html");
        message.setFrom(new InternetAddress("bye.webster@gmail.com"));
        message.addRecipient(Message.RecipientType.TO, new InternetAddress(email));
         
        transport.connect(SMTP_HOST_NAME, SMTP_HOST_PORT, SMTP_AUTH_USER, SMTP_AUTH_PWD);
        transport.sendMessage(message,message.getRecipients(Message.RecipientType.TO));
        transport.close();
    }
    
  //Method to replace the values for keys
    protected static String readEmailFromHtml(String filePath, Map input)
    {
     String msg = readContentFromFile(filePath);
      try {
       Set> entries = input.entrySet();
       for(Map.Entry entry : entries) {
        msg = msg.replace(entry.getKey().trim(), entry.getValue().trim());
       }
      }catch(Exception exception){
       exception.printStackTrace();
      }
     
     return msg;
     
    }
    
    //Method to read HTML file as a String 
    private static String readContentFromFile(String fileName){
      StringBuffer contents = new StringBuffer();
      
      try {
      //use buffering, reading one line at a time
      BufferedReader reader = new BufferedReader(new FileReader(fileName));
      try {
       String line = null; 
       while (( line = reader.readLine()) != null){
        contents.append(line);
        contents.append(System.getProperty("line.separator"));
       }
      }finally {
        reader.close();
       }
      }catch (IOException ex){
       ex.printStackTrace();
      }
      
      return contents.toString();
    }

}

Nahh gue jelasin dikit lagi yaa, kalo file ini itu ada 4 method yang terdiri dari :
  1. sendToMail(List<String> data) : method ini berfungsi sebagai perulangan yang simple buat ngelempar parameter email ke method nomer 2.
  2. sendToMail(String email) : dan yang ini function buat kirim email'nya.
  3. readEmailFromHtml(String filePath, Map<String, String> input) : ini fungsi buat baca file template html dan merubah keyword secara dynamic, dan yang berkaitan juga sama method nomer 4.
  4. readContentFromFile(String fileName) : ini bagian yang buat baca perline dari isi file.

Nah gue mau kasih sample image dan file excel buat experiment :

Example Email List
Link buat email list 

Download it!

Dan ini sample buat tampilan Newsletter'nya :D kita pake newsletter si MatahariMall aja hehhe :

Example Newsletter
Link buat template newsletter 

Download it!


Nahhh coba langsung aja di Run As > Java Application. dan setelah di Run As hasil tampilan yang gue buka di salah satu email tujuan seperti dibawah ini :

Example Email Yang Sudah Diterima !

Dan Hasil LOG dari proses di java kira kira seperti ini kalo applikasinya udah berjalan dengan sempurna ;)

EHLO 192.168.2.1
250-smtp.gmail.com at your service, [180.245.75.120]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM 
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:
250 2.1.0 OK w25sm42741335pge.9 - gsmtp
RCPT TO:
250 2.1.5 OK w25sm42741335pge.9 - gsmtp
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   bye.clone5@gmail.com
DATA
354  Go ahead w25sm42741335pge.9 - gsmtp
From: bye.webster@gmail.com
To: bye.clone5@gmail.com
Message-ID: <1102306204 .5.1485880538700="" ye-websters-macbook-pro.local="">
Subject: Testing MAILBLAST Gan !
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Horeeee akhirnya kita bisa membuat aplikasi yang dibutuhin buat promosi product ! Semoga ini bisa berguna buat kalian yang punya usaha & pengen mengenalkan product kalian ke publik.

Okaay selamat malaam, semoga mudah dipahami dan dimengerti, dan jangan lupa kabarin kalo jalan :D . Klo ada yang kurang jelas bisa ditanyakan di komentar yang ada dibawah, sampai ketemu lagi dalem episode selanjutnya, dan salam olahraga. 

Link buat download sample project ;)  

GITHUB !

No comments:

Post a Comment

Bye Webster | Kebanggaan dari keburukan diri sendiri adalah penyesalan yang belum saatnya ! © 2016