はじめに
前回GoからGmailを送信したが、そのままだと送信者名と題名に日本語を指定すると文字化けしてしまった
対応方法のメモ
原因
現状のメールの仕様上、ヘッダーは標準でASCII文字にしか対応していないが、Goは文字列をUTF-8で扱っている
そのため、本文以外でエンコードをした上で文字コードとエンコード方式を教えてあげる必要がある
対応
日本語をBase64でエンコードした上で
=?文字セット?エンコード方式?エンコード後の文字列?=
の形式で記述する
今回やりたいことに対応するためには以下の処理が必要
subject := base64.StdEncoding.EncodeToString([]byte("メールの題名"))
suportedSubject := "=?UTF-8?B?" + subject + "?="
実装
func createMessage(senderName string, senderAddress string, toAddress string, subject string, body string) gmail.Message {
// body以外に日本語を指定したい場合はエンコードが必要
fromStr := "From: =?UTF-8?B?" + base64.StdEncoding.EncodeToString([]byte(senderName)) + "?= <" + senderAddress + ">\n"
toStr := "To: " + toAddress + "\n"
subStr := "Subject: =?UTF-8?B?" + base64.StdEncoding.EncodeToString([]byte(subject)) + "?=\n"
contentType := "Content-Type: text/plain; charset=UTF-8\n"
bodyStr := "\n" + body
var message gmail.Message
// 全体をURLエンコードしてRawに入れる
message.Raw = base64.URLEncoding.EncodeToString([]byte(fromStr + toStr + subStr + contentType + bodyStr))
return message
}