php中连续发送带有excel附件的邮件时,foreach循环第二次会把第一次的excel文件一起发送,第三次时会把第一次和第二次的excel文件一起发送
时间: 2024-09-11 16:11:36 浏览: 31
php判断上传的Excel文件中是否有图片及PHPExcel库认识
这种情况通常是由于在PHP脚本中错误地处理了文件句柄或者附件头信息导致的。在使用`mail`函数或者PHPMailer等邮件处理库连续发送邮件时,如果在`foreach`循环中没有正确地关闭或者重置文件句柄,那么在循环的下一次迭代中,附件的文件描述符可能会指向相同的文件,导致累积发送之前的所有附件。
为了确保每次发送的邮件只包含当前迭代的附件,你需要在每次迭代的邮件发送代码执行完毕后关闭文件句柄,然后再进行下一次迭代。此外,确保在设置附件时,不要重复使用同一个文件名。
这里提供一个简化的代码示例,说明如何在`foreach`循环中正确地发送带有不同Excel附件的邮件:
```php
// 假设$emails是收件人邮箱数组,$file_paths是附件文件路径数组
foreach ($emails as $index => $email) {
// 创建邮件内容
$message = "这是邮件正文内容。";
// 设置邮件头部信息
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
$headers .= 'From: webmaster@example.com' . "\r\n";
// 设置邮件附件
$file = $file_paths[$index];
if (file_exists($file)) {
$headers .= "Content-Type: application/vnd.ms-excel; name=\"$file\"\r\n";
$headers .= "Content-Disposition: attachment; filename=\"$file\"\r\n";
$headers .= "X-Attachment-Id: " . basename($file) . "\r\n";
$headers .= 'Content-Transfer-Encoding: base64' . "\r\n\r\n";
// 读取文件内容并编码为base64
$data = chunk_split(base64_encode(file_get_contents($file)));
// 拼接邮件内容和附件数据
$message .= $data;
}
// 发送邮件
mail($email, '邮件主题', $message, $headers);
// 清空消息内容和头部信息,为下一次迭代做准备
$message = '';
$headers = '';
}
```
在上面的代码中,每次循环都会创建新的头部信息和消息内容,以确保不会有之前的附件信息遗留。同时,通过检查文件是否存在来避免在文件路径错误时导致的错误。
阅读全文