CodeIgniter で PHPMailer を使う

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',
  '件名',
  'メッセージ本文');
タイトルとURLをコピーしました