誤送信防止。blastengineを使ってメール送信をキャンセルする

Gmailでは、メール誤送信を防止するためにメール送信をキャンセルする機能があります。メールを送信して30秒以内であれば、キャンセルできます。

技術的に見れば、キャンセル機能は送信を一時的に保留する仕組みになります。同様の処理をblastengineを使った場合にも実現できます。今回は各SDK毎の実装方法を紹介します。

## JavaScript SDKの場合

JavaScript SDKを使ってメール送信をキャンセルするには、以下のようにします。

```javascript
import { BlastEngine, Mail } from 'blastengine';
new BlastEngine('USER_ID', 'API_KEY');
const mail = new Mail;
mail
	.setFrom('admin@example.com', 'Admin')
	.setSubject('Test subject')
	.addTo('user@example.jp')
	.setText('メールの本文');
await mail.send(new Date(Date.now() + 30000)); // 30秒後に送信
// 送信をキャンセルする場合
await mail.cancel();
```

## PHP SDKの場合

PHP SDKを使ってメール送信をキャンセルするには、以下のようにします。

```php
use Blastengine\Client;
Blastengine\Client::initialize('USER_ID', 'API_KEY');

$mail = new Blastengine\Mail();
$mail
	->to('user@example.jp', array("name1" => "Test"))
	->from('admin@example.com')
	->subject('Test subject')
	->text_part('This is test email to __name1__');
$delivery_date = new DateTime();
$delivery_date->add(new DateInterval('PT30S'));
$mail->send($delivery_date); // 30秒後に送信
// 送信をキャンセルする場合
$mail->cancel();
```

## Ruby SDKの場合

Ruby SDKを使ってメール送信をキャンセルするには、以下のようにします。

```ruby
require 'blastengine'
Blastengine.initialize api_key: 'API_KEY', user_name: 'USER_ID'
mail = Blastengine::Mail.new
mail.from email: 'admin@example.com', name: 'Admin'
mail.addTo email: 'user@example.jp', insert_code: { name1: "name 1" }
mail.subject = "Test email"
mail.text_part = "This is a test email __name1__"
mail.html_part = "<html><body>This is a test email __name1__</body></html>"
mail.send(DateTime.now + Rational(30, 86400)) # 30秒後に送信
# 送信をキャンセルする場合
mail.cancel
```

## Python SDKの場合

Python SDKを使ってメール送信をキャンセルするには、以下のようにします。

```python
client = Blastengine("USER_ID", "API_KEY")
mail = Mail()
mail.subject('メールの件名')
mail.text_part('テキスト本文 __name__')
mail.from_address("admin@example.com", "Admin")
mail.to('user@example.jp', {'name': 'name 2', 'hash': 'bbbbb'})
# 30秒後に送信
dt = datetime.datetime.now() + datetime.timedelta(seconds=30)
mail.send(dt)
# 送信をキャンセルする場合
mail.cancel()
```

## Java SDKの場合

Java SDKを使ってメール送信をキャンセルするには、以下のようにします。

```java
BEClient.initialize("USER_ID", "API_KEY");
BEMail mail = new BEMail();
mail.subject ="Test mail from blastengine";
mail.text = "Mail body";
mail.html = "<h1>Hello, from blastengine</h1>";
BEMailAddress fromAddress = new BEMailAddress("admin@example.com", "Admin");
mail.setFrom(fromAddress);
mail.addTo("user@example.jp");
try {
	// 30秒後に送信
    Calendar calendar = Calendar.getInstance();			
    calendar.add(Calendar.MINUTE, 5);
    bulk.send(calendar.getTime());
	// 送信をキャンセルする場合
	mail.cancel();
} catch (BEError e) {
}
```

## Google Apps Script SDKの場合

Google Apps Script SDKを使ってメール送信をキャンセルするには、以下のようにします。

```javascript
new BlastEngine('API_USER', 'API_KEY');
const mail = new Mail;
mail
	.setSubject('テストメール')
	.setText('本文 __name1__')
	.setFrom('admin@example.com')
	.addAttachment(Utilities.newBlob('Hire me!', 'text/plain', 'resume.txt'))
	.addTo('user@example.jp', {name1: 'Atsushi'});
const now = new Date();
mail.send(new Date(now.getTime() + 30 * 1000)); // 30秒後に送信
// 送信をキャンセルする場合
mail.cancel();
```

## 使い方

使い方としては、各SDKともにMailクラスを利用します。そして、 `send` メソッドの引数に送信日時を指定します。そうすると、メールがバルク（一括送信）オブジェクトになり、送信時のステータスが `RESERVE` になります。この状態（またはWAIT）であれば `cancel` メソッドが有効です。

`cancel` メソッドはバルクメールでのみ利用可能です。トランザクション（即時送信）オブジェクトでは使えないので注意してください。もちろん、送信予定時間を過ぎれば送信されてしまうので、キャンセルできません。

`cancel` 処理を実行するとステータスが `EDIT` になり、再送信可能な状態に戻ります。

## まとめ

メールは即時送信にせず、一定の時間を確保しておくことで誤送信を大場に減らせます。大量メール送信などでミスすると、大きな問題になるので注意してください。

blastengineを使えば大量のメールを確実に配信できます。ぜひお試しください。

[エンジニア向けメール配信システム「ブラストエンジン（blastengine）」](https://blastengine.jp/)