我的应用程序(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封电子邮件。
我该怎么办? 任何想法都将非常感激。请评论您想澄清并想知道的任何内容。
答案 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
之类的持久性数据库存储。提取和存储将是类似的。