Mail Sending using Java Mail

วันนี้มาว่ากันด้วยเรื่องมีสาระกัน บ้าง หลังจากที่พยายามจะเขียนเรื่องมีสาระหลายต่อหลายครั้งแต่ก็ล้มเหลว อิอิ หลังจากที่เปลี่ยนโปรเจคกันหลายต่อหลายครั้ง จนมาลงเอยที่ Online Questionnaire แบบงงๆ ก็ไม่รู้จะบอกทำไมเนอะ 55+ อ่า ถือเอาฤกษ์งามยามดีวันนี้วันเกิด เรามาว่ากันด้วยเรื่องของ java mail อันที่จริงเราก็ไม่ได้เข้าใจลึกซึ้งอารายหรอกนะ ลองๆ ทำแล้วมันทำก็เลยอยากจะเอามาแชร์บ้างอะไรบ้าง จะได้เข้ากับยุค 2.0 ฮ่าๆ อ่าๆ นอกเรื่องกันมามากพอ ก่อนอื่นก็ต้องขอพูดถึง tools ที่เอามาใช้ก่อน ตัวพระเอกก็คือ java mail ในที่นี้ใช้เวอร์ชั่น 1.4.2 และก็มีนางเอกคือ JAF ในที่นี้ใช้เวอร์ชั่น 1.0.2 อันนี้สามารถดาวน์โหลดได้ที่เว็บของ sun หรือว่าจะโหลดที่นี่ก็ได้จ้า แต่ขอบอกนะว่าจิงๆ ไม่รู้ว่าทำไมมันต้อง add jaf เข้าไปด้วย แต่พอดีเอาไปไว้ใน lib ของ jre แล้วก็เลยปล่อยตาย ใครลองทำก็ลองไม่ต้อง add jaf ไปหน่อยละดูว่ามันจะรันได้ไหม แล้วมาบอกด้วยนะ อิอิ

ก่อนอื่นถ้าจะให้สะดวกแบบไม่ต้องไป add ทุกๆ project ที่ทำ ก็เอา lib สองตัวนี้(.jar) ไปไว้ที่ lib ใน jre ซึ่ง path ก็น่าจะประมาณนี้ C:\Program Files\Java\jdk1.6.0_03\jre\lib\ext ก็ดังภาพนะจ๊ะ


ที่นี้เรามาลองเขียนโปรแกรมส่งเมล์กันดีก่า เพราะมันดึกแล้ว เด๋วไม่ตื่นไปเรียน MIS ฮ่าๆ ในตัวอย่างนี้ จะส่งจาก account ของ gmail ไปยัง account ของ hotmail โดยส่งผ่าน mail sever ของ gmail จ่ะ

อ่า ก่อนอื่นที่เราจะทำ เราต้องรู้ก่อนว่า mailhost ที่เราจะใช้คืออะไร อย่างของ gmail จะเป็น smtp.gmail.com แต่ว่าเราจำเป็นจะต้อง authen ก่อน จึงสามารถส่งเมล์ผ่าน server นี้ได้ เผื่อป้องกันพวก spam ไรงี้แหละ อ่าๆ ใจเย็นๆ นะ อันนี้มันแค่พูดรวมๆ เด๋วจาบอกเป็นขั้นๆ ไป

เริ่มแรกก็สร้าง project ใหม่ขึ้นมา เป็น web app นะ จาตั้งชื่อเป็นอารายก็ตามใจ ในที่นี้ตั้งเป็น TestJavaMail

พอสร้างโปรเจคเสร็จเรียบร้อย แล้วก็สร้าง form สำหรับจะส่งเมล์มาก่อน หน้าตาก็จะประมาณนี้ สร้างฟอร์มใน index.jsp เลยก็ได้นะ จะได้ไม่ต้องสร้างไฟล์ใหม่
ยกข้อความทั้งย่อหน้ากำหนดให้ใช้ method get แล้วก็ action ไปที่ mail (หรือชื่อ URL pattern อื่นๆ ก็ได้นะ)

พอสร้างฟอร์มเสร็จเราก็ไปสร้าง servlet โดยในที่นี้จะกำหนดชื่อเป็น MailServlet มี URLpattern เป็น "/mail"

import javax.mail.* กับ javax.mail.internet.* เข้าไปด้วย

เขียน method เพิ่มใน MailServlet ตั้งชื่อเป็น send รับ argument 3 ตัว คือ to(ปลายทาง), subject(ชื่อเรื่อง), text (เนื้อหา) ข้างใน method ก็ประมาณนี้


public void send(String subject, String text, String to) {
try {
// ส่วนนี้จะเป็นการกำหนดค่าเริ่มต้นต่างๆ
String sender = "อีเมล์เรา";
String mailhost = "smtp.gmail.com";
String password = "พาสเวิร์ดเรา";

// ส่วนนี้เป็นการกำหนด javamail session เราก็จะใส่ค่าต่างๆ ให้กับ props
Properties props = System.getProperties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", mailhost);
props.put("mail.smtp.auth", "true");
//กำหนดให้มีการ authen เพราะ gmail มันบังคับว่าเราต้อง authen
props.put("mail.smtp.starttls.enable","true");
//อันนี้ก็ไม่รู้มันเอาไว้ทำไร แต่มันบอกว่าต้องเปิด ไม่เปิดมันก็ส่งไม่ได้

//create SMTPauthenticator object เอาไว้สำหรับ authen
// class นี้เราต้องสร้างขึ้นเองนะ เด๋วจะแนบให้ดูข้างล่างละกัน
SMTPAuthenticator auth = new SMTPAuthenticator(sender,password);

// Get a Session object
Session session = Session.getInstance(props, auth);
session.setDebug(true);

// สร้าง ข้อความที่จะส่งขึ้นมา
MimeMessage msg = new MimeMessage(session);
//ใส่ที่อยู่ผู้ส่ง
msg.setFrom(new InternetAddress(sender));
//ใส่ที่อยู่ผู้รับ
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
//ชื่อเรื่อง ต้องใส่ char encode ไปด้วยเพื่อให้มันส่งเป็นภาษาไทยได้
msg.setSubject(subject,"UTF-8");
//เนื้อหา
msg.setContent(text, "text/html; charset=UTF-8");
msg.setSentDate(new Date());

//คำสั่งที่ใช้ในการส่ง
Transport.send(msg);


} catch (MessagingException ex) {
Logger.getLogger(MailServlet.class.getName()).log(Level.SEVERE, null, ex);
}
เกือบเสร็จละ อิอิ ทีนี้ใน method processRequest ของ MailServlet เราก็ไปดึงค่าจากฟอร์มมา โดยใช้ get parameter แล้วก็เรียกใช้ method send โดยค่าทั้งสามค่านั้นไปให้ ก็เป็นอันเสร็จเรียบร้อย อิอิ

อ่าๆ แนบ class SMTPAuthenticator ไปด้วย

package servlet;

import javax.mail.*;

class SMTPAuthenticator extends javax.mail.Authenticator {

private String account;
private String password;

public SMTPAuthenticator(String acc,String pwd){
account = acc;
password = pwd;
}

public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(account, password);
}
}

ไฟล์แนบ

หวังว่าคงจะพอมีประโยชน์กับเพื่อนๆ นะจ๊ะ ไปนอนละ ฝันดีจ้าาา

Comments

  1. เข้ามารายงานการทำงานจ๊ะ....
    อยากจะบอกว่าฟ้าอธิบายได้ดีกว่าหนังสืออีก :)
    ตอนนี้ส่ง Mail ได้แล้ว เย้ๆ
    ที่เราทำเราไม่ได้ทำ passwordAuthentication มันก็เลยเออเร้อแระก็อ่านไม่รุเรื่องด้วยเหอะๆ

    ยังไงก็ขอบใจมากๆ มันเป็นประโยชน์กับทุกคนมากๆเลย เหมือนมันจะเป็นฟังก์ชันพื้นฐานของทุกกลุ่ม ๕๕+

    PS. Happy Birthday อีกครั้ง มีความสุขมากๆนะ ปีหน้าอยากกินเค้กไรรีเคว้สมานะ ^.^

    ReplyDelete
  2. ว้าววววว อาจจะได้ใช้ ขอบคุณมากมาย จ๊วฟฟฟ

    ReplyDelete
  3. โอ้ววว แซงคิวโซมัชค๊าาาาาา

    ยังไงก็เข้ามาอัพ blog learning บ่อยๆนะจ๊ะคุณครูฟ้า -3-

    ReplyDelete
  4. โอ๊ะ ช้าไปหน่อย แต่ HAPPY BIRTHDAY นะจ๊ะ

    ReplyDelete
  5. ขอแบบที่เป็น Java เฉย ๆ ได้ไหมครับ แบบว่าไม่ต้องเป็น Servlet
    se-play_2@hotmail.com

    ReplyDelete
  6. เจอจาก google ช่วยเหลือได้พอดี ขอบคุณครับ

    ReplyDelete
  7. โอ้ เยี่ยม ขอบคุณนะคะ

    ReplyDelete

Post a Comment

Popular posts from this blog

Skiing @ Inawashiro

French Toast

ณ ไอทีลาดกระบัง