データベースからメール アドレスを取得し、それらのアドレスにメールを送信するアプリケーションを開発しています。私のスクリプトでは、最初に受信者を取得し、次にメッセージをディスクに保存し、しばらくして CRON を使用して送信します。スプール ディレクトリ内のメッセージの数は、受信者の数と一致します。問題は、一部の受信者が電子メールを 2 回受信することです。そして最も奇妙なことは、全員が電子メールを 2 回受信するわけではなく、700 人の受信者のうち 40 人だけであるということです。データベースをチェックして、一部のアドレスが重複していないかどうかを確認しましたが、そうではなく、スプールされたメッセージを送信するスクリプトにはループがありません。だから私はここでかなり迷っています。あなたが与えることができるどんな助けも素晴らしいでしょう. 前もって感謝します。メッセージを作成するコードは次のとおりです。
$spool = new Swift_FileSpool(__DIR__."/spool");
// Setup the transport and mailer
$transport = Swift_SpoolTransport::newInstance($spool);
$mailer = Swift_Mailer::newInstance($transport);
$result = array();
foreach($cliente as $cliente){
$archivo = explode("/", $cliente->pdf);
$correo = explode(";", $cliente->mail);
$message = Swift_Message::newInstance($asunto);
if(is_dir($directorio . "/" . $mes)){
$prueba[$x] = rename($cliente->pdf, $directorio . "/" . $mes . "/".$archivo[1]);
}
else{
mkdir($directorio . "/" . $mes, 0777);
chmod($directorio . "/" . $mes, 0777);
$prueba[$x] = rename($cliente->pdf, $directorio . "/" . $mes . "/" .$archivo[1]);
}
$fp=fopen("datos/clientes.txt","a") or die("No se pudo crear el archivo");
fwrite($fp, "$cliente->nombre,,$cliente->mail,,$cliente->pdf" . PHP_EOL);
fclose($fp);
if($prueba[$x]){
$copiados++;
}
else{
$errorcopiar[] = "No se ha podido cambiar de carpeta la factura correspondiente al cliente " . $cliente->nombre;
}
$cuerpo = "this is the message body";
//Se crea el mensaje sin archivo adjunto.
if (!$archivosubido){
$message->setFrom($origen);
$message->setReturnPath($returnpath);
$message->setTo($correo);
$message->setReplyTo($returnpath);
$message->setBody($cuerpo,
'text/html');
$message->attach(Swift_Attachment::fromPath($directorio . "/" . $mes . "/" .$archivo[1]));
}
//Se crea el mensaje con archivo adjunto.
else{
$message->setFrom($origen);
$message->setReturnPath($returnpath);
$message->setTo($correo);
$message->setBody($cuerpo,
'text/html');
$message->attach(Swift_Attachment::fromPath($directorio . "/" . $mes . "/" .$archivo[1]));
$message->attach(Swift_Attachment::fromPath('subidos/' . $archivosubido));
}
//Se envía el mensaje.
$result[$x] = $mailer->send($message);
$x++;
}
スプールされたメッセージを送信するコードは次のとおりです。
$spool = new Swift_FileSpool(__DIR__."/spool");
$transport = Swift_SpoolTransport::newInstance($spool);
$realtransport = Swift_SmtpTransport::newInstance($servidor,
25)
->setUsername($user)
->setPassword($password);
$spool = $transport->getSpool();
$spool->setMessageLimit(10000);
$spool->setTimeLimit(10000);
$sent = $spool->flushQueue($realtransport, $fallos);