勉強したことのメモ

webプログラマが勉強したことのメモ。

SendGridを使ってメールサーバを構築せずにPHPからメールを送信する方法

      2021/08/17

メールサーバを構築せずに独自ドメインのメールアドレスにてメール送信を行いたい。過去にGmailのSTPTサーバ経由でメール送信する方法をメモしたが、この方法だと送信元メールアドレスは当然Gmailアドレスになる。何か方法は無いか調べてみるとSendGridというサービスを利用する方法が簡単に実装できた。以下に対応方法をメモ。

 

SendGrid

SendGridとは

SendGridとはクラウドベースのメール配信サービスであり、メールサーバを構築せずともAPIやSMTP経由でメール送信が可能。また、迷惑メール判定されにくいっぽい(過去に通常のメール送信だと迷惑メール判定されたのにSendGrid経由だと迷惑メール判定されないというケースがあった)。

尚、12,000通/月までは無料で利用できる。

アカウント登録

新規登録ページよりアカウントを登録する。尚、アカウントは即時発行ではなく、翌営業日等に発行される点に注意する。

SMTP用パスワードの発行

ログインページよりログインし、左側のメニューの「Email API→Integration Guide→SMTP RelayのChoose」に進み「API Key Name」を入力し、「Create Key」をクリックするとパスワードが発行される。

尚、ホストは「smtp.sendgrid.net」、ユーザ名は「apikey」になる。

 

PHPMailerの準備

以下よりダウンロードし展開する。

https://github.com/PHPMailer/PHPMailer

srcディレクトリ内の「PHPMailer.php」「Exception.php」「SMTP.php」をアップロードする。もしくはsrcディレクトリごとアップロードでも良い。

 

ソースコード

<?php

require('./PHPMailer.php');
require('./Exception.php');
require('./SMTP.php');

// 文字エンコードを指定
mb_language('uni');
mb_internal_encoding('UTF-8');

// インスタンスを生成(true指定で例外を有効化)
$mail = new PHPMailer\PHPMailer\PHPMailer();

try {

    $host = 'smtp.sendgrid.net';
    $username = 'apikey'; 
    $password = 'パスワード';

    //差出人
    $from = '差出人のメールアドレス';
    $fromname = '差出人名';

    //宛先
    $to = '宛先のメールアドレス';
    $toname = $to;

    //件名・本文
    $subject = 'subject';
    $body = 'body';

    //メール設定
    $mail->SMTPDebug = 0; //デバッグ用
    $mail->isSMTP();
    $mail->SMTPAuth = true;
    $mail->Host = $host;
    $mail->Username = $username;
    $mail->Password = $password;
    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;
    $mail->CharSet = "utf-8";
    $mail->Encoding = "base64";
    $mail->setFrom($from, $fromname);
    $mail->addAddress($to, $toname);
    $mail->Subject = $subject;
    $mail->Body		= $body;

    //メール送信
    $mail->send();
    
    //送信成功時の処理

} catch (Exception $e) {

    //送信失敗時の処理

}

各種メールアドレスやパスワード部分は適宜変更する。尚、送信元アドレスであるドメインのSPFレコードやMXレコードを設定しなくても送信が確認できた。

 

所感

私的にサーバ関連の中でもメールサーバに関しては苦手意識があった為、今回のような送信方法を知れたのは良かった。

 - PHP

  関連記事

Laravelのディレクトリ構造・バージョン・DB接続情報確認

Laravelで作成されているシステムに携わることがあった。しかしながら当方La ...

PHPで指定日から曜日を割り出す

曜日ってどうやって割り出すの? となったのでメモ。 ■リファレンス http:/ ...

独自タグを変換して画像を表示させる

やりたい事↓↓ ----- {$IMG1}~{$IMG5}までの独自タグがある。 ...

PHPの配列をファイルに保存してPHPやJSで呼び出す

PHPの配列をファイルとして保存し、別のページからPHPやJavaScriptで ...

pdfからjpg/jpegへ出来るだけ劣化させずに変換

やりたかった事はpdfからjpg画像への変換。 imagemagick使えばすぐ ...

PHPにて自動でファイルを呼び出す(auto_prepend_file)

設定ファイルとかをinclude('config.php')みたいに、 いちいち ...

PHPでExcelシートを出力する方法(PhpSpreadsheet)

PHPでエクセルシートを出力させたい。以前はPHPExcelを利用していたが現在 ...

同一サーバの別ディレクトリでセッション振り分け

同じサーバ内にmemberとownerの別ディレクトリがあり、それぞれにsess ...

PHPでログファイルから指定行数表示させる

エラーログを最新分から指定行数表示させる プログラムがあって、どういった作りにな ...

curlでPOSTデータ送信

ここで使ったcurlだけど補足とか諸々。 ■curlでPOST 並列処理する際に ...