我正在使用PHPMailer发送带有可选附件的电子邮件。 发送带有附件的电子邮件时,此方法工作正常。 但是问题是PHPmailer在附件为空时拒绝发送电子邮件,有任何解决方法吗?
<?php
use PHPMailer\PHPMailer\PHPMailer;
$msg = '';
$sender_name = $_POST['sender_name'];
// Upload handled successfully
// Now create a message
require 'vendor/autoload.php';
$mail = new PHPMailer;
$mail->setFrom('info@*****.com', 'first last');
$mail->addAddress('info@*****.com');
$mail->Subject = 'PHPMailer file sender';
$mail->Body = "Contact form submission:\n" . "Name: $sender_name\n";
if (array_key_exists('userfile', $_FILES)) {
// First handle the upload
// Don't trust provided filename - same goes for MIME types
// See http://php.net/manual/en/features.file-upload.php#114004 for more thorough upload validation
$uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile']['name']));
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
// Attach the uploaded file
//$mail->addAttachment($uploadfile, 'My uploaded file');
$name = $_FILES['userfile']['name'];
$ext = end((explode(".", $name)));
$mail->addAttachment($uploadfile, 'You Have Attachment.'.$ext);
} else {
$msg .= 'Failed to move file to ' . $uploadfile;
}
}
if (!$mail->send()) {
$msg .= "Mailer Error: " . $mail->ErrorInfo;
} else {
$msg .= "Message sent!";
}
?>
这是位于PHP代码下的html女巫:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>PHPMailer Upload</title>
</head>
<body>
<?php if (empty($msg)) { ?>
<form method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
<br>
<input type="text" name="sender_name">
<br>
Send this file: <input name="userfile" type="file">
<br>
<input type="submit" value="Send File">
</form>
<?php } else {
echo $msg;
} ?>
</body>
</html>
答案 0 :(得分:1)
您整个脚本的实际发送位置取决于是否存在文件yes或no。这由脚本顶部的if语句处理。我建议进行编辑,以便始终发送电子邮件,并且仅在文件为是或否时才添加文件。但是由于我在移动设备上,所以我不知道编辑建议是否通过。
答案 1 :(得分:1)
我会重写它,就像这样:
// Now create a message
require 'vendor/autoload.php';
//$mail->AllowEmpty = true;
$mail = new PHPMailer;
$mail->setFrom('info@*****.com', 'first last');
$mail->addAddress('info@*****.com');
$mail->Subject = 'PHPMailer file sender';
$mail->Body = "Contact form submission:\n" . "Name: $sender_name\n";
if (array_key_exists('userfile', $_FILES) && $_FILES["userfile"]["error"] == UPLOAD_ERR_OK) {
// First handle the upload
// Don't trust provided filename - same goes for MIME types
// See http://php.net/manual/en/features.file-upload.php#114004 for more thorough upload validation
$uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile']['name']));
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
// Upload handled successfully
// Attach the uploaded file
//$mail->addAttachment($uploadfile, 'My uploaded file');
$name = $_FILES['userfile']['name'];
$ext = end((explode(".", $name)));
$mail->addAttachment($uploadfile, 'You Have Attachment.'.$ext);
} else {
$msg .= 'Failed to move file to ' . $uploadfile;
}
}
if (!$mail->send()) {
$msg .= "Mailer Error: " . $mail->ErrorInfo;
} else {
$msg .= "Message sent!";
}
通过这种方式,它将发送电子邮件,并且如果有文件附件,它将包含在内。
答案 2 :(得分:1)
它是这样工作的,现在它发送带有/不带有附件的电子邮件,我还更改了许多内容,例如发件人姓名和电子邮件,将其作为变量和正文内容。现在,我没有任何PHP错误,并且该表单可以按我希望的那样完美地工作,我希望这会对某人有所帮助,谢谢大家。
<?php
use PHPMailer\PHPMailer\PHPMailer;
$msg = '';
if (array_key_exists('userfile', $_FILES)) {
require 'vendor/autoload.php';
// Create a message
$mail = new PHPMailer;
$mail->SetFrom($_POST['email'], $_POST['sender_name']); //altered
$mail->addAddress('info@***.com');
$mail->Subject = 'Service Request';
$mail->Body = "Sender: " .$_POST['sender_name'] ."\n" ."Phone: " .$_POST['phone']; //altered
//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);
}
}
if (!$mail->send()) {
$msg .= "Mailer Error: " . $mail->ErrorInfo;
} else {
$msg .= "Message sent!";
}
}
?>