drdyszuy488152 2014-02-20 02:55
浏览 155
已采纳

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 = "someone@gmail.com";
$subject = "Test HTML E-mail";
$random_hash = md5(date("r", time()));
$mID = md5($to);
$headers = "From: admin@yellowcas.com" . "
" . "Reply-To: admin@yellowcas.com" . "
";
$headers .= "Errors-To: someone@yahoo.com" . "
";
$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";
?>

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--

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?

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.

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:

--f8451c07b6649388e8938cfa12ea21e6 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 7bit Hello, Greg!!! This is simple text email message. --f8451c07b6649388e8938cfa12ea21e6 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: 7bit

Hello, Tom!

This is something with HTML formatting. --f8451c07b6649388e8938cfa12ea21e6--

I hope that comes out right.

  • 写回答

1条回答 默认 最新

  • dongweihuai5601 2014-02-20 03:04
    关注

    Edit #4

    Here is another good version and seems easier to work with:

    <?php
    //define the receiver of the email
    $to = 'email@example.com';
    //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@example.com>
    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!";
    }
    ?>
    

    Edit 3

    Another tested method: (which so far is the better method)

    <?php
    
    function send_email(
    
    $to='email@example.com', 
    $from='email@example.com', 
    $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
    ?>
    

    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@example.com>";
    // $bcc = "You <you@you.com>, Them <them@them.com>";
    $from = "Him <another@example.com>";
    $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!";
    
    ?>
    

    Edit 1

    Try this version: (tested with no additional codes anywhere)

    <?php
    $to = "someone@gmail.com";
    $subject = "Test HTML E-mail";
    
    $headers = "From: admin@yellowcas.com" . "
    " . "Reply-To: admin@yellowcas.com" . "
    ";
    $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' . "
    ";
    

    below:

    $headers .= "MIME-Version: 1.0" . "
    ";
    

    as per the manual on PHP.net

    Tested (successfully sent to my Gmail in HTML and not as code)

    <?php
    $to = "someone@gmail.com";
    $subject = "Test HTML E-mail";
    $random_hash = md5(date("r", time()));
    $mID = md5($to);
    $headers = "From: admin@yellowcas.com" . "
    " . "Reply-To: admin@yellowcas.com" . "
    ";
    $headers .= "Errors-To: someone@yahoo.com" . "
    ";
    $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...
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?