纯文本/ HTML电子邮件在mac邮件客户端中不起作用

时间:2022-11-28 18:16:17

The code below is the code i am using. It works fine in thunderbird but not in mac mail client (and i assume anything made by microsoft. I currently do not have access to this to test it in). Much as i am aware of the idiosyncrasies of the various mail clients, I am flummoxed by this! It's fairly self explanatory but i am trying to send plain text and html emails to increase the readership. Any help would be much appreciated.

下面的代码是我正在使用的代码。它在雷鸟中运行良好,但在mac邮件客户端却没有(我假设微软发布了任何东西。我目前无法访问它来测试它)。就像我知道各种邮件客户端的特性一样,我对此感到茫然!这是相当自我解释,但我试图发送纯文本和HTML电子邮件,以增加读者群。任何帮助将非常感激。

EDIT

I should have clarified that the contents get sent regardless but in thunderbird it displays the message correctly, but in mac mail client you get the entire thing from the first PHP-alt to the last PHP

我应该澄清一下,内容会被发送,但是在thunderbird中它会正确地显示消息,但在mac mail客户端中,你可以从第一个PHP-alt到最后一个PHP获得整个内容。

<?php
//define the receiver of the email
$to = 'youraddress@example.com';
//define the subject of the email
$subject = 'Test HTML email';
//create a boundary string. It must be unique
//so we use the MD5 algorithm to generate a random hash
$random_hash = md5(date('r', time()));
//define the headers we want passed. Note that they are separated with \r\n
$headers = "From: webmaster@example.com\r\nReply-To: webmaster@example.com";
//add boundary string and mime type specification
$headers .= "\r\nContent-Type: multipart/alternative; boundary=\"PHP-alt-".$random_hash."\"";
//define the body of the message.
ob_start(); //Turn on output buffering
?>
--PHP-alt-<?php echo $random_hash; ?> 
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

Hello World!!! 
This is simple text email message. 

--PHP-alt-<?php echo $random_hash; ?> 
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

<h2>Hello World!</h2>
<p>This is something with <b>HTML</b> formatting.</p>

--PHP-alt-<?php echo $random_hash; ?>--
<?
//copy current buffer contents into $message variable and delete current output buffer
$message = ob_get_clean();
//send the email
$mail_sent = @mail( $to, $subject, $message, $headers );
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed" 
echo $mail_sent ? "Mail sent" : "Mail failed";
?>

2 个解决方案

#1


3  

Rather than try and roll your own mailer, try e.g. PHPMailer. It has very good support for multipart/alternative. It's much easier to integrate this than to roll your own solution. I've been there - after working endlessly around strange MIME problems, I've dropped my hand-made mailer, switched to this, and focused on other things in the time I've spared.

而不是尝试滚动自己的邮件,尝试例如PHPMailer的。它对多部件/替代品有很好的支持。集成它比滚动自己的解决方案要容易得多。我一直在那里 - 在无休止地解决奇怪的MIME问题后,我放弃了手工制作的邮件,切换到这个,并在我幸免的时候专注于其他事情。

In other words, don't reinvent the wheel. Although doing it yourself can be a good challenge and you'll learn a lot during the process, if you just want it to work, these guys have dealt with the complexity for you.

换句话说,不要重新发明*。虽然自己做这件事可能是一个很好的挑战,而且你会在这个过程中学到很多东西,如果你只是想让它发挥作用,这些人已经为你处理了复杂性。

#2


0  

You're not using output buffering correctly - see man page for ob_end_clean to see that it doesn't return the captured output, you need ob_get_contents for that:

您没有正确使用输出缓冲 - 请参阅ob_end_clean的手册页以查看它没有返回捕获的输出,您需要ob_get_contents:

$message =ob_get_contents();
ob_end_clean();

#1


3  

Rather than try and roll your own mailer, try e.g. PHPMailer. It has very good support for multipart/alternative. It's much easier to integrate this than to roll your own solution. I've been there - after working endlessly around strange MIME problems, I've dropped my hand-made mailer, switched to this, and focused on other things in the time I've spared.

而不是尝试滚动自己的邮件,尝试例如PHPMailer的。它对多部件/替代品有很好的支持。集成它比滚动自己的解决方案要容易得多。我一直在那里 - 在无休止地解决奇怪的MIME问题后,我放弃了手工制作的邮件,切换到这个,并在我幸免的时候专注于其他事情。

In other words, don't reinvent the wheel. Although doing it yourself can be a good challenge and you'll learn a lot during the process, if you just want it to work, these guys have dealt with the complexity for you.

换句话说,不要重新发明*。虽然自己做这件事可能是一个很好的挑战,而且你会在这个过程中学到很多东西,如果你只是想让它发挥作用,这些人已经为你处理了复杂性。

#2


0  

You're not using output buffering correctly - see man page for ob_end_clean to see that it doesn't return the captured output, you need ob_get_contents for that:

您没有正确使用输出缓冲 - 请参阅ob_end_clean的手册页以查看它没有返回捕获的输出,您需要ob_get_contents:

$message =ob_get_contents();
ob_end_clean();