Ziggi Posted December 13, 2012 Share Posted December 13, 2012 Hi, There is a new version of PHPMailer released (v. 5.2.2). It seems this new version is working well with MetYii's wrapper but I can't figure out how to use a great new PHPMailer 'callback' feature. PHPMailer documents it only by example: /* Callback (action) function * bool $result result of the send action * string $to email address of the recipient * string $cc cc email addresses * string $bcc bcc email addresses * string $subject the subject * string $body the email body * @return boolean */ require_once '../class.phpmailer.php'; $mail = new PHPMailer(); function callbackAction ($result, $to, $cc, $bcc, $subject, $body) { /* this callback example echos the results to the screen - implement to post to databases, build CSV log files, etc., with minor changes */ $to = cleanEmails($to,'to'); $cc = cleanEmails($cc[0],'cc'); $bcc = cleanEmails($bcc[0],'cc'); echo $result . "\tTo: " . $to['Name'] . "\tTo: " . $to['Email'] . "\tCc: " . $cc['Name'] . "\tCc: " . $cc['Email'] . "\tBcc: " . $bcc['Name'] . "\tBcc: " . $bcc['Email'] . "\t" . $subject . "<br />\n"; return true; } try { $mail->IsMail(); // telling the class to use SMTP $mail->SetFrom('you@yourdomain.com', 'Your Name'); $mail->AddAddress('another@yourdomain.com', 'John Doe'); $mail->Subject = 'PHPMailer Lite Test Subject via Mail()'; $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically $mail->MsgHTML(file_get_contents('contents.html')); $mail->AddAttachment('images/phpmailer.gif'); // attachment $mail->AddAttachment('images/phpmailer_mini.gif'); // attachment $mail->action_function = 'callbackAction'; $mail->Send(); echo "Message Sent OK</p>\n"; } catch (phpmailerException $e) { echo $e->errorMessage(); //Pretty error messages from PHPMailer } catch (Exception $e) { echo $e->getMessage(); //Boring error messages from anything else! } You can see a callback function and e-mail sending block. When using a wrapper, sending e-mail looks quite similar: Yii::app()->mailer->IsSMTP(); try{ Yii::app()->mailer->Host = Yii::app()->params['mail']['smtp_host']; Yii::app()->mailer->Encoding = Yii::app()->params['mail']['smtp_encoding']; Yii::app()->mailer->CharSet = Yii::app()->params['mail']['smtp_charset']; Yii::app()->mailer->WordWrap = Yii::app()->params['mail']['smtp_word_wrap']; Yii::app()->mailer->From = $model->email; Yii::app()->mailer->FromName = $name; Yii::app()->mailer->AddReplyTo($model->email); Yii::app()->mailer->AddAddress(Yii::app()->params['adminEmail']); Yii::app()->mailer->Subject = $subject; Yii::app()->mailer->getView('contact_form', array('name'=>$model->name, 'email'=>$model->email, 'subject'=>$model->subject, 'body'=>$body), 'main'); Yii::app()->mailer->action_function = 'mailerCallback'; Yii::app()->mailer->Send(); }catch(phpmailerException $e){ Yii::app()->user->setFlash('contact', $e->errorMessage()); }catch(Exception $e){ Yii::app()->user->setFlash('contact', $e->getMessage()); } $this->refresh(); } You may have notice I already added: Yii::app()->mailer->action_function = 'mailerCallback'; but... I have no idea where to put the 'mailerCallback' function within Yii application context. I tried to add it to controller class but it does not work this way. Can you help me please? Rgs, Ziggi Link to comment Share on other sites More sharing options...
Antonio Conte Posted December 13, 2012 Share Posted December 13, 2012 You have to dig into the source code of PHP mailer a little bit. This is what I found: /** * Callback Action function name. * The function that handles the result of the send email action. * It is called out by Send() for each email sent. * * Value can be: * - 'function_name' for function names * - 'Class::Method' for static method calls * - array($object, 'Method') for calling methods on $object * See http://php.net/is_callable manual page for more details. * * Parameters: * bool $result result of the send action * string $to email address of the recipient * string $cc cc email addresses * string $bcc bcc email addresses * string $subject the subject * string $body the email body * string $from email address of sender * @var string */ public $action_function = ''; //'callbackAction'; In other words, it will invoke a function upon $mail->Send(); You should store the result in a variable and print it for response purposes. It will give you general information about the mail being sent. As you can also see, this property says to look for "is_callable()" in the manual. I take from that they use a function like call_user_func() with your method name. For this to work, the function (or static function call) must obviously be declared (or required/called upon) in the same file. That is why you can see the function "callBackAction" above in your code. Do you have enough sources to get this to work now? Alternatives are placing this function below your controller definition or create a static "helper" class. I would go for this last approach, where you could also wrap this wrapper code. (Yo dog, we heard you like wrappers, so we wrapped a wrapper in a wrapper.) That way, it should be very clean: Lots of into on different ways to create small helpers/helper function and how to call them here: - http://www.yiiframew...-functions/#hh1 1 Link to comment Share on other sites More sharing options...
Ziggi Posted December 13, 2012 Author Share Posted December 13, 2012 They do it the way you guessed: protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from=null) { if (!empty($this->action_function) && is_callable($this->action_function)) { $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from); call_user_func_array($this->action_function, $params); } } The helper function is the right "Yii-istic" way to go - thank you once again, Antonio. BTW - did you study IT on the university or you've learnt it all by your own? I would say... I like the way you explain - it is more about "how to understand the code and solve the problem" rather than "how to solve the problem only". I am missing academic background and too often get lost in various scenarios... Link to comment Share on other sites More sharing options...
Antonio Conte Posted December 13, 2012 Share Posted December 13, 2012 Yes, I do study computer science. Thanks for the nice words. I like to life by the words of Albert Einstein: If you can't explain it simply, you don't understand it well enough. Link to comment Share on other sites More sharing options...
Recommended Posts