منبع اصلی نوشتار زیر در این لینک قرار دارد

ارسال mail از طریق Zend Framework

لطفا کامنتهای داخل کدها رو هم بخونید!! بعضیاشون واقعا ضروری هستن!

Zend Framework انتخاب من برای یک فریم ورک برای کار با PHP هستش. اینبار میخوام درباره چگونگی ارسال ایمیل به صورتی که بشه براش قالب ایجاد کرد بنویسم. این کد رو من خیلی وقت نیست که نوشتم. اگه مشکل داشت خوشحال میشم برام بنویسید تا بدونم.
برای استفاده باید چند تا کار انجام بدید. اول اینکه توی فایل تنظیمات برنامه خودتون یه سری اطلاعات اضافه کنید. اگه از ini استفاده میکنید اینو به فایل تنظیمات اضافه کنید :

mail.from= "you@yoursite.com"
mail.name= "Your name"
mail.templatePath=APPLICATION_PATH "/../../layouts/mails"
mail.host=imap.yoursite.com
mail.port=25
mail.param.auth=login
mail.param.username=you@yoursite.com
mail.param.password=yourpassword

اینو توی بخش مناسب بنویسید مثلا برای development توی بخش development و… فقط مساله templatePath هست که اونم آدرس رو عوض کنید با آدرسی که میخواید view های مربوط به ایمیل قرار بگیره. (این رو قطعا باید بر اساس پروژه خودتون عوض کنید)
گام بعدی اینه که تنظیمات رو بخونید. اینجوری (معمولا توی bootstrap):

//Load yor config CHANGE PATH TO YOUR CONFIG FILE!!!!!!
$config=new Zend_Config_Ini(APPLICATION_PATH . \'/../../configs/application.ini\',APPLICATION_ENV);
Zend_Registry::set(\'config\',$config);	

//Do your stuff......

//Now its time to setup mail system :D
$config=Zend_Registry::get(\'config\');
$mailParams=$config->mail->toArray();
Zend_Registry::set(\'mail_params\',$mailParams);	

شکه نشید ولی تا الان هیچ کاری انجام نشده :)‌ حالا وقت ایجاد Cybits_Utils_View_Helper_SendMail هستش. توی فولدر library چند تا فولدر باید درست شه :

اول Cybits داخلش Utils داخلش View داخلش Helper . این تو در تو بودن روش کار منه شما میتونید ساده ترش کنید اونوقت اسم کلاس باید عوض شه. یه فایل بسازید به اسم SendMail.php توی پوشه Helper و این کد رو داخلش بگذارید :

<?php
/**
 *
 * @author f0rud
 * @version 
 */
require_once \'Zend/Loader/PluginLoader.php\';
require_once \'Zend/Controller/Action/Helper/Abstract.php\';

/**
 * SendMail Action Helper 
 * 
 * @uses actionHelper Cybits_Mail_View_Helper
 */
class Cybits_Utils_View_Helper_SendMail extends Zend_Controller_Action_Helper_Abstract {
	/**
	 * @var Zend_Loader_PluginLoader
	 */
	public $pluginLoader;
	
	/**
	 * Constructor: initialize plugin loader
	 * 
	 * @return void
	 */
	public function __construct() {
		$this->pluginLoader = new Zend_Loader_PluginLoader ( );
	}
	
	/**
	 * Strategy pattern: call helper as broker method
	 */
	public function SendMail($mailParams) {
		if (!isset($mailParams[\'template\']) || 
			!isset($mailParams[\'to\']) || 
			!isset($mailParams[\'subject\'])) 
			return false;
		//Build a new view 
		$view = new Zend_View; 
		$params=Zend_Registry::get(\'mail_params\');
		 
		$view->setScriptPath($params[\'templatePath\']);

		foreach($mailParams as $key=>$value){
			$view->assign($key,$value);
		}
		
		$body = $view->render($mailParams[\'template\']);
		$mail = new Zend_Mail(); 
		$transport = new Zend_Mail_Transport_Smtp($params[\'host\'], $params[\'param\']);
		Zend_Mail::setDefaultTransport($transport); 
		$mail->setBodyText($body)
			 ->setBodyHtml($body)	  
		     ->setFrom($params[\'from\'],$params[\'name\'])  
		     ->addTo($mailParams[\'to\'])  
		     ->setSubject($mailParams[\'subject\']);  
		// Try to send the email, or log the exception  
		try {  
		   $mail->send();
		   return true;  
		}catch (Exception $e){
			//If you setup a working logger uncomment this lines :
			//$logger=Zend_Registry::get(\'logger\');
			//$logger->log($e->getMessage(),Zend_Log::ERR);
			return false;  
		}
		
	}
}

خوب گام آخر (آخریه قول میدم!!) این رو باید به view هاتون اضافه کنید. توی کدتون معمولا اینکار انجام میشه. اگه نشده توی bootstrap فایلتون این کد رو اضافه کنید :

$view= new Zend_View();
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
$view->addHelperPath(\'Cybits/Utils/View/Helper/\',\'Cybits_Utils_View_Helper\');
//Add other helper here ...
		
$viewRenderer->setView($view);
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);

حالا همه چی آمادست. یه view بسازید توی فولدری که توی تنظیمات معرفی کردید. یادتون باشه این میله، نه html کامل . میتونید تست کنید، خیلی از المانها درست کار میکنن. مثلا من این view رو برای ارسال میل ایجاد کردم :

//file name is : recover.phtml
<table style="border : 1px dashed skyblue;">
	<tr>
		<th>Forgot password </th>
	</tr>
	<tr>
		<td>Some one request to reset your password. If that was you, click 
		on this link if not , just forget it :)
		<a href="<?=$this->recoverLink?>"><?=$this->recoverLink?></a>		
		</td>
	</tr>
	<tr>
		<td><small><a href="<?=ZF_HOST?>" title="Our site"><?=ZF_HOST?></a></small></td>
	</tr>
</table>

ثابت ZF_HOST آدرس سایته(من معمولا تو همه پروژه هام همچین ثابتی رو تعریف میکنم به درد میخوره). مثلا http://cyberrabbits.net بعد موقع فراخوانی همین (از داخل Controller ):

if ($this->view->SendMail(array(
	\'template\'=>\'recover.phtml\',
	\'to\'=>$usermail,
	\'subject\'=>\'Forgot password\',
	\'recoverLink\'=>ZF_HOST.\'/user/recover/id/\'.$secret
	))) $this->view->status=\'SEND_OK\'; //Send OK
else $this->view->status=\'SEND_FAIL\';//Send fail 

اگه داخل view باشید هم میتونید به جای this->view->SendMail بزنید this->SendMail هر آرگومانی هم که میخواید به view مربوط به میل بفرستید خیلی ساده میتونید تو آرگومان بنویسیدش. (متغیر recoverLink رو توی مثال من ببینید)

خداییش این کد تقریبا ۵ ساعت وقت منو گرفته!!!



برچسب ها : , , , ,

به سیاره لینوکس امتیاز دهید

به اين صفحه امتياز دهيد