blastengineのGo SDKを使って、メールの種別を気にせずにメール配信を行う


blastengine-goは、メール配信サービス「Blastengine」のGolang用SDKです。このライブラリを使用することで、Goのアプリケーションから簡単にメール配信を行うことができます。この記事では、特にmail.goの使い方に焦点を当て、インストール方法から基本的な使い方、そして注意点までを解説します。

## ユーザ登録する

[blastengine](https://blastengine.jp/)にユーザ登録します。管理画面に入るためのユーザID、パスワードが手に入るので、ログインします（ユーザIDは後で使います）。

## 送信元ドメインのSPFを設定する

送信元として利用するドメイン（自分で持っているもの）の設定をします。これは任意のドメイン管理サービスで設定できますが、TXTレコードに以下のSPFを追加します。

```
txt @ v=spf1 include:spf.besender.jp ~all
```

## APIキーを取得する

ログイン後、管理画面の右上にある設定メニューへ移動します。

![getting-started-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/47b2b2ac-2e41-77fe-d84f-0ae0b7541f36.jpeg)

そして設定の中で、APIキーを取得します。

![getting-started-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/2b5ca124-3020-1d39-84e4-911cd4db27e2.png)


## インストール方法

blastengine-goライブラリは、Go Modulesを使用してインストールできます。以下のコマンドを実行してください：

```bash
go get github.com/blastengineMania/blastengine-go
```

## 初期化

blastengine-goを使用するには、まずクライアントを初期化する必要があります。初期化には、BlastengineのAPIキーとユーザーIDが必要です。

```go
package main

import (
	"github.com/blastengineMania/blastengine-go"
)

func main() {
	apiKey := "yourApiKey" // BlastengineのAPIキー
	userId := "yourUserId" // BlastengineのユーザーID
	client := blastengine.Initialize(apiKey, userId)
	
	// これでclientを使ってメール送信などの操作ができるようになります
}
```

## mail.goの基本的な使い方

mail.goは、トランザクションメール（単一の宛先へのメール）とバルクメール（複数の宛先へのメール）の両方を簡単に扱えるようにするためのラッパーです。基本的な使い方は以下の通りです：

```go
package main

import (
	"github.com/blastengineMania/blastengine-go"
	"time"
)

func main() {
	apiKey := "yourApiKey"
	userId := "yourUserId"
	client := blastengine.Initialize(apiKey, userId)
	
	// Mailオブジェクトの作成
	mail := client.NewMail()
	
	// 送信元の設定
	mail.SetFrom("from@example.com", "送信者名")
	
	// 件名の設定
	mail.SetSubject("テストメール")
	
	// 本文の設定
	mail.SetTextPart("これはテキスト形式のメール本文です。")
	mail.SetHtmlPart("<p>これはHTML形式のメール本文です。</p>")
	
	// 宛先の追加
	mail.AddTo("to@example.com", nil) // 挿入コードなし
	
	// 送信
	err := mail.Send(nil) // 予約配信なし
	if err != nil {
		// エラー処理
	}
}
```

## Transaction/Bulkの違いを気にしない使い方

blastengine-goのmail.goの大きな特徴は、Transaction（単一宛先）とBulk（複数宛先）の違いを気にせずに使えることです。mail.goのSendメソッドは、設定された内容に基づいて自動的に適切な送信方法（TransactionまたはBulk）を選択します。

```go
package main

import (
	"github.com/blastengineMania/blastengine-go"
	"time"
)

func main() {
	apiKey := "yourApiKey"
	userId := "yourUserId"
	client := blastengine.Initialize(apiKey, userId)
	
	// Mailオブジェクトの作成
	mail := client.NewMail()
	
	// 基本設定
	mail.SetFrom("from@example.com", "送信者名")
	mail.SetSubject("テストメール")
	mail.SetTextPart("これはテキスト形式のメール本文です。")
	mail.SetHtmlPart("<p>これはHTML形式のメール本文です。</p>")
	
	// ケース1: 単一の宛先 - 自動的にTransactionとして送信
	mail.AddTo("to1@example.com", nil)
	
	// ケース2: 複数の宛先 - 自動的にBulkとして送信
	mail.AddTo("to1@example.com", nil)
	mail.AddTo("to2@example.com", nil)
	mail.AddTo("to3@example.com", nil)
	
	// ケース3: CC/BCCの追加 - 自動的にTransactionとして送信
	mail.AddTo("to1@example.com", nil)
	mail.AddCc("cc@example.com")
	mail.AddBcc("bcc@example.com")
	
	// 送信
	err := mail.Send(nil)
	if err != nil {
		// エラー処理
	}
}
```

上記のコードでは、宛先の数やCC/BCCの有無によって、自動的にTransactionまたはBulkが選択されます。これにより、開発者はTransactionとBulkの違いを意識することなく、メール送信を実装できます。

## 挿入コード（InsertCode）の使用

挿入コードを使用すると、各受信者ごとにパーソナライズされたメールを送信できます。

```go
package main

import (
	"github.com/blastengineMania/blastengine-go"
)

func main() {
	apiKey := "yourApiKey"
	userId := "yourUserId"
	client := blastengine.Initialize(apiKey, userId)
	
	mail := client.NewMail()
	mail.SetFrom("from@example.com", "送信者名")
	mail.SetSubject("こんにちは、__NAME__さん")
	mail.SetTextPart("__NAME__さん、お元気ですか？")
	mail.SetHtmlPart("<p>__NAME__さん、お元気ですか？</p>")
	
	// 挿入コードを使用して宛先を追加
	insertCode1 := map[string]string{"NAME": "田中"}
	mail.AddTo("tanaka@example.com", insertCode1)
	
	insertCode2 := map[string]string{"NAME": "佐藤"}
	mail.AddTo("sato@example.com", insertCode2)
	
	err := mail.Send(nil)
	if err != nil {
		// エラー処理
	}
}
```

この例では、`__NAME__`というプレースホルダーが各受信者の名前に置き換えられます。

## 添付ファイルの追加

メールに添付ファイルを追加することもできます。

```go
package main

import (
	"github.com/blastengineMania/blastengine-go"
)

func main() {
	apiKey := "yourApiKey"
	userId := "yourUserId"
	client := blastengine.Initialize(apiKey, userId)
	
	mail := client.NewMail()
	mail.SetFrom("from@example.com", "送信者名")
	mail.SetSubject("添付ファイル付きメール")
	mail.SetTextPart("添付ファイルをご確認ください。")
	
	// 添付ファイルの追加
	mail.AddAttachment("path/to/file1.pdf")
	mail.AddAttachment("path/to/file2.jpg")
	
	mail.AddTo("to@example.com", nil)
	
	err := mail.Send(nil)
	if err != nil {
		// エラー処理
	}
}
```

## 予約配信

特定の日時にメールを配信するための予約配信も可能です。

```go
package main

import (
	"github.com/blastengineMania/blastengine-go"
	"time"
)

func main() {
	apiKey := "yourApiKey"
	userId := "yourUserId"
	client := blastengine.Initialize(apiKey, userId)
	
	mail := client.NewMail()
	mail.SetFrom("from@example.com", "送信者名")
	mail.SetSubject("予約配信メール")
	mail.SetTextPart("これは予約配信されたメールです。")
	
	mail.AddTo("to1@example.com", nil)
	mail.AddTo("to2@example.com", nil)
	
	// 予約配信時間の設定（例：1時間後）
	reservationTime := time.Now().Add(1 * time.Hour)
	
	err := mail.Send(&reservationTime)
	if err != nil {
		// エラー処理
	}
}
```

## 注意点

### 複数宛先とCC/BCCの組み合わせ

**重要**: mail.goを使用する際、複数の宛先（To）とCC/BCCは組み合わせることができません。これは、CC/BCCはトランザクションメール（単一宛先）でのみサポートされているためです。

以下のコードはエラーになります：

```go
mail := client.NewMail()
mail.SetFrom("from@example.com", "送信者名")
mail.SetSubject("テストメール")
mail.SetTextPart("テスト本文")

// 複数の宛先を追加
mail.AddTo("to1@example.com", nil)
mail.AddTo("to2@example.com", nil)

// CCを追加（これはエラーになります）
mail.AddCc("cc@example.com")

err := mail.Send(nil)
// エラー: "multiple to is not supported in transaction"
```

### 配信日時の予約とCC/BCCの組み合わせ

**重要**: 配信日時の予約（reservationTime）とCC/BCCも組み合わせることができません。これは、CC/BCCはトランザクションメールでのみサポートされており、予約配信はバルクメールでのみサポートされているためです。

以下のコードはエラーになります：

```go
mail := client.NewMail()
mail.SetFrom("from@example.com", "送信者名")
mail.SetSubject("テストメール")
mail.SetTextPart("テスト本文")

mail.AddTo("to@example.com", nil)
mail.AddCc("cc@example.com")

// 予約配信時間の設定
reservationTime := time.Now().Add(1 * time.Hour)

err := mail.Send(&reservationTime)
// エラー: "cc and bcc are not supported in reservation time"
```

## まとめ

blastengine-goのmail.goは、トランザクションメールとバルクメールの違いを気にせずに使えるシンプルなインターフェースを提供しています。ただし、いくつかの制約（複数宛先とCC/BCCの組み合わせ、予約配信とCC/BCCの組み合わせ）があることに注意が必要です。

これらの制約を理解した上で使用すれば、Goアプリケーションから簡単にメール配信を実装することができます。

より詳細な情報や高度な使い方については、[公式リポジトリ](https://github.com/blastengineMania/blastengine-go)を参照してください。