PHPMailerとは?mail()関数との違い
PHPMailer(ピーエイチピーメーラー)は、PHPでメールを送信するためのオープンソースライブラリです。WordPress・Drupal・Joomla!など、世界中の主要CMSにも採用されています。
PHP標準のmail()関数でもメール送信は可能ですが、実務ではほぼ使われません。その理由を比較表で確認してみましょう。
| 比較項目 | mail()関数 | PHPMailer |
|---|---|---|
| SMTP認証 | ✕ 非対応 | ◎ 対応 |
| HTMLメール | △ 手動でヘッダー設定が必要 | ◎ isHTML(true)だけ |
| 添付ファイル | △ 複雑なMIME処理が必要 | ◎ addAttachment()だけ |
| 日本語対応 | △ 文字化けしやすい | ◎ UTF-8/base64で安定 |
| SSL/TLS暗号化 | ✕ 非対応 | ◎ 対応 |
| エラーハンドリング | ✕ true/falseのみ | ◎ 詳細なエラーメッセージ |
| Gmail送信 | ✕ 不可 | ◎ アプリパスワードで対応 |
| 迷惑メール対策 | △ スパム判定されやすい | ◎ SMTP認証で信頼性向上 |
特に重要なのがSMTP認証への対応です。SMTP認証とは、メール送信時にサーバーに「自分は正規のユーザーですよ」と証明する仕組みのことです。mail()関数ではこの認証ができないため、送信したメールが迷惑メールフォルダに振り分けられるリスクが高くなります。
PHPMailerの導入方法
方法1:Composerを使う(推奨)
Composerは、PHPのライブラリ管理ツールです。npmやpipのPHP版と考えるとわかりやすいでしょう。
ターミナルでプロジェクトのディレクトリに移動し、以下を実行します。
composer require phpmailer/phpmailerインストール後、以下の1行でPHPMailerを使えるようになります。
require 'vendor/autoload.php';ディレクトリ構成例:
project/
├── vendor/
├── send.php
└── .env(任意でSMTP情報を環境変数化)方法2:手動で設置する(Composerが使えない場合)
レンタルサーバーなどComposerが使えない環境では、手動インストールも可能です。
手順:
- GitHubからダウンロード → PHPMailer公式リポジトリ
src/フォルダから必要なファイルをプロジェクトに配置- 以下の3行で読み込む
require_once 'path/to/PHPMailer/src/Exception.php';
require_once 'path/to/PHPMailer/src/PHPMailer.php';
require_once 'path/to/PHPMailer/src/SMTP.php';注意:手動インストールの場合、セキュリティアップデートは自分で管理する必要があります。可能な限りComposerを使いましょう。
基本のメール送信コード(コピペで使える)
以下は、PHPMailerでSMTPメール送信する最小構成のコードです。// ← 変更の部分を自分の環境に書き換えるだけで動きます。
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
try {
// ===== SMTP設定 =====
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com'; // ← 変更:SMTPサーバー
$mail->SMTPAuth = true;
$mail->Username = 'your@gmail.com'; // ← 変更:メールアドレス
$mail->Password = 'xxxx xxxx xxxx xxxx'; // ← 変更:アプリパスワード
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
// ===== 日本語対応 =====
$mail->CharSet = 'UTF-8';
$mail->Encoding = 'base64';
// ===== 送信元・送信先 =====
$mail->setFrom('your@gmail.com', '送信者名'); // ← 変更
$mail->addAddress('to@example.com', '受信者名'); // ← 変更
// ===== メール内容 =====
$mail->isHTML(false); // テキストメールの場合
$mail->Subject = 'テストメール';
$mail->Body = 'PHPMailerからのテスト送信です。';
$mail->send();
echo 'メールが送信されました';
} catch (Exception $e) {
echo "送信に失敗しました: {$mail->ErrorInfo}";
}コードのポイント
new PHPMailer(true)のtrueとは?
例外処理(Exception)を有効にする設定です。trueにしておくと、送信に失敗したときcatchブロックで詳細なエラーメッセージを取得できます。デバッグ時に非常に便利なので、常にtrueにしておきましょう。
日本語の文字化け対策
以下の2行は日本語メールを送る場合に必須です。
$mail->CharSet = 'UTF-8';
$mail->Encoding = 'base64';CharSetで文字コードを、Encodingでエンコーディング方式を指定します。この2行がないと、件名や本文の日本語が文字化けします。
サーバー別SMTP設定一覧
環境に合わせてHost・Port・SMTPSecure・認証情報を変更してください。
Gmail
$mail->Host = 'smtp.gmail.com';
$mail->Username = 'your@gmail.com';
$mail->Password = 'アプリパスワード(16桁)';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;Gmailで送信するための事前準備:
- Googleアカウントで2段階認証を有効化する
- Googleアカウント設定 → セキュリティ → 「アプリパスワード」を発行
- 発行された16桁のパスワードを
$mail->Passwordに設定
重要:Googleアカウントの通常パスワードは使えません。必ず「アプリパスワード」を使ってください。
ConoHa WING
$mail->Host = 'mail.yourdomain.com'; // 例:mail.codequest.work
$mail->Username = 'info@yourdomain.com';
$mail->Password = 'メールアカウントのパスワード';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->Port = 465;ConoHa WINGのコントロールパネル → メール管理 → メール設定 でSMTP情報を確認できます。
Xserver
$mail->Host = 'sv●●●●.xserver.jp'; // サーバーパネルで確認
$mail->Username = 'info@yourdomain.com';
$mail->Password = 'メールアカウントのパスワード';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->Port = 465;Xserverのサーバーパネル → メールアカウント設定 でSMTP情報を確認できます。
さくらのレンタルサーバ
$mail->Host = '初期ドメイン.sakura.ne.jp';
$mail->Username = 'メールアドレス@初期ドメイン';
$mail->Password = 'メールパスワード';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;SSL/TLSの選び方
SMTPSecureに適切な方式を設定することで、メール送信時の盗聴リスクを減らせます。ポートと暗号化方式の正しい組み合わせは以下の通りです。
| ポート | 暗号化方式 | PHPMailerの設定値 |
|---|---|---|
| 587 | STARTTLS | PHPMailer::ENCRYPTION_STARTTLS |
| 465 | SSL/TLS | PHPMailer::ENCRYPTION_SMTPS |
HTMLメール・添付ファイルの送信方法
HTMLメールを送る
$mail->isHTML(true);
$mail->Subject = 'HTMLメールのテスト';
$mail->Body = '<h1>こんにちは</h1><p>HTMLメールのテスト送信です。</p>';
$mail->AltBody = 'こんにちは。HTMLメールのテスト送信です。';AltBodyは、HTMLメールに対応していないメールクライアント向けのプレーンテキスト版です。設定しなくても動きますが、設定しておくとメールの到達率が上がります。
添付ファイルを送る
// ファイルパスで添付
$mail->addAttachment('/path/to/file.pdf', '請求書.pdf');
// 複数ファイルも可能
$mail->addAttachment('/path/to/image.jpg', '写真.jpg');CC・BCC・Reply-Toの設定
$mail->addCC('cc@example.com', 'CCの宛名');
$mail->addBCC('bcc@example.com');
$mail->addReplyTo('reply@example.com', '返信先の名前');お問い合わせフォームの実装(入力→確認→送信)
実際に動作するデモページはこちら → サンプルメールフォーム
PHPMailerを使って、確認画面付きのお問い合わせフォームを実装する方法を解説します。入力→確認→送信完了の3ステップ構成です。
index.php→ ユーザーが入力するフォーム画面confirm.php→ 入力内容を確認する画面thanks.php→ メール送信後の完了画面
各ページ間ではsessionを使ってデータを保持し、入力内容をconfirm.phpで確認後にthanks.phpで送信します。
1. フォーム入力画面(index.php)
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
// thanks.php 経由で戻ってきたときにセッションを初期化
$_SESSION['form_data'] = [];
}
$form_data = isset($_SESSION['form_data']) ? $_SESSION['form_data'] : [];
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>お問い合わせフォーム</title>
</head>
<body>
<h1>お問い合わせ</h1>
<form action="confirm.php" method="POST">
<label for="name">名前:</label>
<input type="text" id="name" name="name" required
value="<?php echo htmlspecialchars($form_data['name'] ?? ''); ?>">
<label for="email">メールアドレス:</label>
<input type="email" id="email" name="email" required
value="<?php echo htmlspecialchars($form_data['email'] ?? ''); ?>">
<label for="message">メッセージ:</label>
<textarea id="message" name="message"
rows="4"><?php echo htmlspecialchars($form_data['message'] ?? ''); ?></textarea>
<button type="submit">確認</button>
</form>
</body>
</html>ポイント:
session_start()でセッションを開始し、入力データを保持method="POST"でデータをconfirm.phpに送信htmlspecialchars()でXSS攻撃を防止
2. 確認画面(confirm.php)
<?php
session_start();
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$_SESSION['form_data'] = $_POST;
}
$form_data = $_SESSION['form_data'] ?? [];
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>確認画面</title>
</head>
<body>
<h1>確認画面</h1>
<p><strong>名前:</strong> <?= htmlspecialchars($form_data['name'] ?? '未入力') ?></p>
<p><strong>メールアドレス:</strong> <?= htmlspecialchars($form_data['email'] ?? '未入力') ?></p>
<p><strong>メッセージ:</strong><br>
<?= nl2br(htmlspecialchars($form_data['message'] ?? '未入力')) ?>
</p>
<form action="thanks.php" method="POST">
<?php foreach ($form_data as $key => $value): ?>
<input type="hidden" name="<?= htmlspecialchars($key) ?>"
value="<?= htmlspecialchars($value) ?>">
<?php endforeach; ?>
<button type="submit">送信</button>
</form>
<form action="index.php" method="GET">
<button type="submit">戻る</button>
</form>
</body>
</html>ポイント:
$_SESSION['form_data'] = $_POST;でフォームデータをセッションに保存- 入力データを
htmlspecialchars()でサニタイズ thanks.phpへの送信ボタンと、index.phpに戻るボタンを設置
3. メール送信・完了画面(thanks.php)
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$form_data = $_POST;
// メール本文の作成
$message = <<<EOT
名前: {$form_data['name']}
メールアドレス: {$form_data['email']}
メッセージ:
{$form_data['message']}
EOT;
$mail_success = false;
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com'; // ← 変更
$mail->SMTPAuth = true;
$mail->Username = 'your@gmail.com'; // ← 変更
$mail->Password = 'アプリパスワード'; // ← 変更
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->CharSet = 'UTF-8';
$mail->Encoding = 'base64';
$mail->setFrom('your@gmail.com', 'お問い合わせフォーム');
$mail->addAddress('admin@example.com', '管理者');
$mail->Subject = 'お問い合わせフォームからのメッセージ';
$mail->Body = $message;
// 添付ファイル(あれば)
if (!empty($_FILES['file']['tmp_name']) && is_uploaded_file($_FILES['file']['tmp_name'])) {
$mail->addAttachment($_FILES['file']['tmp_name'], $_FILES['file']['name']);
}
$mail->send();
$mail_success = true;
} catch (Exception $e) {
error_log('メール送信失敗: ' . $mail->ErrorInfo);
}
// セッションをクリア
session_start();
session_unset();
session_destroy();
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>送信完了</title>
</head>
<body>
<h1>送信完了</h1>
<?php if ($mail_success): ?>
<p>お問い合わせいただきありがとうございます。</p>
<?php else: ?>
<p>申し訳ありませんが、メールの送信に失敗しました。</p>
<?php endif; ?>
<a href="index.php">トップページへ戻る</a>
</body>
</html>ポイント:
- PHPMailerでSMTP経由のメール送信を実行
- 送信後は
session_unset()とsession_destroy()でセッションをクリアし、再送信を防止 - 添付ファイルにも対応
完全なサンプルコードはGitHubで公開しています → GitHubサンプルコード
セキュリティ対策
PHPMailerをお問い合わせフォームなどで使う場合、入力値のセキュリティ対策は必須です。PHPMailer自体が安全でも、フォームから受け取った値をそのまま使うと攻撃の対象になります。
XSS(クロスサイトスクリプティング)対策
フォームから受け取った値は、必ずhtmlspecialchars()でエスケープ処理します。
$name = htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8');XSSとは、悪意のあるスクリプト(JavaScriptなど)をフォーム経由で埋め込む攻撃です。エスケープしないと、入力された<script>タグがそのまま実行される危険があります。
メールヘッダーインジェクション対策
メールの宛先や件名に改行文字が含まれていると、意図しない宛先にメールが送信される可能性があります。
$email = str_replace(["\r", "\n"], '', $_POST['email']);
$email = filter_var($email, FILTER_VALIDATE_EMAIL);バリデーション(入力チェック)
// 空チェック
if (empty($_POST['name']) || empty($_POST['email'])) {
die('名前とメールアドレスは必須です');
}
// メールアドレスの形式チェック
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if (!$email) {
die('有効なメールアドレスを入力してください');
}SMTP認証情報の管理
パスワードをコード内に直書きするのは避け、環境変数や設定ファイルで管理しましょう。
// .envファイルや設定ファイルから読み込む例
$mail->Username = getenv('SMTP_USER');
$mail->Password = getenv('SMTP_PASS');.envファイルを使う場合は、Webからアクセスできない場所に配置するか、.htaccessでアクセスを禁止してください。
スパム対策
reCAPTCHAやCSRFトークンを導入すると、不正送信を大幅に減らせます。送信回数制限を設けるのも効果的です。
エラー対処法(トラブルシューティング)
SMTP connect() failed
原因:SMTPサーバーへの接続に失敗しています。
確認ポイント:
Hostのサーバー名が正しいかPort番号が正しいか(587 or 465)SMTPSecureの暗号化方式がポートと一致しているか- サーバー側でSMTP接続がブロックされていないか
- ローカル環境では外部SMTP接続がブロックされている場合があります
Could not authenticate
原因:認証情報(ユーザー名・パスワード)が間違っています。
確認ポイント:
Usernameがメールアドレス全体(@以降も含む)になっているかPasswordが正しいか- Gmailの場合:通常のGoogleパスワードではなく「アプリパスワード」を使っているか
- Gmailの場合:2段階認証が有効になっているか
Could not connect to SMTP host
原因:SMTPホストに到達できないときに発生します。
確認ポイント:
- SSL/TLS設定が正しいかを確認
- ネットワークやサーバー側で25番ポートがブロックされていないかも要確認
日本語が文字化けする
原因:文字コードの設定が不足しています。
対処:以下の2行が設定されているか確認してください。
$mail->CharSet = 'UTF-8';
$mail->Encoding = 'base64';PHPファイル自体の文字コードもUTF-8で保存されているか確認しましょう。
メールが迷惑メールフォルダに入る
原因:送信元ドメインの信頼性が低い可能性があります。
対処:
- SPFレコードを設定する(DNSに送信元サーバーのIPを登録)
- DKIM署名を設定する(メールに電子署名を付与)
setFrom()に設定するメールアドレスのドメインと、実際のSMTPサーバーのドメインを一致させる
SPFレコードとは、「このドメインからのメール送信を許可するサーバーはこれです」とDNSに宣言する仕組みです。DKIM署名とは、メールが送信途中で改ざんされていないことを証明する電子署名です。どちらもレンタルサーバーのコントロールパネルから設定できることが多いので、確認してみてください。
デバッグモードを使う
エラーの原因が特定できない場合は、デバッグモードを有効にすると詳細なログが表示されます。
$mail->SMTPDebug = 2; // 0:無効 1:クライアント 2:クライアント+サーバー本番環境では必ず0に戻してください。デバッグ情報にSMTP認証の詳細が含まれるため、そのまま公開するとセキュリティリスクになります。
よくある質問(FAQ)
Q. PHPMailerは無料で使えますか?
はい、MITライセンスで完全無料です。個人サイトでも商用サイトでも、制限なく使用できます。
Q. PHPのバージョンに制限はありますか?
PHPMailer 6.x はPHP 5.5以上が必要です。セキュリティの観点から、PHP 8.0以上の使用を推奨します。
Q. mail()関数とPHPMailerのどちらを使うべきですか?
実務ではPHPMailer一択です。mail()関数はSMTP認証に対応しておらず、送信したメールが迷惑メールに振り分けられるリスクが高いためです。
Q. GmailのSMTPを使う場合の注意点は?
2段階認証を有効にして「アプリパスワード」を利用するのがおすすめです。通常のGoogleアカウントパスワードを直書きするのは避けましょう。
Q. メールが迷惑メールに入らないようにするには?
SPFレコードやDKIM署名を設定することで、送信元ドメインの信頼性を高められます。また、件名や本文にスパム判定されやすい単語を避けることも有効です。
Q. SMTP認証エラーが出たときの確認ポイントは?
メールサーバーのホスト名・ポート番号・暗号化方式(TLS/SSL)が正しいか確認してください。また、ユーザー名やパスワードが正しいかも見直しましょう。
Q. WordPressでもPHPMailerは使えますか?
WordPressには標準でPHPMailerが組み込まれています。ただし、テーマやプラグインのカスタマイズで直接使う場合は、WordPress標準のwp_mail()関数経由で使うのが推奨されます。
Q. 送信数に制限はありますか?
PHPMailer自体に制限はありませんが、SMTPサーバー側に送信数の制限があります。Gmailの場合、1日あたり500通が上限です(Google Workspaceは2,000通)。大量送信が必要な場合は、SendGridやAmazon SESなどの専用サービスを検討してください。
Q. ローカル環境でテスト送信したい場合は?
Mailtrapなどのメール送信テストサービスを使うのがおすすめです。実際のメールアドレスに送信せずに、メールの内容や表示を確認できます。
Q. 本番環境で導入する際に気をつけることは?
認証情報をコードに直書きせず、環境変数や設定ファイルで管理してください。さらにTLSを必ず有効にし、ログを残しておくと運用トラブルを防げます。
まとめ
PHPMailerは、PHPでメール送信するなら最初に覚えるべきライブラリです。この記事では、導入からサーバー別SMTP設定、HTMLメール・添付ファイル送信、お問い合わせフォーム実装、セキュリティ対策、エラー対処法まで網羅的に解説しました。
この記事のポイント:
- PHPMailerは
mail()関数より安全で機能が豊富 - Composerでインストールするのが最も簡単
- 日本語メールには
CharSet = 'UTF-8'とEncoding = 'base64'が必須 - Gmail・ConoHa WING・Xserver・さくらなど主要サーバーに対応
- お問い合わせフォームでは入力→確認→送信の3ステップ構成が安全
- XSS・ヘッダーインジェクション対策を忘れずに
- エラー時はデバッグモードで原因を特定
PHPMailer公式リポジトリ:https://github.com/PHPMailer/PHPMailer
