问题描述
我将用一个非常基本的例子再试一次.当我使用 PHP 向电子邮件客户端发送电子邮件时,除了 gmail,我没有任何问题.当我在 gmail 中查看电子邮件时,我看到的只是邮件的代码.Gmail 不显示 HTML.它只是显示代码.这是我的脚本:
I am going to try this one more time with a very basic example. When I send an e-mail using PHP to e-mail clients, I have no problem except with gmail. When I view the e-mail in gmail, all I see is the code of the message. Gmail does not display the HTML. It just displays the code. Here is my script:
<?php
$to = "[email protected]";
$subject = "Test HTML E-mail";
$random_hash = md5(date("r", time()));
$mID = md5($to);
$headers = "From: [email protected]" . "
" . "Reply-To: [email protected]" . "
";
$headers .= "Errors-To: [email protected]" . "
";
$headers .= "MIME-Version: 1.0" . "
";
$headers .= "Content-Type: multipart/alternative; boundary=". $random_hash ." ; Message-ID: <" . $mID . ">" . "
";
ob_start();
?>
--<?php echo $random_hash; ?>
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Hello, Tom!!!
This is simple text email message.
--<?php echo $random_hash; ?>
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 7bit
<!doctype html>
<head>
<title>Untitled Document</title>
</head>
<body>
<h2>Hello, Tom!</h2>
<p>This is something with <strong>HTML</strong> formatting.</p>
</body>
</html>
--<?php echo $random_hash; ?>--
<?php
$message = ob_get_clean();
$mail_sent = @mail( $to, $subject, $message, $headers );
echo $mail_sent ? "Mail sent" : "Mail failed";
?>
我试过这个没有 DOCTYPE 和 DOCTYPE 的脚本.我不相信 HTML 有什么问题.我相信 gmail 出于某种原因无法识别边界字符串.这是我打开电子邮件时看到的内容:
I have tried this script without the DOCTYPE and with the DOCTYPE. I do not believe there is anything wrong with the HTML. I believe gmail is not recognizing the boundary string for some reason. Here is what I see when I open the e-mail:
--111f3d21df6a6eb40a42e9337a600c21
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Hello, Tom!!!
This is simple text email message.
--111f3d21df6a6eb40a42e9337a600c21
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 7bit
<!doctype html>
<head>
<title>Untitled Document</title>
</head>
<body>
<h2>Hello, Tom!</h2>
<p>This is something with <strong>HTML</strong> formatting.</p>
</body>
</html>
--111f3d21df6a6eb40a42e9337a600c21--
谁能请告诉我为什么 gmail 会呈现整个消息而不是对 HTML 进行编码?好像gmail无法识别边界字符串.我该如何解决这个问题?
Can anyone PLEASE tell me why gmail is rendering the whole message and not encoding the HTML? It is as if gmail does not recognize the boundary string. How do I fix this?
顺便说一句,是的,这是我在互联网上找到的一个基本的 PHP 电子邮件脚本.我做了一些修改,但它仍然无法在 gmail 中工作.所有其他电子邮件客户端都可以正常显示.请帮忙!我无计可施.谢谢.
As a side note, yes, this is a basic PHP e-mail script I found on the internet. I have made a few modifications, but it is still not working in gmail. All other e-mail clients render it fine. PLEASE HELP! I am at my wit's end. Thank you.
当我在 Fred -ii- 提交的代码示例中添加 $headers 行时,gmail 呈现了 HTML,但它仍然显示边界字符串和纯文本消息.这就是电子邮件的样子:
When I added the $headers line in the code example right below that was submitted by Fred -ii-, gmail rendered the HTML, but it still shows the boundary string and the plain text message also. This is what the e-mail looks like:
我希望结果是正确的.
推荐答案
Edit #4
这是另一个不错的版本,似乎更易于使用:
Edit #4
Here is another good version and seems easier to work with:
<?php
//define the receiver of the email
$to = '[email protected]';
//define the subject of the email
$subject = 'Test HTML email';
// Generate a random boundary string
$mime_boundary = '_x'.sha1(time()).'x';
// Using the heredoc syntax to declare the headers
$headers = <<<HEADERS
From: Test <[email protected]>
MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary="PHP-alt$mime_boundary"
HEADERS;
// Use our boundary string to create plain text and HTML versions
$message = <<<MESSAGE
--PHP-alt$mime_boundary
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
This Is a Plain Text Email
This message has no HTML. http://www.google.com
--PHP-alt$mime_boundary
Content-type: text/html; charset=iso-8859-1
Content-Transfer-Encoding: 7bit
<html>
<body>
<h1>This Is an HTML Email</h1>
<p>
This message is composed in <a href="http://www.google.com">GOOGLE, click here</a>.
</p>
</body>
</html>
--PHP-alt$mime_boundary--
MESSAGE;
// Send the message
if(!mail($to, $subject, $message, $headers))
{
// If the mail function fails, return an error message
echo "Something went wrong!";
}
else
{
// Return a success message if nothing went wrong
echo "Message sent successfully. Check your email!";
}
?>
编辑 3
另一种经过测试的方法:(目前为止更好的方法)
Edit 3
Another tested method: (which so far is the better method)
<?php
function send_email(
$to='[email protected]',
$from='[email protected]',
$subject='test',
$html_content='<b>HELLO in HTML bold</b>',
$text_content='Hi there in plain text',
$headers='')
{
# Setup mime boundary
$mime_boundary = 'Multipart_Boundary_x'.md5(time()).'x';
$headers = "MIME-Version: 1.0
";
$headers .= "Content-Type: multipart/alternative; boundary="$mime_boundary"
";
$headers .= "Content-Transfer-Encoding: 7bit
";
$body = "This is a multi-part message in mime format.
";
# Add in plain text version
$body .= "--$mime_boundary
";
$body .= "Content-Type: text/plain; charset="charset=us-ascii"
";
$body .= "Content-Transfer-Encoding: 7bit
";
$body .= $text_content;
$body .= "
";
# Add in HTML version
$body .= "--$mime_boundary
";
$body .= "Content-Type: text/html; charset="UTF-8"
";
$body .= "Content-Transfer-Encoding: 7bit
";
$body .= $html_content;
$body .= "
";
# Attachments would go here
# But this whole email thing should be turned into a class to more logically handle attachments,
# this function is fine for just dealing with html and text content.
# End email
$body .= "--$mime_boundary--
"; # <-- Notice trailing --, required to close email body for mime's
# Finish off headers
$headers .= "From: $from
";
$headers .= "X-Sender-IP: $_SERVER[SERVER_ADDR]
";
$headers .= 'Date: '.date('n/d/Y g:i A')."
";
# Mail it out
return mail($to, $subject, $body, $headers);
}
send_email(); // call the function
?>
编辑 2
这行得通,并且只在 Gmail 中以 HTML 格式显示,所以理论上纯文本应该可以工作.
Edit 2
This worked, and only showed me in HTML in Gmail, so plain text should theoretically work.
<?php
$notice_text = "This is a multi-part message in MIME format.";
$plain_text = "This is a plain text email.
It is very cool.";
$html_text = "<html><body>This is an <b style='color:purple'>HTML</b>" .
"text email.
It is very cool.</body></html>";
$semi_rand = md5(time());
$mime_boundary = "==MULTIPART_BOUNDARY_$semi_rand";
$mime_boundary_header = chr(34) . $mime_boundary . chr(34);
$to = "Me <[email protected]>";
// $bcc = "You <[email protected]>, Them <[email protected]>";
$from = "Him <[email protected]>";
$subject = "My Email";
$body = "$notice_text
--$mime_boundary
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
$plain_text
--$mime_boundary
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit
$html_text
--$mime_boundary--";
if (@mail($to, $subject, $body,
"From: " . $from . "
" .
"bcc: " . $bcc . "
" .
"MIME-Version: 1.0
" .
"Content-Type: multipart/alternative;
" .
" boundary=" . $mime_boundary_header))
echo "Email sent successfully.";
else
echo "Email NOT sent successfully!";
?>
编辑 1
试试这个版本:(测试没有任何额外的代码)
Edit 1
Try this version: (tested with no additional codes anywhere)
<?php
$to = "[email protected]";
$subject = "Test HTML E-mail";
$headers = "From: [email protected]" . "
" . "Reply-To: [email protected]" . "
";
$headers .= "MIME-Version: 1.0
";
//unique boundary
$boundary = uniqid("HTMLDEMO");
//tell e-mail client this e-mail contains//alternate versions
$headers .= "Content-Type: multipart/mixed; boundary = $boundary
";
//plain text version of message
$body = "--$boundary
" .
"Content-Type: text/plain; charset=ISO-8859-1
" .
"Content-Transfer-Encoding: base64
";
$body .= chunk_split(base64_encode("
Hello, Tom!!!
This is simple text email message.
"));
//HTML version of message
$body .= "--$boundary
" .
"Content-Type: text/html; charset=ISO-8859-1
" .
"Content-Transfer-Encoding: base64
";
$body .= chunk_split(base64_encode("
<!doctype html>
<head>
<title>Untitled Document</title>
</head>
<body>
<h2>Hello, Tom!</h2>
<p>This is something with <strong>HTML</strong> formatting.</p>
</body>
</html>
"));
ob_start();
?>
<?php
$message = ob_get_clean();
$mail_sent = mail( $to, $subject, $body, $headers );
echo $mail_sent ? "Mail sent" : "Mail failed";
?>
您需要在初始标题中使用以下内容:
You need to use the following in your initial headers:
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "
";
下面:
$headers .= "MIME-Version: 1.0" . "
";
根据 PHP.net 上的手册
已测试(以 HTML 而非代码的形式成功发送到我的 Gmail)
Tested (successfully sent to my Gmail in HTML and not as code)
<?php
$to = "[email protected]";
$subject = "Test HTML E-mail";
$random_hash = md5(date("r", time()));
$mID = md5($to);
$headers = "From: [email protected]" . "
" . "Reply-To: [email protected]" . "
";
$headers .= "Errors-To: [email protected]" . "
";
$headers .= "MIME-Version: 1.0" . "
";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "
";
$headers .= "Content-Type: multipart/alternative; boundary=". $random_hash ." ; Message-ID: <" . $mID . ">" . "
";
ob_start();
?>
// rest of code below...
这篇关于gmail 不会在电子邮件中呈现 html的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!