首页 > 解决方案 > 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.0\n" .
"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.\n\n" .
"--{$mime_boundary}\n" .
"Content-Type:text/html; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$email_message .= "\n\n";


$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: base64\n\n" .
$strContent  .= "\n\n" .
"--{$mime_boundary}--\n";
}
$toemail="email@somedomain.com"; 

if(mail($toemail, $subject, $email_message, $headers)){
echo "Email sent.";
}else{

echo "Email NOT sent.";
}

?>

/*** 更新 ***/

好的,考虑到 PHPMailer 是一种更好的发送电子邮件的方法,我再次尝试设置 PHPMailer。

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

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

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

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 错误

这是什么原因造成的?

标签: phpemail

解决方案


您的 strcontent 看起来有些奇怪(他错过了第 39 行的 $ )但是要更简单,请使用PhpMailer

发送邮件让您的生活更轻松


推荐阅读