Giới thiệu về Gomail
Gomail là một gói đơn giản và hiệu quả để gửi email trong Golang. Đã được thử nghiệm kỹ lưỡng và được tài liệu hóa.
Gomail chỉ có thể gửi email bằng cách sử dụng máy chủ SMTP. Tuy nhiên, API rất linh hoạt và có thể dễ dàng triển khai các phương pháp như sử dụng Postfix cục bộ, API, vv., để gửi email.
Nó sử dụng gopkg.in để kiểm soát phiên bản, vì vậy sẽ không có những thay đổi không tương thích trong mỗi phiên bản.
Yêu cầu sử dụng Go 1.2 hoặc phiên bản sau đó. Trong Go 1.5, sẽ không sử dụng các phụ thuộc bên ngoài.
Tính năng của Gomail
Gomail hỗ trợ các tính năng sau:
- Đính kèm tập tin
- Ảnh nền
- Mẫu HTML và văn bản
- Mã hóa tự động các ký tự đặc biệt
- SSL và TLS
- Gửi nhiều email bằng cùng một kết nối SMTP
Cài đặt
go get gopkg.in/gomail.v2
Ví dụ
m := gomail.NewMessage()
m.SetHeader("From", "[email protected]")
m.SetHeader("To", "[email protected]", "[email protected]")
m.SetAddressHeader("Cc", "[email protected]", "Dan")
m.SetHeader("Subject", "Hello!")
m.SetBody("text/html", "Hello <b>Bob</b> and <i>Cora</i>!")
m.Attach("/home/Alex/lolcat.jpg")
d := gomail.NewDialer("smtp.example.com", 587, "user", "123456")
// Gửi email đến Bob, Cora và Dan.
if err := d.DialAndSend(m); err != nil {
panic(err)
}
Ví dụ (Daemon)
Một daemon lắng nghe một kênh và gửi tất cả các tin nhắn nhận được.
ch := make(chan *gomail.Message)
go func() {
d := gomail.NewDialer("smtp.example.com", 587, "user", "123456")
var s gomail.SendCloser
var err error
open := false
for {
select {
case m, ok := <-ch:
if !ok {
return
}
if !open {
if s, err = d.Dial(); err != nil {
panic(err)
}
open = true
}
if err := gomail.Send(s, m); err != nil {
log.Print(err)
}
// Đóng kết nối với máy chủ SMTP nếu không có email nào được gửi trong vòng 30 giây.
case <-time.After(30 * time.Second):
if open {
if err := s.Close(); err != nil {
panic(err)
}
open = false
}
}
}
}()
// Gửi email bằng cách sử dụng kênh này trong chương trình của bạn.
// Đóng kênh để dừng daemon gửi email.
close(ch)
Ví dụ (Đăng ký Email)
Gửi hiệu quả các đăng ký email tùy chỉnh đến một nhóm người nhận.
// Danh sách người nhận.
var list []struct {
Name string
Address string
}
d := gomail.NewDialer("smtp.example.com", 587, "user", "123456")
s, err := d.Dial()
if err != nil {
panic(err)
}
m := gomail.NewMessage()
for _, r := range list {
m.SetHeader("From", "[email protected]")
m.SetAddressHeader("To", r.Address, r.Name)
m.SetHeader("Subject", "Newsletter #1")
m.SetBody("text/html", fmt.Sprintf("Hello %s!", r.Name))
if err := gomail.Send(s, m); err != nil {
log.Printf("Could not send email to %q: %v", r.Address, err)
}
m.Reset()
}
Ví dụ (Không xác thực)
Gửi email bằng cách sử dụng một máy chủ SMTP cục bộ.
m := gomail.NewMessage()
m.SetHeader("From", "[email protected]")
m.SetHeader("To", "[email protected]")
m.SetHeader("Subject", "Hello!")
m.SetBody("text/plain", "Hello!")
d := gomail.Dialer{Host: "localhost", Port: 587}
if err := d.DialAndSend(m); err != nil {
panic(err)
}
Ví dụ (Không sử dụng SMTP)
Gửi email bằng cách sử dụng API hoặc postfix.
m := gomail.NewMessage()
m.SetHeader("From", "[email protected]")
m.SetHeader("To", "[email protected]")
m.SetHeader("Subject", "Hello!")
m.SetBody("text/plain", "Hello!")
s := gomail.SendFunc(func(from string, to []string, msg io.WriterTo) error {
// Thực hiện chức năng gửi email bằng cách gọi API hoặc chạy postfix, v.v.
fmt.Println("From:", from)
fmt.Println("To:", to)
return nil
})
if err := gomail.Send(s, m); err != nil {
panic(err)
}
Câu hỏi thường gặp
x509: certificate signed by unknown authority
Nếu bạn gặp lỗi này, điều đó có nghĩa là client chạy Gomail xem xét chứng chỉ được sử dụng bởi máy chủ SMTP là không hợp lệ. Làm cách nào để tạm thời gỡ bỏ việc xác nhận chuỗi chứng chỉ máy chủ và tên máy chủ bằng cách sử dụng SetTLSConfig:
package main
import (
"crypto/tls"
"gopkg.in/gomail.v2"
)
func main() {
d := gomail.NewDialer("smtp.example.com", 587, "user", "123456")
d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
// Sử dụng d để gửi email.
}
Tuy nhiên, hãy lưu ý rằng điều này không an toàn và không nên được sử dụng trong môi trường sản xuất.