write ahead log

ロールフォワード用

golangでメールを送る

golangのメールパッケージnet/smtpはなんというか, 非常に薄いです.

他のパッケージも同じで思想がハッキリ出ていますが, smtpパッケージも例外ではありません.

おかげでメールの仕組みを学ぶことが出来ました.

ただまぁ, メールは外部パッケージ使ったほうがいいかも….

できるだけ標準を使う志向の私もマルチバイトの処理がないのは流石に….

SMTPで平文 + ASCIIでメールを送る

一番泥臭いやり方.

日本語を入れたら文字化けした.

UTF-8を使った方法を別に学ぶ必要がありそう.

package main

import (
    "bytes"
    "log"
    "net/smtp"
)

const (
    // メールサーバのアドレス
    mailSvrAddr = "mail.svr.co.jp:25"
    // 送信者のメールアドレス
    mailSenderAddr = "twinbird@hoge.co.jp"
    // 受信者のメールアドレス
    mailRecepterAddr = "twinbird@hoge.co.jp"
    // CC:受信者のメールアドレス
    mailCCRecepterAddr = "twinbird@hoge.co.jp"
    // 件名
    mailSubject = "mail subject"
    // 本文
    mailText = `
  this is a 
  test mail
  `
)

func main() {
    c, err := smtp.Dial(mailSvrAddr)
    if err != nil {
        log.Fatal(err)
    }
    // メール送信者(送信元)の設定
    c.Mail(mailSenderAddr)
    // メール受信者(送信先)の設定
    c.Rcpt(mailRecepterAddr)
    // CCでのメール受信者(CC送信先)の設定
    c.Rcpt(mailCCRecepterAddr)

    // メールのボディを作成
    wc, err := c.Data()
    if err != nil {
        log.Fatal(err)
    }
    defer wc.Close()

    // バッファでボディの内容を構成していく
    buf := bytes.NewBufferString("")

    // Toを指定
    buf.WriteString("To:" + mailRecepterAddr)
    buf.WriteString("\r\n") // To終わり
    // CCを指定
    buf.WriteString("Cc:" + mailCCRecepterAddr)
    buf.WriteString("\r\n") // CC終わり

    // タイトル(件名)指定
    buf.WriteString("Subject:" + mailSubject)
    buf.WriteString("\r\n") // タイトル終わり

    // 送信元の指定
    buf.WriteString("From:" + mailSenderAddr)
    buf.WriteString("\r\n") // From終わり

    // メールヘッダ終わり
    buf.WriteString("\r\n")

    // 本文指定
    buf.WriteString(mailText)
    if _, err = buf.WriteTo(wc); err != nil {
        log.Fatal(err)
    }

    // メールセッション終了
    c.Quit()
}

TLS認証使ってメールを送る

複数の送信先が必要な場合はSendMailメソッドで楽したらダメな様です.

結局↑のやり方 + Authを使うみたい.

package main

import (
    "log"
    "net/smtp"
)

func main() {
    // 認証情報作成
    auth := smtp.PlainAuth(
        "",                 // identity(って何?これだけわからん)
        "user@example.com", // ユーザ名
        "password",         // パスワード
        "mail.example.com") // ホスト名

    to := []string{"twinbird@example.net"}
    msg := []byte("To: twinbird@example.net\r\n" +
        "Subject: Title\r\n" +
        "\r\n" +
        "This is the email body.\r\n")

    // メール送信
    err := smtp.SendMail(
        "mail.example.com:25", // 接続先メールサーバ
        auth,                 // 認証情報
        "sender@example.org", // 送信元アドレス
        to,                   // 送信先アドレス
        msg)                  // メッセージ
    if err != nil {
        log.Fatal(err)
    }
}

その他のパッケージを使う

githubで紹介されています

参考

smtp - The Go Programing Language

メールの仕組み - Geekなぺーじ

golang/go - Sending Mail