2012年6月20日水曜日

FuelPHPでメール送信(smtp)

FuelPHPでメール送信(smtp)を試してみました。
やったことをメモ程度に。。。

まず、App/config/config.phpのpackagesにemailを追加
'packages' => array (
    'email',
);

次にpackages/email/config/email.phpをApp/config/にコピーします。
ここでメールの設定。
(メールサーバとか文字コードとかドライバとか)

実際にメール送信するコードは以下
    $email = Email::forge();
//    $email->from('test@example.com', mb_encode_mimeheader('テストユーザ', 'jis'));
    $email->from('test@example.com', 'テストユーザ');
    $email->to('hayashida@local.net');
//    $email->subject(mb_encode_mimeheader('テストメール', 'jis'));
    $email->subject('テストメール');
    $email->body(mb_convert_encoding($body, 'jis'));

    try
    {
        $email->send();
        $message = '送信しました';
    }
    catch (\EmailValidationFailedException $e)
    {
        $message = '送信に失敗しました。\n送信先のメールアドレスが正しくありません';
    }
    catch (\Exception $e)
    {
        $message = '送信に失敗しました' . $e->getMessage();
    }

こんなかんじでメール送信するみたいです。

ただ。。。開発環境で使ってるメールサーバ(WindowsにBlackJumboDog Ver4.2.3)でなかなか送信できませんでした。
原因としては「EHLO」コマンドにBlackJumboDogが対応していない。。。

「HELO」変えれないのかなって思ってFuelPHPのほうソース眺めてたらプログラム上は「EHLO」に失敗したら「HELO」を再送するようになってる。。。

よく見るとコマンド失敗したらエラーコードが返ってきたときにthrowされてるみたいで。。。バグ???

とりあえずpackages/email/classes/email/driver/smtp.php(行111目あたり)を以下のように修正。
    // Just say hello!
//    if($this->smtp_send('EHLO'.' '.\Input::server('SERVER_NAME', 'localhost.local'), 250, true) !== 250)
//    {
//        // Didn't work? Try HELO
//        $this->smtp_send('HELO'.' '.\Input::server('SERVER_NAME', 'localhost.local'), 250);
//    }
//
//    try
//    {
//        $this->smtp_send('HELP', 214);
//    }
//    catch(\SmtpCommandFailureException $e)
//    {
//        // Let this pass as some servers don't support this.
//    }
    try
    {
        try
        {
            $this->smtp_send('EHLO'.' '.\Input::server('SERVER_NAME', 'localhost.local'), 250);
        }
        catch(\SmtpCommandFailureException $e)
        {
            $this->smtp_send('HELO'.' '.\Input::server('SERVER_NAME', 'localhost.local'), 250);
        }
 
//    $this->smtp_send('HELP', 214);
    }
    catch (Exception $e)
    {
        throw $e;
    }

throwされてるからcatchしただけなんですが。。。
とりあえず動きました。
(もっといい方法があるかもしれないけど)

このあたり誰か詳しい方いたら教えて頂ければ助かります。

※2012.6.21
FuelPHP1.2からはメール送信時のmb_encode_mimeheaderは不要みたいです。
コード修正しました。

※2012.6.26
FuelPHP 1.2.1でバグ修正があったみたいです。




0 件のコメント:

コメントを投稿