勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ

外部SMTPサーバ「Resend」を用いてPHPからSDKなしでメール送信する方法

  PHP

お問い合わせフォームをPostfixありの環境から無しの環境に移行することになり、外部SMTPサーバの導入を検討する必要があった。送信数は少ないので無料でなんとかしたいのと、MXレコードやTXTレコード等のDNS設定はしたくないという制約あり。調べたところ「Resend」というサービスがよさそう。以下に対応方法をメモ。

 

Resend

公式サイト

https://resend.com/

ドキュメント

https://resend.com/docs/introduction

 

やりたいこと

  • 外部SMTPサーバを使用してPHPからメール送信したい
  • 無料枠で対応
  • クレジットカード登録なし
  • 住所等、個人情報登録もできるだけなし
  • SDKやライブラリは使用したくない
  • 受信するのは指定したアドレスのみで自動返信等はなし

 

対応方法

事前準備

公式サイトからアカウントを作成し、APIキーを発行しておく。

send.php

<?php

// 事前にreCAPTCHA認証やバリデート等行う

$subject = '件名';
$message = '本文';
$apiKey = 'xxxxxxxxxxx'; //APIキーを指定
$url = 'https://api.resend.com/emails';

$data = [
    'from' => 'お問い合わせ通知 <onboarding@resend.dev>',
    'to' => ['test.com'], // resendに登録したメールアドレス
    'reply_to' => $_POST['mail'],
    'subject' => $subject,
    'text' => $message
];

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer ' . $apiKey,
    'Content-Type: application/json'
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if (curl_errno($ch)) {

    // エラー時の処理
    echo 'error:' . curl_error($ch);

} else {

    // 成功時の処理
    if ($httpCode >= 200 && $httpCode < 300) {
        echo 'success';

    // エラー時の処理
    } else {

        $errorList = [];
        $errorList['status'] = $httpCode;

        // Resendからのレスポンス
        $errorData = json_decode($response, true);
        if (isset($errorData['message'])) {
            echo 'error:' . $errorData['message'];
        } else {
            echo 'error:' . $response;
        }
    }
}

curl_close($ch);

 

補足

送信上限

こちらのページの通り無料枠だと「3000通 / 月」「100通 / 日」の制限がある。

受信用アドレス

受信用アドレスはResendに登録したアドレスになる。違うアドレスを指定した場合、以下のようなエラーが返ってくる。

You can only send testing emails to your own email address (xxxxx@test.com). To send emails to other recipients, please verify a domain at resend.com/domains, and change the `from` address to an email using this domain.

# 翻訳後
テスト用メールは、ご自身のメールアドレス(xxxxx@test.com)宛てにのみ送信可能です。他の宛先にメールを送信するには、resend.com/domains でドメインの認証を行い、`from` アドレスをそのドメインを使用したメールアドレスに変更してください。

 

所感

最初は以前にメモしたGmailのSMTPサーバを使おうかと思ったが、事前の設定が難しいのとGoogle側がまた何か変更を行った場合の対応が面倒くさそうだったのでパスした。

Resendを初めて使用したがメールアドレス&パスワードのみで登録でき、SDKなしでも簡単に送信できたのがよかった。

あとはサーバ移行が完全に終了したら必要に応じてドメイン登録・DNS設定すると良いかも。

 

参考サイト

https://www.ritaiz.com/articles/trying-resend

 - PHP

  関連記事

CodeIgniter4でコントローラ実行の前後に指定したイベントを実行する方法
CodeIgniter4でコントローラ実行の前後に指定したイベントを実行する方法

CodeIgniter4で特定の条件の場合は指定したページにリダイレクトさせたい ...

PHPで複数の変数に同じ値を代入する方法(多重代入 / 一括代入 / 同時代入)
PHPで複数の変数に同じ値を代入する方法(多重代入 / 一括代入 / 同時代入)

PHPのソースコード上に「$a = $b = $c = 12;」みたいな見たこと ...

PHPにて指定した期間内の日付を1日ずつループで出力する方法
PHPにて指定した期間内の日付を1日ずつループで出力する方法

PHPにて開始日と終了日をユーザが入力すると、その期間内の日付をYYYY-MM- ...

PHPでデータをファイルキャッシュさせる(Cache_Lite)
PHPでデータをファイルキャッシュさせる(Cache_Lite)

最近携わった案件でPHPでファイルキャッシュをしているシステムがあった。今までフ ...

CodeIgniter3でログをファイルに出力する方法
CodeIgniter3でログをファイルに出力する方法

Codeigniter3でエラーログの設定を行い特定のファイルに出力させ当該ログ ...