2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GoからGmailAPIで送信する時の文字化けに対応する

Posted at

はじめに

前回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
}

参考

日本語メールの仕組み
Goでgmail APIを叩いて下書きを作成する

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?