วันจันทร์ที่ 9 ธันวาคม พ.ศ. 2556

How to send mail with Golang

Share it Please
ท้าวความนิดส์นึงครับว่า งานปีใหม่ของ Osdev จะมีการจัดฉลากของขวัญกัน แต่ปัญหาหลักๆ ของการจับฉลากนั้นคือ ไม่รู้จะซื้ออะไร นั่นเอง
ดังนั้นเราจึงแก้ปัญหาโดยการ จับฉลากก่อนซะเลย แต่การจับฉลากก่อนนั้น จะเป็นไปโดยที่ไม่มีใครรู้ว่าใครจับได้ใคร
ดังนั้นเราต้องมา Coding กันซึ่งก็ต้องคิดก่อนว่าจะ Code ภาษาอะไรดี ซึ่งสรุปได้ว่าใช้ Golang เพราะอยากลองเขียนอยู่พอดี
โจทย์คือ
  1. ห้าม Random ได้ตัวเอง
  2. กรณีที่ผู้เล่นเป็นเลขคี่ ห้ามเหลือเศษ (กรณีที่ทุกคนมีคู่จนเหลือคนเดียว)
Solution ที่คิดออกมาคือเอาทุกคนเข้าไปอยู่ใน Array จากนั้น Shuffle Array ซะแล้วก็ไล่ส่งเมลแบบปกติเลย ได้ Code ออกมาแบบนี้

package main

import "math/rand"
import "time"
import "net/smtp"
import "net/mail"
import "strings"

func encodeRFC2047(String string) string{
 // use mail's rfc2047 to encode any string
 addr := mail.Address{String, ""}
 return strings.Trim(addr.String(), " <>")
}

func main() {
 var members = shuffle([]string {
  "example@osdev.co.th", 
  "example@osdev.co.th", 
  "example@osdev.co.th", 
  "example@osdev.co.th", 
  "example@osdev.co.th", 
  "example@osdev.co.th", 
  "example@osdev.co.th", 
  "example@osdev.co.th", 
  "example@osdev.co.th", 
  "example@osdev.co.th", 
  "example@osdev.co.th", 
  "example@osdev.co.th", 
 })
 auth := smtp.PlainAuth("", "example@osdev.co.th", "password", "smtp.gmail.com")
 subject := "Subject: Osdev Gift Random for New Year Cerebration\r\n\r\n"

 for i, _ := range members {
  if i != len(members) - 1 {
   message := "นี่คือเมลแจ้งการจับคุ่ขาของคุณ\r\nคู่ขาของคุณคือ " + members[i] + "\r\n\r\nกรุณาซื้อของขวัญราคาไม่ต่ำกว่า xxxx บาทมาให้คู่ขาของคุณด้วยนะจ๊ะ\r\nและอย่าลืมเก็บเรื่องนี้เป็นความลับล่ะ อย่าให้คู่ขาของคุณรู้เป็นอันขาด!!!"
   smtp.SendMail("smtp.gmail.com:587", auth, "example@osdev.co.th", []string{members[i+1]}, []byte(subject + message))
  }
 }
 message := "นี่คือเมลแจ้งการจับคุ๋ขาของคุณ\r\nคู่ขาของคุณคือ " + members[len(members) - 1] + "\r\n\r\nกรุณาซื้อของขวัญราคาไม่ต่ำกว่า xxxx บาทมาให้คู่ขาของคุณด้วยนะจ๊ะ\r\nและอย่าลืมเก็บเรื่องนี้เป็นความลับล่ะ อย่าให้คู่ขาของคุณรู้เป็นอันขาด!!!"
 smtp.SendMail("smtp.gmail.com:587", auth, "example@osdev.co.th", []string{members[0]}, []byte(subject + message))
}

func shuffle(members []string) []string {
 rand.Seed(time.Now().UTC().Unix())
 var newMembers = make([]string, len(members))
 var rands = rand.Perm(len(members))
 for i, v := range rands {
  newMembers[i] = members[v]
 }
 return newMembers
}

ประเด็นอยู่ที่ว่า ไอ้ function SendMail http://golang.org/pkg/net/smtp/#SendMail นั้นมันไม่มีที่ให้ใส่ Subject น่ะสิ ซึ่งค้นไปค้นมาไปเจอ Post นึงบอกว่าให้ใช้ "Subject: xxxx" ใน body message ได้เลย https://groups.google.com/d/msg/golang-nuts/b_zNHgr5cXU/2HLlGfwkTp4J ก็เลยจัดไป ได้ผลตามต้องการ

Blogroll

About