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

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

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

APIユーザを作成する

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

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

今回利用するライブラリは Swift-SMTP です。これはSwift Package Managerからインストールします。

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

import SwiftSMTP

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

let username = "API_USERNAME";
let password = "API_KEY";

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

let smtp = SMTP(
    hostname: "pro.smtps.jp",
    email: username,
    password: password,
    port: 10025
)

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

let fromMail = Mail.User(name: "Admin", email: "info@example.com")
let toMail = Mail.User(name: "Your name", email: "info@smtps.jp")

let mail = Mail(
    from: fromMail,
    to: [toMail],
    subject: "テストメール from Swift",
    text: "これはテストメールの本文です"
)

smtp.send(mail) { (error) in
    if let error = error {
        print(error)
    } else {
        print(mail)
    }
}

これで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は、サービス利用開始時に申請いただいたものです

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

今回はURLSessionを使って実装します。

変数を設定する

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

final url = URL(string: "https://pro.smtps.jp/api/v2/emails/send.json");

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

let fromAddress = [
    "name": "Admin",
    "address": "info@smtps.jp"
]
let toAddress = [
    "name": "User",
    "address": "to@smtps.jp"
]

let body = [
    "api_user": username,
    "api_key": password,
    "to": [toAddress],
    "from": fromAddress,
    "subject": "テストの件名",
    "text": "テストの本文です"
] as [String : Any];
let httpBody = try! JSONSerialization.data(withJSONObject: body, options: [])

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

送信を行う

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

var request = URLRequest(url: uri)
    request.httpMethod = "POST"
    request.setValue("Application/json", forHTTPHeaderField: "Content-Type")
    request.httpBody = httpBody

let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    guard let data = data else { return }
    do {
        let object = try JSONSerialization.jsonObject(with: data, options: [])
        print(object)
    } catch let error {
        print(error)
    }
}
task.resume()

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

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

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

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

まとめ

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

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