Dart でメールを送信する - SMTP & Email Sending API

Customers Mail Cloudではメール送信に際して、SMTPとAPIの二種類を提供しています。昔からの使い慣れたSMTPを使っても良いですし、SMTPのポート制限されている場合でも使えるAPIを利用しても良いでしょう。

今回はこの二つのメール送信方法について、Dartから利用する方法を紹介します。

APIユーザを作成する

API設定画面にて、APIユーザを作成します。アクセス権限として、SMTPは必須になります。API経由での配信を行う場合はSMTPに加えて、HTTP-APIも有効にしてください。

SMTPを使ったメール送信について

今回利用するライブラリはmailerです。

dart pub add mailer

まず必要なライブラリを読み込みます。

import 'package:mailer/mailer.dart';
import 'package:mailer/smtp_server.dart';

続いて認証情報を準備します。この認証情報は先ほど作成したAPIユーザ名とAPIキーになります。

final username = "API_USERNAME";
final password = "API_KEY";

main関数の内容は、まずSMTPサーバを定義します。

final smtpServer = SmtpServer('pro.smtps.jp',
    port: 10025, username: username, password: password);

そしてメールを組み立てます。メールの送信は Transport.send(msg); で行います。メール送信はネットワーク状態などでエラーが出る可能性があるので、必ず try/catch を使います。

final message = Message()
    ..from = Address('info@smtps.jp', 'Your name')
    ..recipients.add('to@smtps.jp')
    ..subject = 'テストの件名です'
    ..text = 'こんにちは'
    ..html = "<h1>こんにちは</h1>\n";
try {
  final sendReport = await send(message, smtpServer);
  print('メール送信' + sendReport.toString());
} on MailerException catch (e) {
  print('メール送信失敗');
  for (var p in e.problems) {
    print('エラー: ${p.code}: ${p.msg}');
  }
}

これでSMTP経由でのメール送信が完了します。

API経由でのメール送信について

APIサーバについて

APIサーバのエンドポイントURLは契約しているプランによって異なりますのでご注意ください。

プラン名 エンドポイントURL
Standardプラン https://te.smtps.jp/api/v2/emails/send.json
Proプラン https://subdomain.smtps.jp/api/v2/emails/send.json

SUBDOMAINは、サービス利用開始時に申請いただいたものです

ライブラリのインストール

API経由の場合、 http をインストールします。

dart pub add http

そして、 convert ともに読み込みます。

import 'dart:convert' as convert;
import 'package:http/http.dart' as http;

変数を設定する

SMTPサーバの代わりにエンドポイントURLを指定します。

final uri = Uri.parse('https://pro.smtps.jp/api/v2/emails/send.json');
// headersの作成
final headers = {'Content-type': 'application/json; charset=UTF-8'};

リクエスト内容を組み立てます。

final body = {
  "api_user": username,
  "api_key": password,
  "to": [
    {"name": "John Doe", "address": "to@smtps.jp"}
  ],
  "from": {"name": "Admin", "address": "info@smtps.jp"},
  "subject": "テストの件名",
  "text": "テストの本文です"
};

JSONの内容については 共通仕様 | Customers Mail Cloud を参照してください。

送信を行う

ではAPIサーバのエンドポイントURLと配信情報のパラメータを使ってメール送信を行います。メール送信APIはPOSTメソッドを使います。

final response =
      await http.post(uri, headers: headers, body: convert.jsonEncode(body));
  if (response.statusCode == 200) {
    var jsonResponse =
        convert.jsonDecode(response.body) as Map<String, dynamic>;
    print('送信完了: $jsonResponse.');
  } else {
    print('送信失敗: ${response.body}.');
  }

送信が成功すると、下記のようにメールIDが返ってきます。

{"id":"\\u003C314195997.17022.1560845073906@mta02.sandbox.smtps.jp\\u003E"}

エラーがあると、下記のようにエラー内容が返ってきます。

{"errors":[{"code":"02-001","field":"text","message":"text is required."}]}

まとめ

サーバ上の制限によってSMTPが使えない場合でもHTTP経由でメール配信が行えますので、APIをぜひ使ってみてください。今回はDartを使いましたが、汎用的なHTTPアクセスを行っていますので、他のプログラミング言語でも簡単に実装できるでしょう。

さらに詳しい使い方についてはEmail Sending APIを参照してください。