CodeIgniter3でPHPMailerを使ってメールを送る

仕事で必要だったので超急ぎで作りました。
メールサーバのホスト名だのパスワードだのはconfigファイルから読み込むべきだと思いますが、
まあそのあたりはよしなに

PHPMailerはcomposerとかなにかで読み込んでください

### ソースコード

これを `/application/helpers/phpmailer_helper.php` としてサーバに置きます

```php:/application/helpers/phpmailer_helper.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class PHPMailerHelper
{
    private $_mail;

    public function __construct()
    {
        $this->_mail = $this->_init();
    }

    private function _init()
    {
        $mail = new PHPMailer\PHPMailer\PHPMailer(true); // enable phpmailer debug when true
        $mail->Debugoutput = function($str, $level) { syslog(LOG_ERR, "PHP Mailer:" . $str); };
        $mail->SMTPDebug = 3;

        $mail->isSMTP();
        $mail->setFrom('from@example.com', mb_encode_mimeheader('From Name'));
        $mail->CharSet = 'UTF-8';
        $mail->Wordwrap = 76; // It equals CodeIgniter word wrapping length @link https://codeigniter.jp/user_guide/3/libraries/email.html

        $mail->Host = 'email-smtp.ap-northeast-1.amazonaws.com'; // AWS SESの場合
        $mail->Port = 587; // ssl:465 tls:587
        $mail->Username = 'SMTP_USER_NAME_HERE';
        $mail->Password = 'SMTP_PASSWORD_HERE';

        $mail->SMTPAuth = true;
        $mail->SMTPSecure = 'tls'; // tls or ssl

        // remove this commentout to disable ssl validate if you need
        //$mail->SMTPOptions = array(
        //    'ssl' => array(
        //        'verify_peer' => false,
        //        'verify_peer_name' => false,
        //        // 'allow_self_signed' => true
        //    )
        //);

        return $mail;
    }

    /**
     * Override mailer from address and name if you need
     */
    public function setFrom($email, $name = "")
    {
        //$this->_mail->setFrom('from@example.com', mb_encode_mimeheader('From Name'));
        $this->_mail->setFrom($email, mb_encode_mimeheader($name));
    }

    public function test()
    {
        $this->_mail->addAddress('myname@example.com');
        $this->_mail->Subject = '[Sample] これはサンプルメールです';
        $this->_mail->isHTML(false);
        $this->_mail->Body = "サンプルメール\nサンプルメール\nサンプルメール\n\nサンプルメール";

        $isSent = $this->_mail->Send();

        return $isSent; // boolean
    }

    public function send($toAddresses, $subject = "", $message = "", $attachement = [])
    {
        $name = '';

        if(is_array($toAddresses)){
            foreach($toAddresses as $email) {
                $this->_mail->addAddress($email, $name);
            }
        }
        else {
            $email = $toAddresses;
            $this->_mail->addAddress($email, $name);
        }

        $this->_mail->Subject = $subject;

        $this->_mail->isHTML(false);
        $this->_mail->Body = $message;

        if (isset($attachment) && is_array($attachement)) {
            $this->_mail->addStringAttachment($attachement['value'], $attachement['name'], 'base64', $attachement['type']);
        }

        $isSent = $this->_mail->Send();

        return $isSent; // boolean
    }
}
```

### 使い方

使いたいControllerにこんな感じに記述します

```php:/application/controllers/Contact.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Contact extends CI_Controller
{
	public function __construct()
	{
		parent::__construct();
		
		$this->load->helper('phpmailer');
	}

	public function test()
	{
		$mail = new PHPMailerHelper();
		$isSent = $mail->test();

		if($isSent){
			die("sent");
		}
		else {
			die("not send");
		}
	}

	public function test2()
	{
		$mail = new PHPMailerHelper();
		$isSent = $mail->send('myname@example.com', "件名", "本文");

		if($isSent){
			die("sent");
		}
		else {
			die("not send");
		}
	}

	public function test3()
	{
		$mail = new PHPMailerHelper();

		$toAddresses = array(
			'myname@example.com',
			'myname2@example.com'
		);

		$isSent = $mail->send($toAddresses, "件名", "本文");

		if($isSent){
			die("sent");
		}
		else {
			die("not send");
		}
	}
```

### 確認方法

ブラウザでページにアクセスしたらメールが届くと思います(メールサーバの設定が正しければ)

```
https://www.example.com/contact/test1
https://www.example.com/contact/test2
https://www.example.com/contact/test3
```