cakephp2.x メール送信

2014年11月4日更新 view: 4240 view
photoBy: http://japan.cnet.com/storage/2012/08/08/5f5b69b9315fd56bb1a6ac60729d5f84/Kindle_Fire_e-mail_icon.jpg

chrome の 拡張 HTMLタグチェッカー 0.0.30 をインストールしているとなぜか
メールが2通届くエラーが発生するので注意!

cakephp2 でのメール送信

cakephp1 シリーズの時は Qdmail を使っていた。
ただ、cakephp2 からは CakeEmail を使うのがデフォ。

CakeEmailって?

CakeEmailはEmailComponentに代わって作られたライブラリ。
「EmailComponentはdeprecatedだからCakeEmail使ってね」とのこと。

ライブラリを読み込む

App::uses( 'CakeEmail', 'Network/Email');

使い方

まずは
app/Config/email.php.default の default を外す。

public $default = array(
        // デフォルトの設定
    );

    public $gmail = array(
        // gmailを使うときの設定
    );

gmailを使うとき

public $gmail = array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => 465,
        'username' => '自分のgmailアカウント',
        'password' => 'パスワード'
    );

SMTPを使わない

public $contact = array(
        'transport' => 'Mail',
        'from' => array('info@example.com' => 'SiteName'),
        'to' => array('contact@example.com' => 'SiteName'),
        'subject' => 'お問い合わせがあります',
        'sendAs' => 'text',
        //'template' => 'contact', //テンプレートファイル
    );

送信してみる

App::uses('CakeEmail', 'Network/Email');

class EmailsController extends AppController {
    public function send()
    {
        $email = new CakeEmail('gmail');
        $res = $email->config(array('log' => 'emails'))
            ->from(array('from用のアドレス' => 'アドレスの別名'))
            ->to('送りたいアドレス')
            ->subject('タイトル')
            ->send('メッセージ');
    }
}

array('log' => 'emails') としておくことで、デバッグ情報が
app/tmp/logs/emails.log に出力される。

テンプレートの作成

ここまででとりあえずテキストだけを送信することができました。
次はテンプレートを使って送信してみます。

まずはレイアウト。

Layouts
/lib/Cake/View/Layouts/Emails

app/View/Layouts/Emails/text/text_layout.ctp へコピー

<?php echo $content_for_layout; ?>
まとめーたー
http://www.matomater.com

View
/lib/Caka/View/Emails

app/View/Emails/text/text_mail.ctp へコピー

<?php echo $name; ?> 様
<?php echo $message; ?>

では送信。

// テンプレートに送る変数
$body = array (
    'name' => 'たろさん',
    'message'    => 'おいしいケーキあげりゅ',
);
// 設定読み込み
$email = new CakeEmail('gmail');
// 送信
$email = $email->config(array('log' => 'emails'))
    ->template('text_mail', 'text_layout')
    ->viewVars($body)
    ->from(array('*******@*******.com' => '*******@*******.com'))
    ->to('*******@*******.com')
    // ->bcc($this->request->data['Contact']['email'])
    // ->cc('*******@*******.com')
    ->subject('タイトル')
    ->send();
debug($email);

送信成功か失敗かを if 文分岐

// 送信したメールのヘッダーとメッセージを配列で返します
                if ($email->send()) {
                    $this->Session->setFlash('問い合わせ完了');
                } else {
                    $this->Session->setFlash('問い合わせに失敗しました。');
                }

logが
status=deferredなどstatus=sent以外は送信できてない場合がある。

ファイルを添付する

今回は、フォームからアップロードされたファイルをサーバーに保存せず、直接添付して送信する方法を紹介。

$email = new CakeEmail('default');
            
            //アップロードファイルをそのまま送信
            $send = $email->config(array('log' => 'emails'))
            ->from(u('email'))
            ->to(EMAIL)
            ->subject('年齢認証があります')
            ->attachments(array($this->request->data['User']['file']['name'] => array('file' => $this->request->data['User']['file']['tmp_name'])))
            ->send('メッセージ');

htmlメールで送信

sendAs で設定しやぁという情報がネットに流れているがそれだとできない。
emailFormat で指定して html メールを送信しよう。

$email = new CakeEmail('magaSmtp');
$body = array (
    'name' => 'たろさん',
    'message'    => 'おいしいケーキあげりゅ',
);

$send = $email->config(array('log' => 'emails'))
->emailFormat('html')
->template('default')//element / layout
->viewVars($body)

->from(from@hoge.com)
->to('hoge@okws.jp')
->subject('タイトル')
->send();

これでHTMLメールが送信できるようになる。

エラーメール、リターンメールの受信

http://matomater.com/16214/

スポンサードリンク

 

スポンサードリンク

関連記事

関連カテゴリ