【问题标题】:Yii2 swiftmailer - foreach mail sending (batch)Yii2 swiftmailer - foreach 邮件发送(批处理)
【发布时间】:2016-03-07 20:31:45
【问题描述】:

我需要批量发送邮件,每封邮件都有唯一的信息。我正在尝试 foreach 循环,但我不断收到 Allowed memory size of 104857600 bytes 用尽(试图分配 66 个字节) 错误。 是否可以使用 swiftmailer 执行 foreach,或者有其他方式(消息包含唯一令牌)。代码:

$users = Users::find()->where(['email' => $emails])->all();

        foreach($users as $user):


                $user->scenario = 'saveToken';

                $token = hash('sha256',microtime() . Yii::$app->security->generateRandomString(32));

                $user->token = $token;

                $user->save();

               Email::oldUsers($user->email, $token);


        endforeach;

发送电子邮件:

static function oldUsers($userEmail, $token)
    {
        Yii::$app->mailer->compose('_oldUsers', ['token' => $token])
            ->setFrom('no-reply@sketchlist.com')
            ->setTo($userEmail)
            ->setBcc(['vlad@sketchlist.com'])
            ->setSubject('Sketchlist Account Activation')
            ->send();
    }

【问题讨论】:

  • 您可能会采取一些措施来产生此错误。在创建大量收件人时,您可能正在耗尽内存。 ?尝试一次收到一封电子邮件,而不是一次尝试所有电子邮件?

标签: php email yii2 swiftmailer


【解决方案1】:

在您正在执行电子邮件的功能中尝试这些。

ini_set("memory_limit", "-1");
set_time_limit(0);

如果这没有帮助,请关注this post

【讨论】:

    【解决方案2】:

    我想向您展示我将如何编写此代码。以防万一它对某人有所帮助,因为这是一个古老的、没有答案的问题。

    确实没有必要为此使用场景。这是一个如此简单的任务。此外,您不需要在generateRandomString() 之上进行散列。如果您想创建一个唯一且随机的token,只需使用generateRandomKey(),默认长度也是32。

    另外,请使用save(false)update(false)。 false 关闭验证。当您不使用用户输入并且您自己以编程方式输入基于受控值的数据时,您应该禁用验证规则。当我这样做时,我更喜欢使用update,因为当我们使用已经存在的模型时它更有意义。

    在您的 User IdentityInterface(common\models\User.php 高级)中:

    public function generateToken()
    {
        $this->token = Yii::$app->security->generateRandomString();
    }
    
    public function getToken()
    {
        return $this->token;
    }
    

    在您的控制器中:

    public function actionTest()
    {
        $emails = ['email@example.com', 'email2@example.com', 'email3@example.com'];
        $users = Users::find()->where(['email' => $emails])->all();
    
        foreach ($users as $user)
        {
            $user->generateToken();
    
            if ( $user->update(false) )
            {
                Yii::$app->mailer->compose('_oldUsers', ['token' => $user->getToken()])
                    ->setFrom(['no-reply@sketchlist.com' => 'Your Name'])
                    ->setTo($user->email)
                    ->setBcc(['vlad@sketchlist.com'])
                    ->setSubject('Sketchlist Account Activation')
                    ->send();
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果您在 foreach 循环中存在内存问题,您应该尝试分批检索数据,例如每次迭代检索 10 条记录

      foreach (Users::find()->where(['email' => $emails])->each(10) as $user) {
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-04
        • 2010-12-11
        • 1970-01-01
        相关资源
        最近更新 更多