带有附件的HTML / PHP邮件显示为文本而不是HTML

时间:2016-06-24 10:52:16

标签: php email

我按照本教程(用法语,但你可以查看代码):https://openclassrooms.com/courses/e-mail-envoyer-un-e-mail-en-php

在第一部分中,(发送基本邮件)我没有遇到任何问题:我收到了两种格式的电子邮件(纯文本和HTML)。

但是当我继续第二部分(在发送的邮件中添加附件)时,我遇到了麻烦。我收到附加的PDF,mais邮件只能用文本阅读,而不能用HTML阅读。这对我来说是个问题。而且我觉得这令人不安。

我在互联网上查看,看到还有其他方法(使用库和类似的东西),但我有点“不想”。不要误解我的意思,我通常都渴望使用更简单的方法,而且我真的不喜欢重新发明轮子,但这是我的理由: - 我不想联系我的CTO来为我们的服务器实现库或新的功能 - 我不知道是否已经安装了库或扩展(我已经在这里工作了4个月,但我正在做其他任务而不是编码)。 - 现在它是个人的,我想知道为什么它不起作用(即使它可能是我的一个愚蠢的错误)

有问题的代码:

if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $mail)) // On filtre les serveurs qui rencontrent des bogues.
{
    $passage_ligne = "\r\n";
}
else
{
    $passage_ligne = "\n";
}

//=====Déclaration des messages au format texte et au format HTML.
$message_txt = "my text, nothing to see here";

$message_html = "my text in html, nothing to see here";
//==========

//=====Création de la boundary
$boundary = "-----=".md5(rand());
$boundary_alt = "-----=".md5(rand());


//==========

//=====Définition du sujet.
$sujet = utf8_decode("My subject");
//=========

//=====Création du header de l'e-mail.
$header = "From: \"Mail adress\"<adress@mail.com>".$passage_ligne;
$header.= "Reply-to: \"Mail adress\" <adress@mail.com>".$passage_ligne;
$header.= "MIME-Version: 1.0".$passage_ligne;
$header.= "Content-Type: multipart/mixed;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne;
//==========

//=====Création du message.
$message = $passage_ligne."--".$boundary.$passage_ligne;

$message.= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary_alt\"".$passage_ligne;

$message.= $passage_ligne."--".$boundary_alt.$passage_ligne;

//=====Ajout du message au format texte.
$message.= "Content-Type: text/plain; charset=\"UTF8\"".$passage_ligne;
$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
$message.= $passage_ligne.$message_txt.$passage_ligne;
//==========

$message.= $passage_ligne."--".$boundary_alt."--".$passage_ligne;

//=====Ajout du message au format HTML
$message.= "Content-Type: text/html; charset=\"UTF8\"".$passage_ligne;
$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
$message.= $passage_ligne.$message_html.$passage_ligne;
//==========

//=====On ferme la boundary alternative.

$message.= $passage_ligne."--".$boundary_alt."--".$passage_ligne;

//==========


// AJOUT DE L'EBOOK AU FORMAT PDF
$file_name = "myfile.pdf";
$file_type = filetype($file_name);
$file_size = filesize($file_name);

$fichier   = fopen($file_name, "r");   //on ouvre le fichier en lecture seule.
$attachement = fread($fichier, $file_size); //on lit l'ensemble du fichier avec la fonction fread.
$attachement = chunk_split(base64_encode($attachement));
fclose($fichier); //on ferme le fichier.

$message.= $passage_ligne."--".$boundary.$passage_ligne;

$message.= "Content-Type: ".$file_type."; name=".$file_name.$passage_ligne;
$message.= "Content-Transfer-Encoding: base64".$passage_ligne;
$message.= "Content-Disposition: attachment; filename=".$file_name.$passage_ligne.$passage_ligne;

$message.= $passage_ligne.$attachement.$passage_ligne.$passage_ligne;

$message.= $passage_ligne."--".$boundary."--".$passage_ligne;


//=====Envoi de l'e-mail.
if(mail($mail,$sujet,$message,$header)) echo "Mail correctement envoyé à l'adresse ".$mail.".";
    else echo "Le mail n'a pas pu être envoyé à l'adresse ".$mail.".";
//==========

所以这是代码。我检查过其他网站,我的代码应该可以工作,但是,它仍然没有。经过几个小时的工作和一个小小的头痛的诞生,我把命运放在你的手上。在此先感谢,祝你有个美好的一天。

PS:正如你猜想的那样,英语不是我的母语,所以我可能不会理解你答案中的所有内容!

1 个答案:

答案 0 :(得分:0)

第47行有错误(例如,发送text / html之前的行)。

当前版本

$message.= $passage_ligne."--".$boundary_alt."--".$passage_ligne;

应该是

$message.= $passage_ligne."--".$boundary_alt.$passage_ligne;

原因--$boundary_alt--将关闭multipart/alternative部分电子邮件。您的HTML部分将被忽略。在第47行,您需要指明仅结束text/plain部分,而不是整个multipart/alternative