如何使用 PHPMailer 将多个文件附加到两个不同的电子邮件?
How to attach multiple files to two different e-mails using PHPMailer?
我正在使用 PHPMailer 向两个不同的收件人发送两封不同的电子邮件。我想附加用户上传到两封电子邮件的多个文件。
现在,多文件附件对于第一封邮件工作正常,但对于第二封邮件就不行了。
使用我当前的代码,文件仅附加到第一封邮件,但 none 附加到第二封邮件:
// First e-mail to recipient 1
$mail = new PHPMailer;
$mail->setFrom('example@example.com');
$mail->addAddress('recipient1@example.com');
$mail->Subject = 'Subject';
$mail->isHTML(true);
$mail->Body = '...';
// Attach multiple files one by one
for ($ct = 0; $ct < count($_FILES['userfile']['tmp_name']); $ct++) {
$uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile']['name'][$ct]));
$filename = $_FILES['userfile']['name'][$ct];
if (move_uploaded_file($_FILES['userfile']['tmp_name'][$ct], $uploadfile)) {
$mail->addAttachment($uploadfile, $filename);
} else {
$msg .= 'Failed to move file to ' . $uploadfile;
}
}
$mail->send(); // I only wrote this once because as it turns out, it sends both of the mails
// Second e-mail to recipient 2
$mail = new PHPMailer;
$mail->setFrom('example@example.com');
$mail->addAddress('recipient2@example.com');
$mail->Subject = 'Subject';
$mail->isHTML(true);
$mail->Body = '...';
// Attach multiple files one by one
for ($ct = 0; $ct < count($_FILES['userfile']['tmp_name']); $ct++) {
$uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile']['name'][$ct]));
$filename = $_FILES['userfile']['name'][$ct];
if (move_uploaded_file($_FILES['userfile']['tmp_name'][$ct], $uploadfile)) {
$mail->addAttachment($uploadfile, $filename);
} else {
$msg .= 'Failed to move file to ' . $uploadfile;
}
}
然后我尝试不将整个函数复制到两个邮件中,而只是添加
$mail->addAttachment($uploadfile, $filename);
发送到第二封电子邮件。但是,这只会添加第一个给定的文件,复制此行会使同一文件发送两次。
知道如何将多个(在我的例子中是 3 个)文件附加到两封不同的电子邮件吗?
您在发送第一封邮件时将上传的文件从临时存储中移走,因此在第二次尝试时它们不再存在。
move_uploaded_file($_FILES['userfile']['tmp_name'][$ct], $uploadfile)
需要先移动上传的文件,然后再使用变量$uploadfile
两次
你真的应该把所有这些都放在一个函数中,这样你就不会重复自己了。
我是这样解决问题的:
// First e-mail to recipient 1
$mail = new PHPMailer;
$mail->setFrom('example@example.com');
$mail->addAddress('recipient1@example.com');
$mail->Subject = 'Subject';
$mail->isHTML(true);
$mail->Body = '...';
// Attach multiple files one by one
for ($ct = 0; $ct < count($_FILES['userfile']['tmp_name']); $ct++) {
$uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile']['name'][$ct]));
$filename = $_FILES['userfile']['name'][$ct];
if (move_uploaded_file($_FILES['userfile']['tmp_name'][$ct], $uploadfile)) {
$mail->addAttachment($uploadfile, $filename);
} else {
$msg .= 'Failed to move file to ' . $uploadfile;
}
}
// Altered e-mail to recipient 2
$mail->ClearAddresses(); // avoid recipient 1 getting this altered mail
$mail->addAddress('recipient2@example.com');
$mail->Subject = 'New subject overwriting the first one';
$mail->Body = 'New body overwriting the first one';
$mail->send(); // send both mails
这样一来,同一封邮件基本上被发送了两次,包括附件,但通过覆盖e进行了一些更改。 G。主题和正文。
我正在使用 PHPMailer 向两个不同的收件人发送两封不同的电子邮件。我想附加用户上传到两封电子邮件的多个文件。
现在,多文件附件对于第一封邮件工作正常,但对于第二封邮件就不行了。
使用我当前的代码,文件仅附加到第一封邮件,但 none 附加到第二封邮件:
// First e-mail to recipient 1
$mail = new PHPMailer;
$mail->setFrom('example@example.com');
$mail->addAddress('recipient1@example.com');
$mail->Subject = 'Subject';
$mail->isHTML(true);
$mail->Body = '...';
// Attach multiple files one by one
for ($ct = 0; $ct < count($_FILES['userfile']['tmp_name']); $ct++) {
$uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile']['name'][$ct]));
$filename = $_FILES['userfile']['name'][$ct];
if (move_uploaded_file($_FILES['userfile']['tmp_name'][$ct], $uploadfile)) {
$mail->addAttachment($uploadfile, $filename);
} else {
$msg .= 'Failed to move file to ' . $uploadfile;
}
}
$mail->send(); // I only wrote this once because as it turns out, it sends both of the mails
// Second e-mail to recipient 2
$mail = new PHPMailer;
$mail->setFrom('example@example.com');
$mail->addAddress('recipient2@example.com');
$mail->Subject = 'Subject';
$mail->isHTML(true);
$mail->Body = '...';
// Attach multiple files one by one
for ($ct = 0; $ct < count($_FILES['userfile']['tmp_name']); $ct++) {
$uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile']['name'][$ct]));
$filename = $_FILES['userfile']['name'][$ct];
if (move_uploaded_file($_FILES['userfile']['tmp_name'][$ct], $uploadfile)) {
$mail->addAttachment($uploadfile, $filename);
} else {
$msg .= 'Failed to move file to ' . $uploadfile;
}
}
然后我尝试不将整个函数复制到两个邮件中,而只是添加
$mail->addAttachment($uploadfile, $filename);
发送到第二封电子邮件。但是,这只会添加第一个给定的文件,复制此行会使同一文件发送两次。
知道如何将多个(在我的例子中是 3 个)文件附加到两封不同的电子邮件吗?
您在发送第一封邮件时将上传的文件从临时存储中移走,因此在第二次尝试时它们不再存在。
move_uploaded_file($_FILES['userfile']['tmp_name'][$ct], $uploadfile)
需要先移动上传的文件,然后再使用变量$uploadfile
两次
你真的应该把所有这些都放在一个函数中,这样你就不会重复自己了。
我是这样解决问题的:
// First e-mail to recipient 1
$mail = new PHPMailer;
$mail->setFrom('example@example.com');
$mail->addAddress('recipient1@example.com');
$mail->Subject = 'Subject';
$mail->isHTML(true);
$mail->Body = '...';
// Attach multiple files one by one
for ($ct = 0; $ct < count($_FILES['userfile']['tmp_name']); $ct++) {
$uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile']['name'][$ct]));
$filename = $_FILES['userfile']['name'][$ct];
if (move_uploaded_file($_FILES['userfile']['tmp_name'][$ct], $uploadfile)) {
$mail->addAttachment($uploadfile, $filename);
} else {
$msg .= 'Failed to move file to ' . $uploadfile;
}
}
// Altered e-mail to recipient 2
$mail->ClearAddresses(); // avoid recipient 1 getting this altered mail
$mail->addAddress('recipient2@example.com');
$mail->Subject = 'New subject overwriting the first one';
$mail->Body = 'New body overwriting the first one';
$mail->send(); // send both mails
这样一来,同一封邮件基本上被发送了两次,包括附件,但通过覆盖e进行了一些更改。 G。主题和正文。