SMTPを利用したメール送信機能の実装方法

本記事では、PHPとPHPMailerを使用してSMTP経由でメールを送信する機能を実装する方法を解説します。


1. SMTPメール送信のメリット

SMTPを利用することで、以下のメリットがあります。

  • セキュリティ強化: SMTP認証やSSL/TLS暗号化により安全にメールを送信可能。
  • スパム判定回避: SMTPを使用することで、送信元の正当性が保証されやすくなります。
  • 送信ログ管理: メールサーバー側でログが残るため、送信履歴を追跡できます。

2. 環境構築と準備

1. 必要なライブラリのインストール

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

cd /path/to/project/api
composer require phpmailer/phpmailer

このコマンドにより、必要なファイルがvendorディレクトリにダウンロードされ、オートローダーが生成されます。

2. .envファイルの設定

SMTPサーバー情報を.envファイルに設定します。

EMAIL_METHOD=smtp
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USERNAME=username@example.com
SMTP_PASSWORD=yourpassword
SMTP_ENCRYPTION=tls
EMAIL_FROM=info@example.com
EMAIL_ADMIN=admin@example.com

3. コード実装例: EmailService.php

以下はSMTPとPHPのmail()関数を切り替えて使用できるメール送信サービスのサンプルコードです。

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

require 'vendor/autoload.php';

class EmailService {
    protected $config;
    protected $method;

    public function __construct($config) {
        $this->config = $config;
        $this->method = $config['email']['method'] ?? 'mail';
    }

    public function sendMail($to, $subject, $message) {
        if ($this->method === 'smtp') {
            return $this->sendViaSMTP($to, $subject, $message);
        } else {
            return $this->sendViaMail($to, $subject, $message);
        }
    }

    private function sendViaSMTP($to, $subject, $message) {
        $mail = new PHPMailer(true);
        try {
            $mail->isSMTP();
            $mail->Host = $this->config['email']['smtp_host'];
            $mail->SMTPAuth = true;
            $mail->Username = $this->config['email']['smtp_username'];
            $mail->Password = $this->config['email']['smtp_password'];
            $mail->SMTPSecure = $this->config['email']['smtp_encryption'];
            $mail->Port = $this->config['email']['smtp_port'];

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

            $mail->setFrom($this->config['email']['from'], 'お問い合わせフォーム');
            $mail->addAddress($to);
            $mail->Subject = mb_encode_mimeheader($subject, 'UTF-8');
            $mail->Body = $message;
            $mail->isHTML(false);

            return $mail->send();
        } catch (Exception $e) {
            error_log('メール送信エラー: ' . $mail->ErrorInfo);
            return false;
        }
    }

    private function sendViaMail($to, $subject, $message) {
        $headers = "From: " . $this->config['email']['from'] . "\r\n";
        $headers .= "Content-Type: text/plain; charset=UTF-8\r\n";
        $headers .= "Content-Transfer-Encoding: base64\r\n";
        $encodedMessage = base64_encode($message);
        $encodedSubject = mb_encode_mimeheader($subject, 'UTF-8');

        return mail($to, $encodedSubject, $encodedMessage, $headers);
    }
}

4. 動作確認

  1. .envファイルでEMAIL_METHOD=smtpを設定し、SMTP経由でメールを送信します。
  2. テストメールを送信するスクリプトを実行し、実際に送信されるか確認します。
$emailService = new EmailService($config);
$emailService->sendMail('test@example.com', 'テストメール', 'これはテストメールです。');

5. まとめ

この方法では、SMTP経由のメール送信とPHPのmail()関数の両方に対応できる柔軟な構成を提供しています。また、日本語対応やエンコーディング設定により、文字化けの問題も解消されています。

コメント

タイトルとURLをコピーしました