Gomail 소개
Gomail은 Golang에서 이메일을 보내기 위한 간단하고 효율적인 패키지입니다. 철저히 테스트되었으며 문서화되어 있습니다.
Gomail은 SMTP 서버를 사용하여만 이메일을 보낼 수 있습니다. 그러나 API는 유연하며 로컬 포스트픽스, API 등을 사용하여 이메일을 보내는 등의 방법을 쉽게 구현할 수 있습니다.
버전 제어를 위해 gopkg.in을 사용하므로 각 버전 내에서 호환되지 않는 변경 사항은 발생하지 않을 것입니다.
Go 1.2 이상 버전이 필요합니다. Go 1.5에서는 외부 종속성을 사용하지 않습니다.
Gomail의 기능
Gomail은 다음과 같은 기능을 지원합니다:
- 첨부 파일
- 내장 이미지
- HTML 및 텍스트 템플릿
- 특수 문자의 자동 인코딩
- SSL 및 TLS
- 동일한 SMTP 연결을 사용하여 여러 이메일 보내기
설치
go get gopkg.in/gomail.v2
예제
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")
// Bob, Cora, Dan에게 이메일 보내기
if err := d.DialAndSend(m); err != nil {
panic(err)
}
예제 (데몬)
채널을 수신하고 받은 모든 메시지를 보내는 데몬입니다.
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)
}
// 마지막 이메일을 보낸 후 30초가 경과하면 SMTP 서버와의 연결 닫기
case <-time.After(30 * time.Second):
if open {
if err := s.Close(); err != nil {
panic(err)
}
open = false
}
}
}
}()
// 프로그램에서 이 채널을 사용하여 이메일 보내기
// 이메일 데몬을 중지하려면 채널을 닫기
close(ch)
예제 (이메일 구독)
그룹 수신자에게 맞춤형 이메일 구독을 효과적으로 보내기
// 수신자 목록
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("%q에게 이메일 보내기에 실패했습니다: %v", r.Address, err)
}
m.Reset()
}
예제 (인증 없이)
로컬 SMTP 서버를 사용하여 이메일을 보내기
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)
}
예제 (SMTP 미사용)
API 또는 포스트픽스를 사용하여 이메일을 보냅니다.
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 {
// API를 호출하거나 포스트픽스를 실행하여 이메일을 보내는 함수를 구현합니다.
fmt.Println("보낸 사람:", from)
fmt.Println("받는 사람:", to)
return nil
})
if err := gomail.Send(s, m); err != nil {
panic(err)
}
FAQ
x509: certificate signed by unknown authority
이 오류가 발생하면 Gomail을 실행 중인 클라이언트가 SMTP 서버에서 사용하는 인증서를 잘못된 것으로 간주합니다. 해결책으로는 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}
// d를 사용하여 이메일을 전송합니다.
}
그러나 이것은 보안상 취약하며 프로덕션 환경에서는 사용해서는 안 됩니다.