CodeIgniterのemailクラスを使って普通に送信(内部的にはmail関数を使用)する方法は試しましたが、スパム扱いされにくくする為にSMTP送信する方法も試してみました。しかし、”bare LF問題”に悩まされて解決に時間が掛かりそうだったため、PHPMailerを導入することにしました。以下、実際行った作業です。
PHPMailerのダウンロードおよび設置
Github(https://github.com/PHPMailer/PHPMailer)からダウンロードして展開し、ディレクトリを”phpmailer”等にリネームして、”application/helpers”に設置します。
PHPMailerヘルパーを作る
コントローラーからヘルパーとして使用出来るように”phpmailer_helper.php”を作り、”application/helpers”に設置します。なお、文字コードはUTF-8にしています。
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
function phpmailer_send($recipient, $from_name. $from_addr, $subject, $message)
{
require_once("phpmailer/PHPMailerAutoload.php");
$smtp_host = 'example.com';
$smtp_port = '587';
$smtp_user = 'info@example.com';
$smtp_password = 'password';
$mail = new PHPMailer();
$mail->CharSet = "UTF-8";
$mail->Encoding = "8bit";
$mail->IsSMTP();
$mail->Host = $smtp_host . ":" . $smtp_port;
$mail->SMTPAuth = TRUE;
$mail->Username = $smtp_user;
$mail->Password = $smtp_password;
$mail->FromName = $from_name;
$mail->From = $from_addr;
$mail->Subject = mb_encode_mimeheader($subject);
$mail->Body = strip_tags($message);
$mail->AddAddress($recipient);
$result = $mail->Send();
if ($result)
{
return TRUE;
}
else
{
return $mail->ErrorInfo;
}
}
宛先が複数で、1件ずつ個別送信したい場合は$recipientにアドレスの配列を渡してループでAddAddressすれば良いです。なお、addする前にclearしておく必要があります。
foreach ($recipient as $to)
{
$mail->clearAddresses();
$mail->AddAddress($to);
$result = $mail->Send();
if ($result === FALSE)
{
break;
}
}
PHPMailerの関数やプロパティについてはドキュメント(http://phpmailer.github.io/PHPMailer/)を参照して下さい。※後から気づきましたが、”phpmailerException”というものがありました…
コントローラーから呼び出す
$this->load->helper('phpmailer');
phpmailer_send(
'to_addr@example.com',
'FROM テスト',
'from_addr@example.com',
'件名',
'メッセージ本文');