PHPでメールを送信する方法

公開日:2017/08/17  最終更新日:2019/05/04  カテゴリー:PHP
本記事では メールを送信する 2種類の方法をご紹介します。
  1. 数行のコピペでメール送信ができる sendmail 経由で メールを送信する方法
  2. ライブラリを使って SMTP経由で メール送信する方法
ライブラリを導入済みのサンプルも用意しているので 設置するだけですぐに試せます。
自分のコピペ用に残しているので 解説などが少ないのはご了承ください。

1. PHP標準関数 と Sendmail を利用した方法

1.1. この方法の特徴など

この方法のメリットとしては PHP標準関数のみの利用なので
面倒な設定も不要ですぐにメールが送れます。
その一方で メールのパスワードなども不要なので
迷惑メールに分類されることも多いです。
自分にメール通知するときなどはお勧めですが、
ほかの方にメールを送信する場合は 次に紹介する SMTP経由の方法をお勧めします。

1.2. 実際のコード

/* 文字化け防止 */
mb_language("ja");
mb_internal_encoding("UTF-8");

/* 送信先 */
$to = "[email protected]";

/* 題名 */
$subject = "テストメール";

/* 本文 */
$message = <<< EOD
これは テストメッセージです。
送信者の IP アドレスは {$_SERVER["REMOTE_ADDR"]} です。
EOD;

/* ヘッダー(送信元) */
$headers = "From: [email protected]\r\n".
	"Bcc: [email protected]"."\r\n".
	"Reply-To: [email protected]"."\r\n".
	"X-Mailer: PHP/".phpversion();

/* 送信実行 */
if(mb_send_mail($to, $subject, $message, $headers)){
	// 成功した場合の処理
}else{
	// 失敗した場合の処理
}

2. ライブラリ「PHPMailer」とSMTPを用いた方法

2.1. この方法の特徴など

ライブラリ「PHPMailer」 を用いた方法です。
認証を通すので 迷惑メールと認識される可能性も かなり低くなります。
ファイルの添付なども簡単にできてお勧めです。

2.2. 実際のコード

GitHub からダウンロードしたファイルのうち、ディレクトリsrc内にある
Exception.php PHPMailer.php SMTP.php の 3ファイルが必要になります。
面倒であれば この後の サンプルファイルに添付されていますので
そちらをご利用ください。

このサンプルでは ご自身の情報に変更が必要な個所を
隅付き括弧【】で表示してあります。

<?php

/* ライブラリ使用準備 */
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require __DIR__.'/Exception.php';
require __DIR__.'/PHPMailer.php';
require __DIR__.'/SMTP.php';


/* オブジェクト生成 */
$mail = new PHPMailer(true);

try {
	/* サーバー設定 */
	$mail->isSMTP();
	$mail->SMTPAuth = true;
	$mail->Host = "【SMTPサーバ名】";
	$mail->Username = "【SMTPユーザー名】";
	$mail->Password = "【SMTPパスワード】";
	$mail->SMTPSecure = "【暗号化の種類:`tls`or`ssl`】"; 
	$mail->Port = "【SMTPポート番号】";

	/* 送受信者設定 */
	$mail->setFrom("【送信元メールアドレス】", "【送信者名】");
	$mail->addAddress("【送信先メールアドレス】");
	$mail->addReplyTo("【返信先メールアドレス】", "【返信先名】");

	/* コンテンツ設定 */
	$mail->CharSet = "UTF-8";
	$mail->Encoding = "base64";
	$mail->Subject = "【メール件名】";
	$mail->isHTML(【HTMLメール:`true`or`flase`】);
	$mail->Body  = "【メール本文】";

	/* メール送信試行 */
	$mail->send();

} catch (Exception $e) {
	/* 例外処理 */
	die("Message could not be sent. Mailer Error: ".$mail->ErrorInfo);
}

2.3. そのほかの機能について

よく使う機能などを 自分のためにも 残しておきます。

2.3.1. BCCの追加

私は システムから送信するメールは確認できるよう、
専用のメールアドレスに BCCとして 送信しています。
データベースに送信ログを残すのも面倒ですし、この方法の方が確実ですからね。

$mail->addBcc("【送信先メールアドレス】");

2.3.2. 複数に対して送信

メソッドaddAddress を増やすことで対応可能です。
引数を増やすわけではありません!

$mail->addAddress("【送信先メールアドレス1】");
$mail->addAddress("【送信先メールアドレス1】");

2.3.3. 送信者名は任意

メソッドsetFrom の 第2引数にしている 名前は 省略可能です。

$mail->setFrom("【送信先メールアドレス】");

2.3.4. ファイルの添付も簡単

ファイルの添付も メソッドaddAttachment に 引数として ファイルパスを渡すだけです。
第2引数に ファイル名も指定することができます。

$mail->addAttachment("【ファイルパス】");
$mail->addAttachment("【ファイルパス】","【ファイル名】");

この他にも SMTPデバッグや HTMLメール関連 の機能などがありましたので、
必要に応じて 公式ページをご確認ください。

2.4. サンプルファイル

このファイルは 自分自身結構利用するので、
ライブラリのファイル込みなど 実用性の高いものになっています。
解凍した中身一式を設置して sendmail.php を編集して
アクセスするだけで 試すことが可能です。

ダウンロード

3. 最後に

SMTPの方法は 検索すると トップに Qdmail が表示されますが、
最終更新が数年前で放置されているので 使用しない方が無難ですね。
私は これに結構 時間を費やしてしまいましたが、
比較的 新しいバージョンの PHP だと動作しない気がします。

PHP標準関数で メールを送信するにしても、
文字化けなどして なかなか上手くいかず時間を食うので、
毎回 このページからコピペしています。

本サイトでは URLに日本語を含んでいます。
メールなどで共有する場合は リンクとして認識されない場合がございますので、こちらをご利用ください。