Zend Framework - 只发送1封邮件

时间:2015-11-13 07:50:37

标签: php zend-framework2 zend-mail

我的应用程序(Zend Framework 2)中使用了Zend \ Mail。

这是一个示例场景,用户单击复选框然后继续提交。接收方将收到包含内容的电子邮件。

这是发送功能。

public function sendNotification()
{
    $mail = new Mail\Message();
    $mail->setBody('This is the text of the email.');
    $mail->setFrom('Freeaqingme@example.org', 'Sender\'s name');
    $mail->addTo('user1.arak@gmail.com', 'Name of recipient');
    $mail->setSubject('TestSubject');

    $transport = new Mail\Transport\Sendmail();
    $transport->send($mail);
}

我的问题是,当用户点击2个或多个复选框然后点击提交按钮时,它会发送2个或多个电子邮件,我想要做的只是向接收方发送1封电子邮件。

我该怎么办? 任何想法都将非常感激。请评论您想澄清并想知道的任何内容。

3 个答案:

答案 0 :(得分:1)

解决方案非常简单。您需要做的就是跟踪方法sendNotification()之前是否已被调用。

会议最适合这个。为了使它工作并且看起来更干净,你可以将它包装成一个独立的方法,如下所示:

public function sendNotificationOnDemand()
{
   $session = new \Zend\Session\Container();

   if (!$session->offsetExists('mail_sent')) {
      $session->offsetSet('mail_sent', true);
      return $this->sendNotification();
   }
}

因此,无论您拨打sendNotificationOnDemand()多少次,通知都只会发送一次。

答案 1 :(得分:0)

    public function sendNotification()
    {

     $session = new Container('email');

    if($session->offsetGet('send') != 'yes') {
        $mail = new Mail\Message();
        $mail->setBody('This is the text of the email.');
        $mail->setFrom('Freeaqingme@example.org', 'Sender\'s name');
        $mail->addTo('user1.arak@gmail.com', 'Name of recipient');
        $mail->setSubject('TestSubject');

        $transport = new Mail\Transport\Sendmail();
        $transport->send($mail);

         $session->setExpirationSeconds(5000);
         $session->offsetSet('send','yes');
    }

}  

答案 2 :(得分:0)

如果您希望禁止每个用户多次调用功能,则需要存储信息(用户已经称为操作,例如收到的电子邮件)的存储空间。

每当用户尝试重新发送电子邮件时,您的代码将从存储中查找信息,并且如果电子邮件应该重新发送,则可以决定结果(已经显示/未发送)。

正如已经建议的那样,您可以使用ZF2会话存储Zend\Session\Container

http://framework.zend.com/manual/current/en/modules/zend.session.container.html

但请记住,会话不是永久性信息存储。如果用户关闭浏览器并重新访问您的网站,之前操作的信息将丢失,他可以重新提交表单。

ZF2会话示例

use Zend\Session\Container;

public function sendNotification()
{
    $sessionContainer = new Container;

    if (!$sessionContainer->offsetExists('mail_send')) {

        $sessionContainer->offsetSet('mail_send', true);

        // send notification
        ...
    }
}

如果要保持信息持久性,请使用MySQL之类的持久性数据库存储。提取和存储将是类似的。