CakePHP3でZOHO使ってコンタクトフォームを作る

# [CakePHP 3 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cakephp3) 15日目の記事です。
メールサーバを無料で使いたかったので、ZOHOメールを選択しました。
そこで、CakePHP3でコンタクトフォームを簡単に作成してみました。

## 1.開発環境
サーバ：さくらVPS
メールサーバ：ZOHOメール


## 2.ZOHOメール
無料プランで、３ユーザーまで作れます
https://www.zoho.com/mail/

ZOHOの初期設定は、すでにたくさん情報があるので、そちらを参考に
http://appstars.jp/archive/123

**さくらVPSのネームサーバの場所**
さくらVPSのコントロールパネル > ネームサーバ登録


## 3.メールの設定が出来たかコマンドで確認

※ example.comは調べたいドメイン

```
$ nslookup -type=mx example.com
```

結果が、下記内容であれば設定完了

```
Non-authoritative answer:
example.com	mail exchanger = 20 mx2.zohomail.com.
example.com	mail exchanger = 10 mx.zohomail.com.
```

## 4.コード

### configの設定

```src/config/app.php
'EmailTransport' => [
    'default' => [
        変更なし
    ],
    'zoho' => [
        'className' => 'Smtp',
        'host' => 'ssl://smtp.zoho.com',
        'port' => 465,
        'timeout' => 30,
        'username' => 'info@example.com',
        'password' => 'パスワード',
        'client' => null,
        'tls' => null,
    ],
],
```

### Formの設定

```src/Form/ContactForm.php
namespace App\Form;

use Cake\Form\Form;
use Cake\Form\Schema;
use Cake\Validation\Validator;
use Cake\Network\Email\Email;

class ContactForm extends Form
{
    protected function _buildSchema(Schema $schema)
    {
        return $schema->addField('name', 'string')
            ->addField('email', ['type' => 'string'])
            ->addField('message', ['type' => 'text']);
    }

    protected function _buildValidator(Validator $validator)
    {
        return $validator
            ->notEmpty('name', '入力してください')
            ->add('name', 'length', [
                'rule' => ['minLength', 4],
                'message' => '名前は4文字以上入力してください。'
            ])
            ->notEmpty('email', '入力してください')
            ->add('email', 'format', [
                'rule' => 'email',
                'message' => 'メールアドレスを入力してください。',
            ]);
    }

    protected function _execute(array $data)
    {
        $email = new Email('default');
        $email->transport('zoho');
        $email->template('contact');
        $email->viewVars([
            'name' => $data['name'],
            'email' => $data['email'],
            'message' => $data['message']
        ]);
        $email->from(['info@example.jp' => '差出人名']);
        $email->to($data['email']);
        $email->subject('件名');
        $email->send();
        return true;
    }
}
```

### Emailの設定
```src/Template/Email/text/contact.ctp
以下の内容で送信されました。
 
--------------------------
Name: <?= $name."\n" ?>
Email: <?= $email."\n" ?>
Message:
<?= $message."\n" ?>
--------------------------
```

### Controllerの設定

```src/Controller/ContactsController.php
<?php
namespace App\Controller;

use App\Controller\AppController;
use App\Form\ContactForm;

class ContactsController extends AppController
{
    public function index()
    {
        $contact = new ContactForm();
        if ($this->request->is('post')) {
            $contact->execute($this->request->data);
        }

        $this->set('contact', $contact);
    }
}
```
### Viewの設定

```php:src/Template/Contacts/index.ctp
<?php echo $this->Form->create($contact); ?>
<?php echo $this->Form->input('name'); ?>
<?php echo $this->Form->input('email'); ?>
<?php echo $this->Form->input('message'); ?>
<?php echo $this->Form->button('Submit'); ?>
<?php echo $this->Form->end(); ?>
```


# まとめ
ZOHOでのドメイン認証で、つまずいて実装に時間がかかりました。
CakePHP3.xの記事が2.xに比べると少ないので、もっと増えると嬉しいです。

**参考にしたサイト**
http://qiita.com/kozo/items/00e66e8d0c3dbbfc907c
http://qiita.com/milano/items/7a71b09e891f87b8f62e