2023年版 SendGrid Mail APIで送るメールの配信停止リンクを日本語化する方法


## Overview

>  SendGridの配信停止・購買管理リンク日本語にしたい!!

## 前提条件

> SendGrid - 利用経験
> SendGrid - DynamicTempleteを過去利用したことがある
> SendGrid API - 利用経験

:::note warn 
SendGridの登録から実装まで多くの参考サイトがありますので、そちらを参照いただけると幸いです。
:::

## 実装　
### SendGrid UI

##### Unsubscribe パネル(解説)
- SendGrid - Dynamic Templateの画面にて`Unsubscribe`を選択して、ドラッグしていただけるとメール本文に`Unsubscribe -Unsubscribe Preferences`が追加されます。
-  `Unsubscribe` -> 配信停止
- `Unsubscribe Preferences` -> 購読管理(配信停止管理ができます)
![スクリーンショット 2023-06-15 23.27.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3014700/65fee503-5a75-b570-8454-99a2b3ae3587.png)


##### 日本語 Unsubscribe パネル作成
-  `ADD MODULE`から`TEXT`を選択し、メール本文に追加する
- 追加後任意の文字列を入力する
- リンク化したい文字列を選択すると、`TEXT MODULE STYLE`が表示される
- `LINK`アイコンをクリックする
- `{{{unsubscribe_preferences}}}`と入力後、OKを押下することで配信停止リンクを日本語で作成できる
- 保存忘れずに :bow

- 表記方法  [公式](https://docs.sendgrid.com/ui/sending-email/create-and-manage-unsubscribe-groups)
> {{{unsubscribe}}} -> 配信停止リンク
> {{{unsubscribe_preferences}}}.    -> 購読管理リンク

![スクリーンショット 2023-06-15 23.27.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3014700/0b032bb1-ff22-9672-d5c3-3a7163a5b8d5.png)

##### 配信停止グループ作成
- [dashboard](https://app.sendgrid.com/) に遷移する
- `suppressions` ->  `unsubscribe Groups` 画面に遷移する
- `Create New Group`を押下する
- Groupを作成する
-  [配信グループに関する参考サイト](https://sendgrid.kke.co.jp/docs/User_Manual_JP/Suppressions/advanced_suppression_manager.html)
![スクリーンショット 2023-06-15 23.48.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3014700/5751eb0a-08e6-e501-008c-e8d9bafbb95a.png)
![スクリーンショット 2023-06-16 0.02.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3014700/1fc94b5b-4d92-6fca-f304-7d8a0d2042bc.png)

### SendGrid API

- 前提として`API KEY`を作成してください - [参考](https://sendgrid.kke.co.jp/docs/User_Manual_JP/Settings/api_keys.html)
- `golang`を利用した参考ソースを記載する
- `${}`には任意のものを挿入してください
- `GroupID`の設定をしない場合、DynamicTemplateでの配信停止リンクが有効化されなかった。。。私だけ?。
```go
/*
　DynamicTemplateを利用した例
　
　- MailParamsは独自に作っているものなので、メールに付与する情報を扱う構造体だと思っていただけると幸いです。
*/
func SendEmail(params []MailParams) error {

	form := mail.NewEmail("${配信者名}", "${FROM}")
	message := mail.NewV3Mail()
	message.SetFrom(form)
	message.SetTemplateID("${TemplateID}")
	message.AddCategories("${カテゴリ}")
	message.Subject = "${件名}"

	// Unsubscribe Groupsの設定
	// - こちらを設定しないとDynamicTemplate内の配信停止などのURLは機能しない。
	asm := mail.NewASM()
	// unsubscribe Groups画面の一覧に記載があります。
	asm.SetGroupID("GroupId")
	message.SetASM(asm)

	for _, param := range params {
		p := mail.NewPersonalization()
		p.AddTos(mail.NewEmail("", param.Email))
		// メール本文の{{username}} に挿入される
		p.SetDynamicTemplateData("username", param.Username)　
		message.AddPersonalizations(p)
	}

	response, err := s.Client.Send(message)
	if err != nil {
		log.Fatalf("Error sending mail: %v", err)
		return err
	}
	log.Print("Success sending mail")
	log.Printf("Success sending mail response: %v", response.Body)
	log.Printf("Success sending mail status: %d", response.StatusCode)
	return nil
}
```

### おまけ

##### テスト方法

- Sand Boxモードを有効にする - [参考](https://docs.sendgrid.com/for-developers/sending-email/sandbox-mode)
```go
// message.SetASM(asm)の下記に追加
settings := mail.NewMailSettings()
enabled := true
settings.SetSandboxMode(&mail.Setting{
	Enable: &enabled,
})
message.SetMailSettings(settings)
```

- 用意されているドメインを利用する- [参考](https://support.sendgrid.kke.co.jp/hc/ja/articles/202769259-%E9%80%81%E4%BF%A1%E3%81%AB%E3%81%A9%E3%82%8C%E3%81%8F%E3%82%89%E3%81%84%E3%81%AE%E6%99%82%E9%96%93%E3%81%8C%E3%81%8B%E3%81%8B%E3%82%8B%E3%81%8B%E3%83%86%E3%82%B9%E3%83%88%E3%81%97%E3%81%9F%E3%81%84%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8C-)
>@sink._sendgrid_._net`を利用する.
>注意点: メールが送信されることはないがメール送信カウントされる


##### 実装で困ったら・・・[APIドキュメント](https://docs.sendgrid.com/api-reference/settings-mail/retrieve-all-mail-settings)