PHPMailerでメールをSTMP送信する方法について

採用はこちら

PHPでメールを送信する方法として、PHP標準の mail() 関数を使う方法があります。

しかし、実務ではSMTP認証を使ってメールを送信したいケースが多くあります。

そのような場面でよく使われるライブラリが PHPMailer です。

PHPMailerを使うと、SMTPサーバー経由でメールを送信できます。

HTMLメール、日本語メール、添付ファイル、複数宛先、CC、BCC、SMTP認証などにも対応しているため、お問い合わせフォームや会員登録メール、自動返信メールなどで広く利用されています。

この記事では、PHPMailerでSMTP送信する方法を、基本設定から実用的なコード例、よくあるエラー対処まで詳しく解説します。

目次

PHPMailerとは

PHPMailerは、PHPでメールを送信するためのライブラリです。

PHP標準の mail() 関数でもメール送信はできますが、mail() 関数だけではSMTP認証、HTMLメール、添付ファイル、日本語メール対応などを実装しづらい場合があります。

PHPMailerを使うことで、以下のようなメール送信処理を比較的簡単に実装できます。

  • SMTP認証を使ったメール送信
  • HTMLメールの送信
  • テキストメールの送信
  • 添付ファイル付きメールの送信
  • CC・BCCの指定
  • Reply-Toの指定
  • 日本語の件名・本文への対応
  • Gmailや独自ドメインメールでのSMTP送信

特に、お問い合わせフォームから管理者へ通知メールを送る場合や、ユーザーへ自動返信メールを送る場合に便利です。

PHPMailerでSMTP送信する基本の流れ

PHPMailerでSMTP送信する流れは、主に以下のとおりです。

PHPMailerをインストールする

まず、Composerを使ってPHPMailerをインストールします。

composer require phpmailer/phpmailer

Composerでインストールすると、vendor ディレクトリが作成されます。

PHPファイル側では、以下のようにComposerのオートロードファイルを読み込みます。

require __DIR__ . '/vendor/autoload.php';

これにより、PHPMailerのクラスを利用できるようになります。

SMTPサーバー情報を設定する

SMTP送信では、メールサーバーに接続するための情報を設定します。

主に必要な情報は以下です。

項目内容
HostSMTPサーバー名
UsernameSMTPユーザー名
PasswordSMTPパスワード
PortSMTPポート番号
SMTPSecure暗号化方式
SMTPAuthSMTP認証を使うかどうか

たとえば、587番ポートでSTARTTLSを使う場合は、以下のように設定します。

$mail->Host       = 'smtp.example.com';
$mail->SMTPAuth   = true;
$mail->Username   = 'info@example.com';
$mail->Password   = 'your-smtp-password';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port       = 587;

差出人・宛先・本文を設定する

SMTPサーバー情報を設定したら、差出人、宛先、件名、本文を設定します。

$mail->setFrom('info@example.com', 'サイト運営者');
$mail->addAddress('user@example.net', '山田太郎');

$mail->Subject = 'お問い合わせありがとうございます';
$mail->Body    = 'お問い合わせありがとうございます。';

HTMLメールを送る場合は、isHTML(true) を指定します。

$mail->isHTML(true);
$mail->Body = '<p>お問い合わせありがとうございます。</p>';
$mail->AltBody = 'お問い合わせありがとうございます。';

AltBody は、HTMLメールを表示できないメールソフト向けのテキスト本文です。

HTMLメールを送る場合は、設定しておくと親切です。

メールを送信する

最後に、send() メソッドでメールを送信します。

$mail->send();

送信に失敗した場合に備えて、通常は try-catch で例外処理を行います。

PHPMailerでSMTP送信する基本コード

以下は、PHPMailerでSMTP送信する最小構成に近いサンプルコードです。

<?php

declare(strict_types=1);

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;

require __DIR__ . '/vendor/autoload.php';

$mail = new PHPMailer(true);

try {
    // 本番環境ではデバッグをOFFにする
    $mail->SMTPDebug = SMTP::DEBUG_OFF;

    // SMTPを使用する
    $mail->isSMTP();

    // SMTPサーバー設定
    $mail->Host       = 'smtp.example.com';
    $mail->SMTPAuth   = true;
    $mail->Username   = 'info@example.com';
    $mail->Password   = 'your-smtp-password';

    // 587番ポートの場合はSTARTTLSを使用
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $mail->Port       = 587;

    // 日本語メール対応
    $mail->CharSet    = 'UTF-8';
    $mail->Encoding   = 'base64';

    // 差出人
    $mail->setFrom('info@example.com', 'サイト運営者');

    // 宛先
    $mail->addAddress('user@example.net', '山田太郎');

    // メール内容
    $mail->Subject = 'PHPMailer SMTP送信テスト';
    $mail->Body    = "PHPMailerを使ってSMTP送信しています。";

    // 送信
    $mail->send();

    echo 'メールを送信しました。';

} catch (Exception $e) {
    error_log('PHPMailer Error: ' . $mail->ErrorInfo);
    echo 'メール送信に失敗しました。';
}

このコードでは、SMTPサーバーにログインしてメールを送信しています。

日本語の件名や本文を扱う場合は、以下の指定を入れておくと文字化けを防ぎやすくなります。

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

ただし、Encoding = 'base64' は必須ではありません。

通常は CharSet = 'UTF-8' だけで問題ないケースもあります。

文字化け対策として、必要に応じて指定するとよいでしょう。

SMTPのポート番号と暗号化方式

PHPMailerでSMTP送信する場合、ポート番号と暗号化方式の組み合わせが重要です。

よく使われる組み合わせは以下です。

ポート番号暗号化方式PHPMailerでの指定
587STARTTLSPHPMailer::ENCRYPTION_STARTTLS
465SMTPSPHPMailer::ENCRYPTION_SMTPS

587番ポートでSTARTTLSを使う場合

587番ポートを使う場合は、一般的にSTARTTLSを指定します。

$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port       = 587;

465番ポートでSMTPSを使う場合

465番ポートを使う場合は、SMTPSを指定します。

$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->Port       = 465;

どちらを使うべきかは、利用しているメールサーバーの仕様によって異なります。

レンタルサーバーやメールサービスの管理画面に記載されているSMTP設定を確認し、それに合わせて設定してください。

GmailのSMTPでPHPMailerを使う方法

PHPMailerはGmailのSMTPサーバーを使ってメール送信することもできます。

Gmailを使う場合の基本設定は以下です。

$mail->Host       = 'smtp.gmail.com';
$mail->SMTPAuth   = true;
$mail->Username   = 'youraccount@gmail.com';
$mail->Password   = 'your-app-password';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->Port       = 465;

GmailでSMTP送信する場合、通常のGoogleアカウントのパスワードではなく、アプリパスワードを使うケースがあります。

特に、2段階認証を有効にしているGoogleアカウントでは、アプリパスワードを発行してPHPMailer側に設定します。

Gmail SMTP送信のコード例

<?php

declare(strict_types=1);

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;

require __DIR__ . '/vendor/autoload.php';

$mail = new PHPMailer(true);

try {
    $mail->SMTPDebug = SMTP::DEBUG_OFF;

    $mail->isSMTP();

    $mail->Host       = 'smtp.gmail.com';
    $mail->SMTPAuth   = true;
    $mail->Username   = 'youraccount@gmail.com';
    $mail->Password   = 'your-app-password';
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
    $mail->Port       = 465;

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

    $mail->setFrom('youraccount@gmail.com', '送信者名');
    $mail->addAddress('to@example.com', '受信者名');

    $mail->isHTML(true);
    $mail->Subject = 'Gmail SMTP送信テスト';
    $mail->Body    = '<p>PHPMailerからGmail SMTPで送信しています。</p>';
    $mail->AltBody = 'PHPMailerからGmail SMTPで送信しています。';

    $mail->send();

    echo 'メールを送信しました。';

} catch (Exception $e) {
    error_log('PHPMailer Error: ' . $mail->ErrorInfo);
    echo 'メール送信に失敗しました。';
}

GmailでsetFromを使うときの注意点

GmailのSMTPを使う場合、setFrom() に自由なメールアドレスを指定できるわけではありません。

基本的には、SMTPログインに使っているGmailアドレス、またはGmail側で設定済みの送信元エイリアスを指定します。

たとえば、以下のようにSMTPログインアカウントと異なるメールアドレスを指定すると、正常に送れなかったり、送信元が書き換えられたりする可能性があります。

$mail->Username = 'youraccount@gmail.com';
$mail->setFrom('other@example.com', '別の送信者');

GmailのSMTPを使う場合は、以下のようにするのが安全です。

$mail->Username = 'youraccount@gmail.com';
$mail->setFrom('youraccount@gmail.com', '送信者名');

お問い合わせフォームでPHPMailerを使う方法

PHPMailerは、お問い合わせフォームの送信処理でもよく使われます。

お問い合わせフォームでは、ユーザーが入力した内容を管理者へメール送信するケースが多いです。

このときに重要なのが、ユーザーが入力したメールアドレスを差出人にしないことです。

ユーザーのメールアドレスをsetFromに入れない

以下のような実装は避けてください。

$mail->setFrom($_POST['email']);

ユーザーが入力したメールアドレスを setFrom() に入れると、なりすまし判定や迷惑メール判定の原因になる可能性があります。

また、Gmailなど一部のSMTPサーバーでは、認証アカウントと異なるFromアドレスを自由に指定できない場合があります。

そのため、お問い合わせフォームでは以下のように設定するのがおすすめです。

$mail->setFrom('no-reply@example.com', 'Webサイトお問い合わせ');
$mail->addReplyTo($email, $name);

つまり、実際の差出人は自社ドメインのメールアドレスにし、ユーザーのメールアドレスは返信先として設定します。

お問い合わせフォーム用のコード例

<?php

declare(strict_types=1);

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;

require __DIR__ . '/vendor/autoload.php';

$name    = trim($_POST['name'] ?? '');
$email   = trim($_POST['email'] ?? '');
$message = trim($_POST['message'] ?? '');

if ($name === '' || $email === '' || $message === '') {
    exit('必須項目が入力されていません。');
}

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    exit('メールアドレスの形式が正しくありません。');
}

if (mb_strlen($name) > 100) {
    exit('お名前が長すぎます。');
}

if (mb_strlen($message) > 5000) {
    exit('お問い合わせ内容が長すぎます。');
}

$mail = new PHPMailer(true);

try {
    $mail->SMTPDebug = SMTP::DEBUG_OFF;

    $mail->isSMTP();

    $mail->Host       = 'smtp.example.com';
    $mail->SMTPAuth   = true;
    $mail->Username   = 'no-reply@example.com';
    $mail->Password   = 'your-smtp-password';
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $mail->Port       = 587;

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

    // 差出人は自社ドメインのメールアドレスにする
    $mail->setFrom('no-reply@example.com', 'Webサイトお問い合わせ');

    // 管理者宛
    $mail->addAddress('admin@example.com', '管理者');

    // ユーザーのメールアドレスは返信先に設定する
    $mail->addReplyTo($email, $name);

    $mail->isHTML(false);
    $mail->Subject = 'Webサイトからお問い合わせがありました';

    $body = <<<EOT
Webサイトからお問い合わせがありました。

【お名前】
{$name}

【メールアドレス】
{$email}

【お問い合わせ内容】
{$message}
EOT;

    $mail->Body = $body;

    $mail->send();

    echo 'お問い合わせを送信しました。';

} catch (Exception $e) {
    error_log('PHPMailer Error: ' . $mail->ErrorInfo);
    echo '送信に失敗しました。時間をおいて再度お試しください。';
}

このコードでは、フォームから送られた名前、メールアドレス、問い合わせ内容を受け取り、管理者へメール送信しています。

ポイントは以下です。

  • trim() で余分な空白を削除する
  • 必須項目をチェックする
  • メールアドレス形式をチェックする
  • 名前や本文に文字数制限を設ける
  • 差出人は自社ドメインのメールアドレスにする
  • ユーザーのメールアドレスは Reply-To に設定する
  • 本番環境では詳細なエラーを画面に表示しない

HTMLメールを送信する方法

PHPMailerでHTMLメールを送る場合は、isHTML(true) を指定します。

$mail->isHTML(true);

$mail->Subject = 'HTMLメールのテスト';

$mail->Body = '
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>HTMLメール</title>
</head>
<body>
    <h1>お問い合わせありがとうございます</h1>
    <p>このたびはお問い合わせいただき、ありがとうございます。</p>
    <p>担当者より折り返しご連絡いたします。</p>
</body>
</html>
';

$mail->AltBody = "お問い合わせありがとうございます。\n担当者より折り返しご連絡いたします。";

HTMLメールではユーザー入力をエスケープする

HTMLメールにユーザー入力を含める場合は、必ずエスケープしてください。

悪い例は以下です。

$mail->Body = "<p>{$message}</p>";

このようにユーザー入力をそのままHTMLに入れると、意図しないHTMLタグやスクリプトが混入する可能性があります。

安全に処理する場合は、以下のようにします。

$safeName = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
$safeMessage = nl2br(htmlspecialchars($message, ENT_QUOTES, 'UTF-8'));

$mail->Body = "
<p>お名前:{$safeName}</p>
<p>お問い合わせ内容:</p>
<p>{$safeMessage}</p>
";

HTMLメールを使う場合は、テキストメール以上に入力値の扱いに注意しましょう。

添付ファイル付きメールを送信する方法

PHPMailerで添付ファイルを送る場合は、addAttachment() を使います。

$mail->addAttachment(__DIR__ . '/files/sample.pdf');

添付時のファイル名を変更したい場合は、第2引数にファイル名を指定します。

$mail->addAttachment(__DIR__ . '/files/sample.pdf', '資料.pdf');

フォームからアップロードされたファイルを添付する場合

お問い合わせフォームなどで、ユーザーがアップロードしたファイルを添付する場合は、セキュリティチェックが必要です。

以下は、拡張子とファイルサイズをチェックする簡易例です。

$allowedExtensions = ['pdf', 'jpg', 'jpeg', 'png'];
$maxSize = 5 * 1024 * 1024; // 5MB

if (isset($_FILES['attachment']) && $_FILES['attachment']['error'] === UPLOAD_ERR_OK) {
    $tmpPath = $_FILES['attachment']['tmp_name'];
    $originalName = $_FILES['attachment']['name'];
    $fileSize = $_FILES['attachment']['size'];

    $extension = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));

    if ($fileSize > $maxSize) {
        exit('添付ファイルのサイズが大きすぎます。');
    }

    if (!in_array($extension, $allowedExtensions, true)) {
        exit('許可されていないファイル形式です。');
    }

    $safeFileName = preg_replace('/[^a-zA-Z0-9._-]/', '_', $originalName);

    $mail->addAttachment($tmpPath, $safeFileName);
}

実務では、拡張子だけでなくMIMEタイプの確認、ファイル名のサニタイズ、総容量制限、必要に応じたウイルススキャンも検討してください。

CC・BCCを指定する方法

PHPMailerでは、CCやBCCも簡単に指定できます。

CCを追加する

$mail->addCC('cc@example.com', 'CC宛先');

BCCを追加する

$mail->addBCC('bcc@example.com', 'BCC宛先');

複数の宛先を指定する

複数の宛先に送信する場合は、addAddress() を複数回呼び出します。

$mail->addAddress('user1@example.com', 'ユーザー1');
$mail->addAddress('user2@example.com', 'ユーザー2');
$mail->addAddress('user3@example.com', 'ユーザー3');

大量配信を行う場合は、通常のSMTPサーバーでは送信制限に引っかかる可能性があります。

メールマガジンや一斉配信を行う場合は、専用のメール配信サービスを利用することも検討しましょう。

Composerを使わずにPHPMailerを読み込む方法

Composerが使えない環境では、PHPMailerのファイルを手動で配置して読み込むこともできます。

その場合は、主に以下のファイルを読み込みます。

require __DIR__ . '/PHPMailer/src/Exception.php';
require __DIR__ . '/PHPMailer/src/PHPMailer.php';
require __DIR__ . '/PHPMailer/src/SMTP.php';

そのうえで、通常どおりPHPMailerのクラスを使用します。

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

ただし、可能であればComposerを使うことをおすすめします。

Composerを使うと、依存関係の管理やアップデートがしやすくなります。

SMTPパスワードを安全に管理する方法

SMTPパスワードをPHPファイルに直接書くのは避けましょう。

以下のようにソースコードへ直接書くと、Gitへの誤コミットや情報漏えいのリスクがあります。

$mail->Password = 'your-smtp-password';

本番環境では、環境変数や .env ファイルを使って管理するのがおすすめです。

環境変数を使う例

$mail->Host     = getenv('SMTP_HOST');
$mail->Username = getenv('SMTP_USER');
$mail->Password = getenv('SMTP_PASS');
$mail->Port     = (int) getenv('SMTP_PORT');

.envファイルを使う例

.env ファイルの例です。

SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=no-reply@example.com
SMTP_PASS=your-smtp-password
SMTP_FROM=no-reply@example.com
SMTP_FROM_NAME=Webサイト

PHP側では、vlucas/phpdotenv などを使って読み込めます。

composer require vlucas/phpdotenv
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

$mail->Host       = $_ENV['SMTP_HOST'];
$mail->SMTPAuth   = true;
$mail->Username   = $_ENV['SMTP_USER'];
$mail->Password   = $_ENV['SMTP_PASS'];
$mail->Port       = (int) $_ENV['SMTP_PORT'];

$mail->setFrom($_ENV['SMTP_FROM'], $_ENV['SMTP_FROM_NAME']);

.env ファイルは、公開ディレクトリの外に置いてください。

たとえば、以下のような構成が理想です。

project/
├── .env
├── vendor/
└── public_html/
    └── contact.php

また、.env.gitignore に追加し、Gitに含めないようにしましょう。

.env

PHPMailerでよくあるエラーと対処法

PHPMailerでSMTP送信できない場合は、エラー内容を確認しながら原因を切り分けます。

SMTP connect() failed

SMTP connect() failed は、SMTPサーバーへの接続に失敗している状態です。

主な原因は以下です。

  • SMTPサーバー名が間違っている
  • ポート番号が間違っている
  • 暗号化方式が間違っている
  • サーバー側で外部SMTP接続が禁止されている
  • ファイアウォールで接続がブロックされている
  • レンタルサーバー側でSMTP接続に制限がある

確認すべき設定は以下です。

$mail->Host
$mail->Port
$mail->SMTPSecure
$mail->SMTPAuth

587番ポートを使うならSTARTTLS、465番ポートを使うならSMTPSを指定しているか確認しましょう。

SMTP Error: Could not authenticate

SMTP Error: Could not authenticate は、SMTP認証に失敗している状態です。

主な原因は以下です。

  • SMTPユーザー名が間違っている
  • SMTPパスワードが間違っている
  • Gmailで通常のパスワードを使っている
  • アプリパスワードが必要
  • SMTP認証が有効になっていない
  • メールアカウントがロックされている

Gmailを使う場合は、アプリパスワードや認証方式を確認してください。

独自ドメインメールの場合は、メールサーバーの管理画面でSMTP認証情報を確認しましょう。

文字化けする

日本語の件名や本文が文字化けする場合は、文字コード設定を確認します。

$mail->CharSet = 'UTF-8';

必要に応じて、以下も指定します。

$mail->Encoding = 'base64';

また、PHPファイル自体の文字コードもUTF-8で保存してください。

迷惑メールに入る

PHPMailerでSMTP送信しても、それだけで必ず迷惑メールを回避できるわけではありません。

迷惑メールに入る場合は、以下を確認してください。

  • SPFが設定されているか
  • DKIMが設定されているか
  • DMARCが設定されているか
  • FromのドメインとSMTPサーバーの整合性があるか
  • ユーザー入力のメールアドレスをFromにしていないか
  • 本文がスパム判定されやすい内容になっていないか
  • 短時間に大量送信していないか
  • 送信元IPの評価が悪くないか

特に、お問い合わせフォームでは、ユーザーのメールアドレスを setFrom() に入れず、addReplyTo() に設定することが重要です。

PHPMailerのデバッグ方法

送信できない原因を調べるには、SMTPデバッグを有効にします。

use PHPMailer\PHPMailer\SMTP;

$mail->SMTPDebug = SMTP::DEBUG_SERVER;

ただし、SMTPデバッグは開発時のみ使用してください。

本番環境でデバッグ情報を画面に表示すると、SMTPサーバー情報や通信内容が見えてしまう可能性があります。

本番環境では以下のようにOFFにします。

$mail->SMTPDebug = SMTP::DEBUG_OFF;

ログに出したい場合は、以下のように error_log() を使う方法もあります。

$mail->SMTPDebug = SMTP::DEBUG_SERVER;

$mail->Debugoutput = function ($str, $level) {
    error_log("SMTP debug level {$level}: {$str}");
};

本番公開ページで、$mail->ErrorInfo やSMTPデバッグログをそのまま表示しないように注意しましょう。

WordPressでPHPMailerを使う場合の注意点

WordPressでメール送信を行う場合は、PHPMailerを直接読み込むより、wp_mail() やSMTPプラグインを利用するほうが一般的です。

WordPress本体もメール送信処理でPHPMailerを利用しているため、テーマやプラグイン内で別途PHPMailerを読み込むと、環境によっては競合する可能性があります。

WordPressサイトでSMTP送信を設定したい場合は、まず以下の方法を検討するとよいでしょう。

  • SMTP設定用プラグインを使う
  • wp_mail() を使う
  • phpmailer_init フックでSMTP設定を行う

通常のお問い合わせフォームであれば、Contact Form 7などのフォームプラグインとSMTPプラグインを組み合わせる方法もあります。

PHPMailerでSMTP送信するときのセキュリティ対策

PHPMailerを使う場合は、メール送信処理だけでなく、フォームや認証情報の管理にも注意が必要です。

ユーザー入力を検証する

フォームから受け取った値は、そのまま信用せず、必ず検証しましょう。

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    exit('メールアドレスの形式が正しくありません。');
}

名前や本文にも、文字数制限を設けることをおすすめします。

ユーザー入力をFromに使わない

ユーザーが入力したメールアドレスを setFrom() に設定するのは避けましょう。

$mail->setFrom($_POST['email']);

代わりに、自社ドメインのメールアドレスを setFrom() に設定し、ユーザーのメールアドレスは addReplyTo() に設定します。

$mail->setFrom('no-reply@example.com', 'Webサイト');
$mail->addReplyTo($email, $name);

SMTPパスワードを公開しない

SMTPパスワードは、PHPファイルに直接書かず、環境変数や .env で管理します。

また、.env は公開ディレクトリの外に置き、Gitに含めないようにしてください。

送信回数制限を設ける

お問い合わせフォームは、スパム送信に悪用される可能性があります。

そのため、以下のような対策も検討してください。

  • reCAPTCHAを導入する
  • CSRFトークンを設置する
  • IPアドレスごとに送信回数を制限する
  • 同一メールアドレスからの連続送信を制限する
  • 入力内容のバリデーションを行う
  • サーバーログを確認する

PHPMailerでSMTP送信できないときのチェックリスト

PHPMailerでメールが送れない場合は、以下を順番に確認しましょう。

確認項目内容
SMTP HostSMTPサーバー名は正しいか
Port587または465など、正しいポート番号か
暗号化方式STARTTLSまたはSMTPSが正しく指定されているか
UsernameSMTPユーザー名は正しいか
PasswordSMTPパスワードは正しいか
FromSMTPアカウントと整合しているか
CharSet日本語メールでUTF-8を指定しているか
サーバー制限外部SMTP接続が許可されているか
Gmail設定アプリパスワードや送信元アドレスに問題がないか
DNS設定SPF、DKIM、DMARCが設定されているか
DebugSMTPDebug で詳細を確認したか

エラーが出た場合は、まず $mail->ErrorInfo を確認します。

ただし、本番環境ではエラー内容を画面に直接表示せず、ログに記録するようにしましょう。

まとめ

PHPMailerを使うと、PHPからSMTPサーバー経由でメールを送信できます。

基本的な設定は以下です。

$mail->isSMTP();
$mail->Host       = 'smtp.example.com';
$mail->SMTPAuth   = true;
$mail->Username   = 'info@example.com';
$mail->Password   = 'your-smtp-password';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port       = 587;

587番ポートを使う場合はSTARTTLS、465番ポートを使う場合はSMTPSを指定します。

また、実務では以下の点に注意しましょう。

  • ComposerでPHPMailerを導入する
  • 日本語メールでは CharSet = 'UTF-8' を指定する
  • SMTPパスワードをソースコードに直書きしない
  • ユーザー入力のメールアドレスを setFrom() に使わない
  • ユーザーのメールアドレスは addReplyTo() に設定する
  • 本番環境ではSMTPデバッグを表示しない
  • 添付ファイルを扱う場合はサイズや拡張子をチェックする
  • 迷惑メール対策としてSPF、DKIM、DMARCも確認する

お問い合わせフォームや自動返信メールでPHPMailerを使う場合は、メール送信処理だけでなく、入力値の検証やセキュリティ対策もあわせて実装することが大切です。

PHPMailerのSMTP送信は、基本設定さえ正しく行えば比較的簡単に導入できます。

まずは587番ポートのSTARTTLS設定から試し、利用しているメールサーバーの仕様に合わせて調整するとよいでしょう。

以上、PHPMailerでメールをSTMP送信する方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次