SESを使ってEC2からPHPでメール送信

AWS

AWSの環境をパワーアップ、の手順、のうち、
SESを使ってEC2からPHPでメール送信、の記事です。

こちらの記事を参考にしました。
https://qiita.com/tanakaworld/items/94f1ba66801100f6a44f

ドメインの検証

ドメイン(当サイトでいうと、codecreare.com)に対して、”ドメイン検証”の手順を実施します。

上記サイトと違う手順で実施したのが、リージョンは”米国東部 (バージニア北部)”を選択した事と、”Use Route 53 ボタン”ボタン押下時に、”Email Receiving Record”にもチェックを入れて押下した事。

”AWS IAM 設定”、”権限作成”まで、手順通りに実施。

PHP用モジュールインストール

ここからはPHPの対応になります。
こちらに説明があるのですが、足りないところを不足しながら進めます。
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-using-sdk-php.html

PHPはver7.3.6を入れてます。 

事前準備として、GitHubからphp用のAWS-SDKをDLします。
https://github.com/aws/aws-sdk-php/releases

2019/8/14時点では、Version 3.109.3が最新でした。
DLして解凍し、このようなイメージで格納しています。 pharファイルも格納するのを忘れないように。

作成するPHPファイル

作成するphpファイルとしては、3つのファイル構成で実現しています。

  1. SendMail.php SDKを利用して送信する送信実処理
  2. SecretPass.php 上記の、IAMで作成した、”Access Key Id”、”Secret Access Key”、を取得するだけの関数。
  3. SendMail_Debug.php  送信実処理をコールするだけのデバッグ処理。

下部に、それぞれのファイルの内容を記載しておきます。

作業用のWindowsPCからPHP(XAMPP環境)でSendMai_Debug.phpを実行すると、”送信先メールアドレス”へ届きました。

mbstring設定

ただ、Linuxに同じファイルをコピーして実行すると、mb_convert_encodingでエラーが発生・・・。

yum install php-mbstring

https://www.javadrive.jp/php/install/index8.html
を参考に、下記の通り設定。

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off
mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII
mbstring.substitute_character = none
mbstring.func_overload = 0
mbstring.strict_detection = Off

あと、mbstringと関係ないけど、下記もついでに設定

date.timezone=Asia/Tokyo

mbstringのextension有効化で、下記を追記したら、already loadedというエラーが発生するようになったので、追加せず。

extension=mbstring

AWS上のPHPからメール送信できた!

作成したソース

下記のようなフォルダ構成になっています。

親フォルダ
 └Function
  └SendMail
   └SendMail.php
   └SendMail_Debug.php
   └Pass
    └SecretPass.php
   └lib
  └aws
   └aws_3_109_3
    (上記インストール(格納)したファイルとフォルダ)
    └Aws
    └GuzzleHttp
     ・
     ・
     ・

SendMail.php

<?php
require_once '../../lib/aws/aws_3_109_3/aws.phar';
require_once '../../Function/Pass/SecretPass.php';

use Aws\Ses\SesClient as SesClient;
use Aws\Ses\Exception\SesException as SesException;
use Aws\Credentials\Credentials;

function MAIL_SendMail($dest, $subject, $msg) {
	$keys						= SEC_GetSesIamData();
	$credentials				= new Credentials($keys['access_key'], $keys['secret_key']);
	$source						= 'noreply@codecreare.com';
	$charset					= 'ISO-2022-JP';

	$client_data['credentials']	= $credentials;
	$client_data['region']		= 'us-east-1';
	$client_data['version']		= '2010-12-01';
	$client = SesClient::factory($client_data);

	$destdata['ToAddresses']	= array($dest);
	$destdata['CcAddresses']	= array();
	$destdata['BccAddresses']	= array();

	$subjects['Data']			= $subject;
	$subjects['Charset']		= $charset;

	$body_txt['Data']			= $msg;
	$body_txt['Charset']		= $charset;
	$bodydata['Text']			= $body_txt;
//	$body_html['Data']			= 'HTML';
//	$body_html['Charset']		= $charset;
//	$bodydata['Html']			= $body_html;

	$msgdata['Subject']			= $subjects;
	$msgdata['Body']			= $bodydata;

	$maildata['Source']			= $source;
	$maildata['Destination']	= $destdata;
	$maildata['Message']		= $msgdata;

	$result = $client->sendEmail($maildata);
}


?>

SecretPass.php

<?php
function SEC_GetSesIamData() {
	$keys['access_key']	= '**************';
	$keys['secret_key']	= '**************';
	return $keys;
}
?>

SendMail_Debug.php

<?php
require_once '../../Function/SendMail/SendMail.php';
DEBUG_Main();
function DEBUG_Main() {
	MAIL_SendMail('******@gmail.com', 'Title of Debug Mail', 'Debug Send Msg');
}
?>

コメント

タイトルとURLをコピーしました