本記事では、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. 動作確認
.env
ファイルでEMAIL_METHOD=smtp
を設定し、SMTP経由でメールを送信します。- テストメールを送信するスクリプトを実行し、実際に送信されるか確認します。
$emailService = new EmailService($config);
$emailService->sendMail('test@example.com', 'テストメール', 'これはテストメールです。');
5. まとめ
この方法では、SMTP経由のメール送信とPHPのmail()
関数の両方に対応できる柔軟な構成を提供しています。また、日本語対応やエンコーディング設定により、文字化けの問題も解消されています。
コメント