Я собираюсь попробовать это еще раз с очень простым примером. Когда я отправляю электронное письмо с использованием PHP для почтовых клиентов, у меня нет проблем, кроме как с gmail. Когда я просматриваю электронную почту в gmail, все, что я вижу, это код сообщения. Gmail не отображает HTML. Он просто отображает код. Вот мой сценарий:
<?php $to = "someone@gmail.com"; $subject = "Test HTML E-mail"; $random_hash = md5(date("r", time())); $mID = md5($to); $headers = "From: admin@yellowcas.com" . "\n" . "Reply-To: admin@yellowcas.com" . "\n"; $headers .= "Errors-To: someone@yahoo.com" . "\n"; $headers .= "MIME-Version: 1.0" . "\n"; $headers .= "Content-Type: multipart/alternative; boundary=". $random_hash ." ; Message-ID: <" . $mID . ">" . "\n"; 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 не признает пограничную строку по какой-то причине. Вот что я вижу, когда открываю электронную почту:
--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 не распознает граничную строку. Как это исправить?
Как замечание, да, это простой PHP-скрипт электронной почты, который я нашел в Интернете. Я сделал несколько изменений, но он все еще не работает в gmail. Все остальные клиенты электронной почты делают это хорошо. ПОЖАЛУЙСТА ПОМОГИ! Я нахожусь в конце своего ума. Спасибо.
Когда я добавил строку $ headers в примере кода, приведенном ниже, который был отправлен Fred-ii-, gmail отобразил HTML, но он по-прежнему показывает строку границы и текстовое сообщение. Вот как выглядит электронная почта:
–f8451c07b6649388e8938cfa12ea21e6 Content-Type: text / plain; charset = iso-8859-1 Content-Transfer-Encoding: 7bit Привет, Грег !!! Это просто текстовое сообщение электронной почты. –f8451c07b6649388e8938cfa12ea21e6 Content-Type: text / html; charset = iso-8859-1 Content-Transfer-Encoding: 7bit
Привет, Том!
Это что-то с форматированием HTML . –f8451c07b6649388e8938cfa12ea21e6–
Надеюсь, что все будет правильно.
Вот еще одна хорошая версия и с ней проще работать:
<?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!"; } ?>
Другой испытанный метод: (который до сих пор является лучшим методом)
<?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\r\n"; $headers .= "Content-Type: multipart/alternative; boundary=\"$mime_boundary\"\r\n"; $headers .= "Content-Transfer-Encoding: 7bit\r\n"; $body = "This is a multi-part message in mime format.\n\n"; # Add in plain text version $body .= "--$mime_boundary\n"; $body .= "Content-Type: text/plain; charset=\"charset=us-ascii\"\n"; $body .= "Content-Transfer-Encoding: 7bit\n\n"; $body .= $text_content; $body .= "\n\n"; # Add in HTML version $body .= "--$mime_boundary\n"; $body .= "Content-Type: text/html; charset=\"UTF-8\"\n"; $body .= "Content-Transfer-Encoding: 7bit\n\n"; $body .= $html_content; $body .= "\n\n"; # 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--\n"; # <-- Notice trailing --, required to close email body for mime's # Finish off headers $headers .= "From: $from\r\n"; $headers .= "X-Sender-IP: $_SERVER[SERVER_ADDR]\r\n"; $headers .= 'Date: '.date('n/d/Y g:i A')."\r\n"; # Mail it out return mail($to, $subject, $body, $headers); } send_email(); // call the function ?>
Это сработало и только показало мне в HTML в Gmail, так что теоретический текст должен теоретически работать.
<?php $notice_text = "This is a multi-part message in MIME format."; $plain_text = "This is a plain text email.\r\nIt is very cool."; $html_text = "<html><body>This is an <b style='color:purple'>HTML</b>" . "text email.\r\nIt 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 . "\n" . "bcc: " . $bcc . "\n" . "MIME-Version: 1.0\n" . "Content-Type: multipart/alternative;\n" . " boundary=" . $mime_boundary_header)) echo "Email sent successfully."; else echo "Email NOT sent successfully!"; ?>
Попробуйте эту версию: (протестирован без каких-либо дополнительных кодов)
<?php $to = "someone@gmail.com"; $subject = "Test HTML E-mail"; $headers = "From: admin@yellowcas.com" . "\n" . "Reply-To: admin@yellowcas.com" . "\r\n"; $headers .= "MIME-Version: 1.0\r\n"; //unique boundary $boundary = uniqid("HTMLDEMO"); //tell e-mail client this e-mail contains//alternate versions $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n"; //plain text version of message $body = "--$boundary\r\n" . "Content-Type: text/plain; charset=ISO-8859-1\r\n" . "Content-Transfer-Encoding: base64\r\n\r\n"; $body .= chunk_split(base64_encode(" Hello, Tom!!! This is simple text email message. ")); //HTML version of message $body .= "--$boundary\r\n" . "Content-Type: text/html; charset=ISO-8859-1\r\n" . "Content-Transfer-Encoding: base64\r\n\r\n"; $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"; ?>
Вы должны использовать следующее в своих начальных заголовках:
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
ниже:
$headers .= "MIME-Version: 1.0" . "\n";
в соответствии the manual on PHP.net
Протестировано (успешно отправлено в мой Gmail в HTML, а не как код)
<?php $to = "someone@gmail.com"; $subject = "Test HTML E-mail"; $random_hash = md5(date("r", time())); $mID = md5($to); $headers = "From: admin@yellowcas.com" . "\n" . "Reply-To: admin@yellowcas.com" . "\n"; $headers .= "Errors-To: someone@yahoo.com" . "\n"; $headers .= "MIME-Version: 1.0" . "\n"; $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; $headers .= "Content-Type: multipart/alternative; boundary=". $random_hash ." ; Message-ID: <" . $mID . ">" . "\n"; ob_start(); ?> // rest of code below...