Go
beego

Go - beegoでgomailとテンプレートを使ってメールを送る

irisって人気ないらしいし、フラッシュメッセージ使ったらデッドロックみたいになるし、使うのやめて、beego使うことにした。これはすごくいい気がする。中国製で中国の大きい会社も沢山つかってるし、irisと比べるとかなりいたれりつくせりだし、スターの数もフレームワーク中一番多いっぽい。軽量ならechoを使ってみようと思う。

beegoもメール機能はないっぽいので、gomailを使ってやってみる。

gomailをテンプレート使って送る例

mail.go
package mail

import (
    "gopkg.in/gomail.v2"
    "html/template"
    "bytes"
)

var contentType = "text/plain"

func Send (from string, to string, sub string,
    vars interface{}, files ...string) error {

    body, err := makeBody(vars, files...)
    if err != nil {
        return err
    }
    m := gomail.NewMessage()
    m.SetHeader("From", from)
    m.SetHeader("To", to)
    m.SetHeader("Subject", sub)
    m.SetBody(contentType, body)
    d := gomail.Dialer{Host: "localhost", Port: 25}
    err = d.DialAndSend(m)
    return err
}

func makeBody(vars interface{}, files ...string) (string, error) {
    t, err := template.ParseFiles(files...)
    if err != nil {
        return "", err
    }
    buff := &bytes.Buffer{}
    t.Execute(buff, vars)
    return buff.String(), nil
}

使い方の例

contact.go
func send_contact(contact *Contact) error {
    from := "from@example.com"
    to := "to@example.com"
    sub := "お問合せありがとうございます"
    vars := contact
    files := []string{"views/mail/contact.tpl", "views/mail/footer.tpl"}
    err := mail.Send(from, to, sub, vars, files...)
    if err != nil{
        return err
    }
    to = contact.Mail
    err = mail.Send(from, to, sub, vars, files...)
    return err
}

テンプレートファイルの例

contact.tpl
{{.Name}}様

お問合せありがとうございます!

メールアドレス: {{.Mail}}

{{.Content}}

{{template "footer"}}
footer.tpl
{{define "footer"}}

-------------
Example
http://example.com
info@example.com
{{end}}

beego特有のコードは何もないので他のフレームワークとかでも使えるのかなと思います。
もっといい方法とかあったら教えてくれるとうれしいです。