PHP - PHPMailer - メール送信

クラウディア 
1. 概要
2. ソース
3. 送信結果

1. 概要

 軽く、メール送信のモジュールを書いてみます。  前提として(ちょっと項目が多いですが)下記の状態とします。 ・実行するマシンで、「smtp」送信プロセスが正常に実行されること ・「mbstring」が実装されていること ・「phpmailer」がインストールされ、適切にインクルードパスが設定されていること ・ソースを「UTF-8」で記述すること

2. ソース

 メールの送信元・送信先のアドレス、件名、本文を引数で渡して、送るモジュールを書きます。
<?php
require_once("class.phpmailer.php");

/**
 * メール送信クラス
 * @author kitayama
 *
 */
class myMail
{
	/**
	 * コンストラクタ
	 */
    public function __construct()
    {
    }

    /**
     * デストラクタ
     */
    public function __destruct()
    {
    }

    /**
     * メールを送る	エンコード「UTF-8」
     *
     * @param string $sender	送信元
     * @param string $receiver	送信先
     * @param string $message	メール本文
     */
    public function send(string $sender, string $receiver, string $subject, string $message) : void
    {
    	mb_language("Japanese");												//	メールエンコーディング
    	mb_internal_encoding("UTF-8");

    	$mail = new PHPMailer();

		$mail->CharSet  = "UTF-8";
    	$mail->Encoding = "base64";

    	$mail->AddAddress($receiver);											//	送信先
    	$mail->From     = $sender;												//	送信元
    	$mail->FromName = $sender;
    																			//	件名

    	$mail->Subject = mb_encode_mimeheader(mb_convert_encoding($subject, "ISO-2022-JP", "UTF-8"));

    	$mail->Body    = $message;												//	メール本文

        if (!$mail->Send())														//	メール送信
        {
			errorlog(__FILE__, __FUNCTION__, __LINE__, "Failed to send mail. Error:".$mail->ErrorInfo);
        }

		unset($mail);
    }
}

 てな感じ。  44行目の「$mail->FromName」は、メールクライアントで表示される名前になるので、実際には

        $mail->FromName = mb_encode_mimeheader(mb_convert_encoding("表示名", "ISO-2022-JP", "UTF-8"));
 と書くべきかと思います。  53行目は、エラー処理になりますので、適切なエラー処理を記述します。  キーポイントが実は、39行目でして・・・。  「$mail->CharSet」を間違えて「$mail->Charset」と書いてもエラーにならずに実行されて、受け取った側で、「UTF-8」と自動で適切に解釈してくれないのだ。  「Charset」でなく「CharSet」ね。注意しましょう(実は、このメモ書きを残すためにこの章を書いているといっても過言ではないのだ)。  呼び出し側を
<?php
require_once("./myMail.php");

$mymail = new myMail();
$mymail->send("___@___.ne.jp", "___@___.ne.jp", "テストメール", " テストメールを\n 送ってみたりするのだよ。");
?>

 てな感じで、記述して、実行すると、実際には、有効なメールアドレスを指定していれば、メールは届きます。

3. 送信結果

 前項のプログラムを実行すると、中身が。
From - Tue Jun  2 10:30:05 2020
X-Account-Key: account14
X-UIDL: 1591061371.24770_0.___.ne.jp
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00000000
X-Mozilla-Keys:                                                                                 
Return-Path: <___@___.ne.jp>
Delivered-To: ___@___.ne.jp
Received: (qmail 24766 invoked from network); 2 Jun 2020 10:29:31 +0900
Received: from unknown (HELO ___.ne.jp) (127.0.0.1)
  by localhost with SMTP; 2 Jun 2020 10:29:31 +0900
Received: (from ___@localhost)
	by ___.ne.jp (8.15.2/8.15.2/Submit) id 0521TVN2024764;
	Tue, 2 Jun 2020 10:29:31 +0900 (JST)
	(envelope-from ___)
To: ___@___.ne.jp
Subject: =?ISO-2022-JP?B?GyRCJUYlOSVIJWEhPCVrGyhC?=
X-PHP-Originating-Script: 1001:class.phpmailer.php
Date: Tue, 2 Jun 2020 10:29:31 +0900
From: "___@___.ne.jp" <___@___.ne.jp>
Message-ID: <b0420665e0e7a92a1cde4a0ac5ed54e9@___.ne.jp>
X-Mailer: PHPMailer 5.2.28 (https://github.com/PHPMailer/PHPMailer)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64
X-Antivirus: Avast (VPS 200601-0, 2020/06/01), Inbound message
X-Antivirus-Status: Clean

44CA44OG44K544OI44Oh44O844Or44KSCuOAgOmAgeOBo+OBpuOBv+OBn+OCiuOBmeOCi+OBruOB
oOOCiOOAgg==


 てなメールが届きます。  これ、そっくりそのままコピーして、テキストエディタに張り付け、「.eml」という拡張子で保存してごらん。  メールクライアントで取り込めば、きちんとメールとして読めるはずですから。
earthcar(アースカー)