使用 PHP 的邮件正文中的 MIME 信息

Posted

技术标签:

【中文标题】使用 PHP 的邮件正文中的 MIME 信息【英文标题】:MIME info in mail body with PHP 【发布时间】:2012-12-10 22:19:50 【问题描述】:

我一直在尝试使用 php Mail 功能来发送带有 html 正文和附件的电子邮件。如果没有附加文件,我可以毫无问题地收到我的 HTML 电子邮件,但是当我尝试附加文件时,我的正文中包含所有 MIME 信息 - 以及附件,已编码。

这是不带附件的电子邮件功能的代码 - 效果很好:

        $this->to = $to;
        $this->subject = $subject;
        $this->message = $message;
        $this->headers = "From: " . Mailer::FROM_EMAIL . "\r\n";
        $this->headers .= "MIME-Version: 1.0\r\n";
        $this->headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

这是带有附件的电子邮件版本的代码:

        $this->to = $to;
        $this->subject = $subject;
        $this->attachment = 
                chunk_split(base64_encode(file_get_contents($attachment)));        

        //create a boundary string. It must be unique 
        //so we use the MD5 algorithm to generate a random hash        
        $boundary = md5(date('r', time()));                
        $this->headers = "From: webmaster@example.com\r\nReply-To: webmaster@example.com\r\n";        
        $this->headers .= "MIME-Version: 1.0\r\n ";
        $this->headers .= "Content-Type: multipart/mixed; boundary=\"PHP-mixed-$boundary\"\r\n"; 

        $this->message =    
"--PHP-mixed-$boundary
Content-Type: text/html; charset=\"ISO-8859-1\"

" . $message . "


--PHP-mixed-$boundary
Content-Type: application/pdf; name=\"test.pdf\" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

".$this->attachment ."
--PHP-mixed-$boundary--";

我正在使用此功能发送电子邮件:

public function send()

    if (preg_match(Mailer::PATTERN, trim(strip_tags($this->to))))  
        $cleanedTo = trim(strip_tags($this->to)); 
     else  
        return FALSE; 
                     
    return mail ($cleanedTo, $this->subject, $this->message, $this->headers); 

我创建 Mailer 对象如下:

$mailer = new Mailer("youremail@gmail.com", "test mail", "Some <b>old good</b> HTML email", 'pdf/test.pdf');
//$mailer = new Mailer("youremail@gmail.com", "test mail", "Some <b>old good</b> HTML email");

$mailer->send();

我收到的电子邮件是:

--PHP-mixed-e37929b72bbc6f8e3b37cf802619aac1
Content-Type: text/html; charset="ISO-8859-1"

Some <b>old good</b> HTML email


--PHP-mixed-e37929b72bbc6f8e3b37cf802619aac1
Content-Type: application/pdf; name="test.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment

JVBERi0xLjMKMSAwIG9iago8 ... FT0YK

--PHP-mixed-e37929b72bbc6f8e3b37cf802619aac1--

我想我真的很接近答案了,但是......我需要你的帮助才能找到它。

【问题讨论】:

【参考方案1】:

使用这个标题:

Content-Type:multipart/mixed;

我也建议看到这个class

【讨论】:

感谢您的回答!事实上,我正在使用这个标题,你可以在下面看到: "$this->headers .= "Content-Type: multipart/mixed;边界=\"PHP-mixed-$boundary\"\r\n";" 我使用了this,效果很好。我认为还有另一个问题。你检查class了吗? 谢谢,梅萨姆!那门课也对我有用。但是,我仍然有兴趣知道我以前的代码有什么问题,因为我花了很多时间试图让它工作,当这种情况发生并且我无法解决问题时我讨厌它。 :-(【参考方案2】:
$this->headers .= "MIME-Version: 1.0\r\n ";
$this->headers .= "Content-Type: multipart/mixed; boundary=\"PHP-mixed-$boundary\"\r\n"; 

删除 MIME-Version 行中换行符后的空格。 Content-Type 前面的这个尾随空格将使其成为前一行的延续。

顺便说一句:如果您的代码在 Linux/Unix 上运行,则仅在每行末尾使用“\n”。

【讨论】:

谢谢,Hägar!...问题是我已经改变了一些功能,现在它只适用于 gmail...它让我发疯:-(

以上是关于使用 PHP 的邮件正文中的 MIME 信息的主要内容,如果未能解决你的问题,请参考以下文章

PHP Mail_Mime:如何在电子邮件正文中正确使用 encodeHeader()

Python-解析电子邮件正文并截断 MIME 标头

在电子邮件中注入 PHP 以添加标题?

如何将 Internet mime 消息的所有内容复制到 Notes 中的正文项?

使用 MYSQL db 中的正文通过 PHP 发送电子邮件并解析 \n

Perl 使用 MIME::Parser 解析没有部分的电子邮件正文