PHP - 发送带附件的电子邮件不显示邮件内容

Posted

技术标签:

【中文标题】PHP - 发送带附件的电子邮件不显示邮件内容【英文标题】:PHP - sending email with attachment does not show message content 【发布时间】:2015-08-29 08:39:09 【问题描述】:

尝试创建一个脚本,我可以在其中发送带有附件的电子邮件。一切正常,除了当我不在电子邮件中添加文件时,我仍然可以看到一个 0B 且没有名称的附件。

if(isset($_POST["my_send"]))


    $email_to = $_POST['my_email_to']; //required

    $email_from = "myemail@example.co.uk"; // required

    $subject = $_POST['my_subject']; // not required

    $comments = $_POST['write_my_email']; // required

    $email_message .= stripcslashes("$comments");

    $attachment = chunk_split(base64_encode(file_get_contents($_FILES['file']['tmp_name'])));
    $filename = $_FILES['file']['name'];

// create email headers

$headers = 'From: '.$email_from."\r\n".
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"_1_$boundary\"\r\n";

'Reply-To: '.$email_from."\r\n" .

'X-Mailer: php/' . phpversion();

$message="This is a multi-part message in MIME format.

--_1_$boundary
Content-Type: multipart/alternative; boundary=\"_2_$boundary\"

--_2_$boundary
Content-Type: text/plain; charset=\"iso-8859-1\"
Content-Transfer-Encoding: 7bit

$email_message

--_2_$boundary--
--_1_$boundary
Content-Type: application/octet-stream; name=\"$filename\" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

$attachment
--_1_$boundary--";


mail($email_to, $subject, $message, $headers);  


        echo "<h5>Thanks, your email was sent successfully!</h5>";


我做错了什么?有什么建议吗?

【问题讨论】:

在没有附件时更改标题类型 顺便说一句,如果你想包含带双引号的多行字符串,为什么不使用heredoc?它使写入和读取字符串变得更加容易。 【参考方案1】:

如果您想发送带有附件的电子邮件,我建议您使用PHP-Mailer 库。它会让你的生活更轻松。

您需要做的就是包含该类并实例化PHPMailer Object

<?php
require 'PHPMailerAutoload.php';
$mail = new PHPMailer;
//And you will need to set properties for the object
?>

查看此PHP-Mailer Github Link。他们还给出了一个简单的例子来说明如何实现

【讨论】:

如果使用 PHP 内置的 mail() 函数完全有可能,是否真的需要外部库? mail() 函数只适用于简单的东西。邮件库对用户隐藏了许多低级内容,并提供了制作 html 电子邮件、邮件中嵌入图像等的简单方法。【参考方案2】:

没有附件的时候就排除这个:

--_1_$boundary
Content-Type: application/octet-stream; name=\"$filename\" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

$attachment
--_1_$boundary--

例如,仅在文件名不为空时附加到$message

$message = "This is a multi-part message in MIME format.
    --_1_$boundary
    Content-Type: multipart/alternative; boundary=\"_2_$boundary\"

    --_2_$boundary
    Content-Type: text/plain; charset=\"iso-8859-1\"
    Content-Transfer-Encoding: 7bit

    $email_message";

if (!empty($filename))

   $message .= " --_1_$boundary
        Content-Type: application/octet-stream; name=\"$filename\" 
        Content-Transfer-Encoding: base64 
        Content-Disposition: attachment 

        $attachment
        --_1_$boundary--";

【讨论】:

【参考方案3】:
     $headers = array();
     $headers [] = 'MIME-Version: 1.0';
     $headers [] = 'Content-type: text/html; charset=utf-8';
     $headers [] = 'Reply-To: ' . $From;
     $headers [] = 'X-Mailer: PHP/' . phpversion();
     $headers [] = "Return-Path: " . $From;
     $headers [] = "Errors-To: " . $From;

     $header = implode("\r\n", $headers);
     $fifth = "-f $From";
     if (mail($empfaenger, $betreff, $Mailbody, $header, $fifth)) ;

我认为最后一个标题不应该以 '\r\n' 结尾。此代码由在手册中发布的人提供。查看手册,你会发现那里的代码很好。

【讨论】:

我怀疑 return 或 newline 会导致这样的问题。应该没关系。

以上是关于PHP - 发送带附件的电子邮件不显示邮件内容的主要内容,如果未能解决你的问题,请参考以下文章

PHP邮件功能html内容在电子邮件中不可见

Python SMTP 发送带附件电子邮件

使用 python 3.7.3 发送带附件的电子邮件

PHP pdf 电子邮件附件,内容类型:多部分/混合,html 消息未显示

Drupal 7 发送不带附件的电子邮件

Word邮件合并不能发送HTML格式以及怎么带附件?