Yii2 swiftmailer - foreach邮件发送(批量)

时间:2016-03-07 20:31:46

标签: php email yii2 swiftmailer

我需要发送批量电子邮件,每封邮件都有唯一的邮件。我正在尝试foreach循环,但我一直在允许内存大小104857600字节耗尽(试图分配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();
    }

3 个答案:

答案 0 :(得分:0)

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

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

如果这样做无效,请按照this post

进行操作

答案 1 :(得分:0)

我想告诉你我将如何编码。以防万一它可以帮助某人,因为这是一个古老的,没有答案的问题。

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

另外,请使用save(false)update(false)。错误关闭验证。如果您不使用用户输入,并且您自己以编程方式根据受控值输入数据,则应禁用验证规则。当我这样做时,我更喜欢使用update,因为当我们使用现有模型时更有意义。

在用户身份界面中(高级常见\ 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();
        }
    }
}

答案 2 :(得分:0)

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

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

}