私のパソコン雑記帖

トップページに戻る 

PHPMailer を使ったメール送信

カテゴリー: PC一般
31Jan2021

php でメール送信する時は mail 関数あるいは mb_send_mail 関数を使うが、別法として PHPMailer を使うことが出来る。この方法は送信元として信頼感のあるプロバイダーの送信サーバーを使うことが出来るし、Delivery Failure などの送信エラーメッセージを入手出来る。

以下は実際にテストしたコードである。

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>PHPMailer のテスト</title>
<link href="indicator/scripts/h5.css" rel="stylesheet" > 【注1】
<link href="indicator/indicator.css" rel="stylesheet">
<script src="indicator/scripts/jquery-2.js"></script>
<script src="indicator/scripts/ejs-h5mod.js"></script>
<script src="indicator/scripts/h5.dev.js"></script>
<script src="indicator/indicator-progress-controller.js"></script>
</head>
<body>
<div style="width:500px; margin:0 auto;">
<h1>PHPMailer のテスト</h1>
<?php
use PHPMailer\PHPMailer\PHPMailer; 【注2】
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;
//
$comment=$_POST['comment'];
$send=$_POST['send'];
//
if($send==""){
print "掲示板入力
<form id=\"indicator-target\" action=\"test3.php\" method=\"post\">
<textarea name=\"comment\" cols=\"70\" rows=\"5\">".$comment."</textarea>
<input id=\"indicator\" type=\"submit\" name=\"send\" value=\"送信\">
</form>";
}else{//ここからメール送信が始まる。
require('./PHPMailer/src/PHPMailer.php'); 【注3】
require('./PHPMailer/src/Exception.php');
require('./PHPMailer/src/SMTP.php');
$list=array(//実際はメールリストファイルから読み込むことになる
"name1@xxx.plala.or.jp/Name1",
"name2@yahoo.co.jp/Name2",
"name3@gmail.com/Name3"
);
//
$mail=new PHPMailer(true);
$mail->CharSet='utf-8';
try {
$mail->SMTPDebug=0;// debugging: 1 = errors and messages, 2 = messages only
$mail->isSMTP();
$mail->Host='secure.plala.or.jp';// SMTPサーバー 【注4】
$mail->SMTPAuth=true;// SMTP authentication
$mail->Username='name4@yyy.plala.or.jp';// SMTPサーバーのユーザ名
$mail->Password='password';// SMTPサーバーのパスワード
$mail->SMTPSecure='tls';// 暗号化
$mail->Port=587;
$mail->setFrom('name5@zzz.plala.or.jp','掲示板');// 送信者);
$mail->addAddress('name6@xxxxxx.com','会員');// 宛先
for($k=0;$k<count($list);$k++){
$L=explode('/',$list[$k]);
$mail->addBcc($L[0],$L[1]);// 宛先 Bcc
}
$mail->addReplyTo('name5@zzz.plala.or.jp');// 返信先
$mail->Sender='name5@zzz.plala.or.jp';// Return-path
$mail->Subject='投稿通知';
$mail->Body=$date.'掲示板にメッセージが投稿されました。';
$mail->send();
} catch (Exception $e) {
// エラーの場合
print "";
}
print $comment."<br>送信終了";
}
?>
</div>
</body>
</html>

上記 HTML スクリプトは HTML5 の doctype 宣言になっていますが、HTML4.01 の doctype 宣言でも XHTML1.0 の doctype 宣言でも同じ結果が得られます。

【注1】:PHPMailer は mail 関数にくらべ送信に時間がかかる傾向があります。そのため「送信中」を示すインディケーターを設置した。参照例として、https://www.htmlhifive.com/conts/web/view/recipe/indicator からダウンロードをクリックして indicator.zip を入手。解凍した中から indicator-progress.html を選びそれを模した。そのソースを開くと3つの stylesheet ファイルと5つの javascript ファイルにリンクを貼っていることがわかる。このうち bootstrap.min.css と bootstrap.min.js は除いた(何故か不安定)。また indicator/indicator-progress-controller.js は数値表示を止めるなど少し編集した。id="indicator-target" をデータ記入場所に配すること(テストコードでは form )、id="indicator" を submit ボタンに配することが肝要である。

【注2】:この3行は php の最初に書く必要があるとされている。

【注3】:この3行は PHPMailer パッケージからの呼び出しである。PHPMailer の入手や使い方については https://qiita.com/e__ri/items/857b12e73080019e00b5 を参照した。また PHPMailer と mail 関数の本質的な違いについては https://blog.s-giken.net/235.html が参考になった。

【注4】:これは plala の SMTP サーバーである。契約時は mail.plala.or.jp という SMTP サーバーが提供されていたがそれだと暗号化送信ができない。plala のアドバイスを得て secure.plala.or.jp に登録しなおし、それを使った。このように、契約しているプロバイダーが提供するSMTPサーバーを使用するのが選択肢①。ほかに、契約しているレンタルサーバーがSMTPサーバーを提供している場合はそれを使うのが選択肢②。選択肢③として Google が提供する送信サーバーがある。この場合の要点は次の通り。
$mail->Host='smtp.gmail.com';
$mail->Username='xxxxx@gmail.com';//Google アカウント取得時に登録したメールアドレス。
$mail->Password='password';//上記メールアドレスに付随したパスワードは使用できない。アカウント管理メニューから「セキュリティー」に進み、「2段階認証プロセス」を有効にし、「アプリのパスワード」をクリックして新しいパスワードを取得、これを使用する。


コメント