2016-03-07 85 views
0

我需要发送批量电子邮件,并且每封邮件都有唯一的消息。我正在尝试foreach循环,但我不断收到允许内存大小104857600字节用尽(试图分配66字节)错误。 是否有可能使用swiftmailer执行foreach,或者有其他方法(消息包含唯一标记)。代码:Yii2 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('[email protected]') 
      ->setTo($userEmail) 
      ->setBcc(['[email protected]']) 
      ->setSubject('Sketchlist Account Activation') 
      ->send(); 
    } 
+0

有几件事情y你可能会这样做来产生这个错误。 也许你在创建大量的收件人时耗尽了内存。 ?尝试一次只收到一封电子邮件,而不是尝试一次所有电子邮件? – izk

回答

0

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

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

如果这不利于然后按照this post

0

我想告诉你我会怎么编写这一点。以防万一它帮助某人,因为这是一个旧的,没有答案的问题。

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

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

在用户IdentityInterface(COMMON \型号\ user.php的中晚期):

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

public function getToken() 
{ 
    return $this->token; 
} 

在你的控制器:

public function actionTest() 
{ 
    $emails = ['[email protected]', '[email protected]', '[email protected]']; 
    $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(['[email protected]' => 'Your Name']) 
       ->setTo($user->email) 
       ->setBcc(['[email protected]']) 
       ->setSubject('Sketchlist Account Activation') 
       ->send(); 
     } 
    } 
} 
0

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

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

}