Zend_Mailで簡単メール送信

PHPでも、mail関数やmb_send_mailでメールを送信することは出来ますが、ファイルを添付してのメールやHTMLメールを送信するには、かなり面倒な処理が必要です。私も今まで、メール関係はpearを使って処理していました。しかし、ZendFrameworkでは、このような面倒な処理も簡単にできる機能が色々用意されています。今日は、Zend_Mailについて調べてみたいと思います。

1) MailController.phpファイルを作成して、indexActionとメール送信用のsendActionと送信後のメッセージを表示するthanksActionを作成します。

2) indexActionにはとりあえず中身は何も記載しません。

public function indexAction(){}

3) 同様にthanksActionも中身は何も記載しません。

public function thanksAction(){}

4) sendActionには、POST送信されたデータを受信するコードを記述します。

$to=$this->getRequest()->getParam(‘to’);
$from=$this->getRequest()->getParam(‘from’);
$subject=$this->getRequest()->getParam(‘subject’);
$body=$this->getRequest()->getParam(‘body’);

5) Zend_Mailをインスタンス化します。引数に文字コードを指定します。

$mail=new Zend_Mail(‘utf8’);

6) 『addTo』で送信先のメールアドレスを指定します。『setFrom』は、差出人のメールアドレス、『setSubject』は表題、『setBotyText』は本文を設定します。

$mail->addTo($to);
$mail->setFrom($form);
$mail->setSubject($subject);
$mail->setBodyText($body);

7) 基本的な設定が終わったら『send』を呼び出せばメールが送信されます。実に簡単にメールが送信できます。

$mail->send();

8) 下記にMailController.phpのコードを記述しておきます。

<?php
//定数の設定
define('APP_DIR', dirname(dirname(__FILE__)));
define('LAYOUT_DIR', APP_DIR.'/views/layouts');
//基本ライブラリ関係のロード
Zend_Loader::loadClass('Zend_Controller_Action');
Zend_Loader::loadClass('Zend_View');
Zend_Loader::loadClass('Zend_Layout');
//Zend_Mailのロード
Zend_Loader::loadClass('Zend_Mail');
class MailController extends Zend_Controller_Action{
 //初期化
 public function init(){
 //ヘッドタイトル情報をセットする
 $this->view->headTitle('Winrado徒然草');
 //連想配列による情報のセット
 $this->view->assign('sitename','WinRoad徒然草');
 $this->view->assign('description','ZendFrameworkの為のテストサイトです。');
 $this->view->assign('content_header','header.phtml');
 $this->view->assign('content_footer','footer.phtml');
 $this->view->assign('content_footer_text','copyright Winroad徒然草2011.');
 //Zend_layoutのためのオプションの指定
 $options=array(
 'layout'=>'layout',
 'layoutPath'=>LAYOUT_DIR,
 'content'=>'content');
 //Zend_layoutメソッドの開始
 $layout=Zend_Layout::startMvc($options);

 }
 public function indexAction(){
 }

 public function sendAction(){
 //POSTデータの受信
 $to=$this->getRequest()->getParam('to');
 $from=$this->getRequest()->getParam('from');
 $subject=$this->getRequest()->getParam('subject');
 $body=$this->getRequest()->getParam('body');
 //Zend_Mailのインスタンス化
 $mail=new Zend_Mail('utf-8');
 //メール送信情報の設定
 $mail->addTo($to);
 $mail->setFrom($form);
 $mail->setSubject($subject);
 $mail->setBodyText($body);
 //メール送信
 $mail->send();
 //送信完了ページへリダイレクト
 $this->_redirect($this->url.'/mail/thanks');
 }
 public function thanksAction(){
 }
}

9) 『views/scripts』フォルダに新しく『mail』フォルダを作成し、index.phtmlとthanks.phtmlファイルを作成します。

10) ビューファイルに関しては、ほとんど説明はいらないと思いますが、念のために下記にコードを記述しておきます。

index.phtml

<div class="content">
<form name="form1" method="post" action="<?=$this->url?>/mail/send">
 <table width="100%" border="1">
 <tr>
 <th scope="row">宛先</th>
 <td><label for="to"></label>
 <input name="to" type="text" id="to" size="40"></td>
 </tr>
 <tr>
 <th scope="row">差出人</th>
 <td><label for="from"></label>
 <input name="from" type="text" id="from" size="40"></td>
 </tr>
 <tr>
 <th scope="row">表題</th>
 <td><label for="subject"></label>
 <input name="subject" type="text" id="subject" size="40"></td>
 </tr>
 <tr>
 <th scope="row">内容</th>
 <td><label for="body"></label>
 <textarea name="body" id="body" cols="40" rows="5"></textarea></td>
 </tr>
 <tr>
 <th scope="row">&nbsp;</th>
 <td><input type="submit" name="button" id="button" value="メール送信"></td>
 </tr>
 </table>
</form>
</div>

thanks.phtml

<div class="content">
<h2>メールが送信されました。</h2>
<p><a href="<?=$this->url?>/mail/">メール送信ページへ</a></p>
</div>

11) それではブラウザで確認してみましょう。メールを送信してみました。

12) きちんとメールが届きました。

添付ファイルの送信

13) それでは、メールにファイルを添付して送信する方法を調べてみましょう。これは、フォームから送信したファイルを添付しそのまま送るような形にしたいので、ファイルのアップロードについても調べる必要があります。

14) ZendFrameworkでファイルのアップロードをする場合は、Zend_Formを使う必要があります。MailController.phpの冒頭にZend_Fromをロードします。

Zend_Loader::loadClass(‘Zend_Form’);

15) Zend_Form_Elementをロードします。

Zend_Loader::loadClass(‘Zend_Form_Element_Text’);
Zend_Loader::loadClass(‘Zend_Form_Element_Textarea’);
Zend_Loader::loadClass(‘Zend_Form_Element_Submit’);
Zend_Loader::loadClass(‘Zend_Form_Element_File’);

16) フォーム作成のためのメソッドcreateAddFromを作成します。

public function createAddForm(){
 //Zend_Formをインスタンス化します。
 $form=new Zend_Form();
 //フォームの基本情報をセットします。
 $form->setMethod('post')->setAction('send');
 //フォームのコントロールを組み込みます
 $to=new Zend_Form_Element_Text('to');
 $to->setAttrib('size',60)
 ->setLabel('宛先')
 ->setRequired(true)//必須項目の指定
 ->addValidator('EmailAddress')
 ->setErrorMessages(array(
 'notEmpty'=>"メールアドレスを入力して下さい"
 ));
 $from=new Zend_Form_Element_Text('from');
 $from->setAttrib('size',60)
 ->setLabel('差出人')
 ->setRequired(true)//必須項目の指定
 ->addValidator('EmailAddress')
 ->setErrorMessages(array(
 'notEmpty'=>"メールアドレスを入力して下さい"
 ));
 $subject=new Zend_Form_Element_Text('subject');
 $subject->setAttrib('size',60)
 ->setLabel('表題')
 ->setRequired(true)//必須項目の指定
 ->setErrorMessages(array(
 'notEmpty'=>"表題を入力して下さい"
 ));
 $body=new Zend_Form_Element_Textarea('body');
 $body->setAttribs(array('cols'=>60,'rows'=>5))
 ->setLabel('内容')
 ->setRequired(true)
 ->setErrorMessages(array(
 'notEmpty'=>"何か入力して下さい。"));
 $file1=new Zend_Form_Element_File('file1');
 $file1->setAttrib('size',60)
 ->setLabel('添付ファイル');
 $send=new Zend_Form_Element_Submit('send');
 $send->setLabel('メール送信');
 //コントローラの組込
 $form->addElement($to);
 $form->addElement($from);
 $form->addElement($subject);
 $form->addElement($body);
 $form->addElement($file1);
 $form->addElement($send);

 return $form;
 }
}

17) indexActionに下記のコードを記述します。

$this->view->assign(‘form’,$this->createAddForm());

18)  index.phtmlを下記のように修正します。

<div class=”content”>
<p>メール送信
<?=$this->form?>
</div>

19) sendActionを修正します。まず最初に『getFileInfo』メソッドで送信されたファイルに関する情報を取り出します。

$info=$form->file1->getFileInfo();

20) 『getFileInfo』では、ファイルに関するあらゆる情報が連想配列としてまとめられていますので、file1に関する情報だけを変数に取り出します。

$fileInfo=$info[‘file1’];

21) ファイルをメールに添付するために『Zend_Mime_Part』インスタンスを作成します。ファイルを添付する場合は一時ファイルとして保管されている$fileInfo[‘tmp_name’]の内容を『file_get_contents』で取り出します。

$part=new Zend_Mime_Part(file_get_contents($fileInfo[‘tmp_name’]));

22) データタイプを設定します。これは、$fileInfo[‘type’]で取り出した値を指定します。

$part->type=$fileInfo[‘type’];

23) dispositionを使ってファイルの添付形式を指定します。Zend_Mimeクラスにある静的メンバークラスを使って指定します。今回は埋め込み式を指定します。

$part->disposition=Zend_Mime::DISPOSITION_INLINE;

24) encodingを使って、エンコード方式を指定します。Base64を指定します。これもZend_Mimeクラスの静的メンバークラスを使います。

$part->encoding=Zend_Mime::ENCODING_BASE64;

25) filenameでファイル名を指定します。アップロードした元のファイル名$fileInfo[‘name’]を指定します。

$part->finename=$fileInfo[‘name’];

26)  最後に作成されたZend_Mime_Partインスタンスを、Zend_Mailの『addAttachment』メソッドでメールに追加します。

$mail->addAttachment($part);

27) これで、添付ファイル付きのメールが送信できます。sendActionのコードを書きに記述します。

public function sendAction(){
 $form=$this->createAddForm();
 //POSTデータの受信
 $to=$this->getRequest()->getParam('to');
 $from=$this->getRequest()->getParam('from');
 $subject=$this->getRequest()->getParam('subject');
 $body=$this->getRequest()->getParam('body');
 $file=$this->getRequest()->getParam('file1');
 //Zend_Mailのインスタンス化
 $mail=new Zend_Mail('utf-8');
 //メール送信情報の設定
 $mail->addTo($to);
 $mail->setFrom($from);
 $mail->setSubject($subject);
 $mail->setBodyText($body);
 //ファイルに関する情報の取得
 $info=$form->file1->getFileInfo();
 //添付ファイル1の情報を取得します
 $fileInfo=$info['file1'];
 //Zend_Mime_Partのインスタンスを作成します
 $part=new Zend_Mime_Part(file_get_contents($fileInfo['tmp_name']));
 //データタイプの設定
 $part->type=$fileInfo['type'];
 //ファイル添付方式の指定
 $part->dispositon=Zend_Mime::DISPOSITION_INLINE;
 //エンコード方式の指定
 $part->encoding=Zend_Mime::ENCODING_BASE64;
 //ファイル名の指定
 $part->filename=$fileInfo['name'];
 //作成したZen_Mime_Partインスタンスの添付
 $mail->addAttachment($part);
 //メール送信
 $mail->send();
 //送信完了ページへリダイレクト
 $this->_redirect($this->url.'/mail/thanks');
 }

28) それではメール送信をしてみます。

29) 受信したメールを確認してみます。

30) ファイル名が送信されていないみたいです。どこか間違いがあるみたいです。後で修正しておきます。

本日は以上です。

 

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ