PHP使用mail()-带有附件的电子邮件发送,但纯文本电子邮件不发送



我正在尝试使用PHP mail((从HTML表单发送带有附件的电子邮件。

我在网上找到了一个有效的脚本,但有一个问题:

如果在电子邮件中附加了一个文件,则脚本运行良好。但是,如果没有附件,则会发送电子邮件,但不包含任何文本内容(空白电子邮件正文(

我希望添加附件的功能是可选的。

我的问题是,无论有没有附件,如何才能成功发送电子邮件?

谢谢!

我使用的PHP脚本如下:

<?php
$email =  trim($_POST['email']);
$email_san = filter_var($email, FILTER_SANITIZE_EMAIL);
$fname = $_POST['first_name'];
$fname_san = filter_var($fname,FILTER_SANITIZE_STRING);
$lname = $_POST['last_name'];
$lname_san = filter_var($lname,FILTER_SANITIZE_STRING);
$org =  trim($_POST['organisation']);
$org_san =  filter_var($org,FILTER_SANITIZE_STRING);
$user_phone = $_POST['phone'];
$trim_phone = trim($user_phone);  
$replace_phone = preg_replace('/[^0-9+-]/', '', $trim_phone);
$phone_san = filter_var($replace_phone,FILTER_SANITIZE_NUMBER_INT);
$message = $_POST['message'];
$fromemail =  $email_san;
$subject="Inquiry";
$email_message = '<p><b>First Name:</b> '.$fname_san.'</p>
<p><b>Organisation:</b> '.$org_san.'</p>
<p><b>Email:</b> '.$email_san.'</p> 
<p><b>Phone:</b> '.$phone_san.'</p>                    
<p><b>Message:</b><br/>'.$message.'</p>';
$semi_rand = md5(uniqid(time()));
$headers = "From: ".$fromemail;
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
$headers .= "nMIME-Version: 1.0n" .
"Content-Type: multipart/mixed;n" .
" boundary="{$mime_boundary}"";
if($_FILES["file"]["name"]!= ""){  
$strFilesName = $_FILES["file"]["name"];  
$strContent = chunk_split(base64_encode(file_get_contents($_FILES["file"]["tmp_name"])));  

$email_message .= "This is a multi-part message in MIME format.nn" .
"--{$mime_boundary}n" .
"Content-Type:text/html; charset="iso-8859-1"n" .
"Content-Transfer-Encoding: 7bitnn" .
$email_message .= "nn";

$email_message .= "--{$mime_boundary}n" .
"Content-Type: application/octet-stream;n" .
" name="{$strFilesName}"n" .
//"Content-Disposition: attachment;n" .
//" filename="{$fileatt_name}"n" .
"Content-Transfer-Encoding: base64nn" .
$strContent  .= "nn" .
"--{$mime_boundary}--n";
}
$toemail="email@somedomain.com"; 
if(mail($toemail, $subject, $email_message, $headers)){
echo "Email sent.";
}else{
echo "Email NOT sent.";
}
?>

/***更新***/

好吧,根据PHPMailer是发送电子邮件的更好方法的建议,我再次尝试设置PHPMailler。

我没有Composer,所以我手动下载并安装了PHPMailer。我没有Composer,所以我手动下载并安装了PHPMailer。我的服务器文件夹层次结构如图所示。

我在网上找到了一个PHPMailer教程,其中提供了一个简单的脚本,我将其保存为"mailer test.php",上传并链接到我的PHPMailer安装:

<?php
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;
require_once "php-mailer/src/Exception.php";
//PHPMailer Object
$mail = new PHPMailer(true); //Argument 'true' in enables exceptions
//From email address and name
$mail->From = "me@mydomain.com";
$mail->FromName = "Full Name";
//To address and name
//$mail->addAddress("recipient@somedomain.com", "Recepient Name");
$mail->addAddress("recipient@somedomain.com"); //Recipient name is optional
//Address to which recipient will reply
$mail->addReplyTo("me@mydomain.com", "Reply");
//Send HTML or Plain Text email
$mail->isHTML(true);
$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";
try {
$mail->send();
echo "Message has been sent successfully";
} catch (Exception $e) {
echo "Mailer Error: " . $mail->ErrorInfo;
}
?>

然而,当我在浏览器中查看"mailer test.php"时,我会得到以下服务器错误:

此页面不工作。yourdomain.com当前无法处理此请求。HTTP错误

是什么原因造成的?

您的strcontent有点奇怪(他错过了第39行的$(但为了更简单,请使用PhpMailer类

它通过发送邮件让你的生活变得轻松

确保将enctype='multipart/form-data'添加到表单标签:

<form action='index.php' method='POST' enctype='multipart/form-data'>
...
</form>

最新更新