2012-04-18 2 views
1

У меня есть этот код, чтобы отправить по электронной почте с помощью PHP:HTML электронной почты посылает в виде обычного текста с PHP

// Prepare email. 
$headers = "From: Mi9 Vault <[email protected]>\r\n"; 
$headers .= "MIME-Version: 1.0\r\n"; 
$headers .= "Content-type: text/html; charset=ISO-8859-1"; 

$msg = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/edm/confirmation.html'); 
$msg = str_replace('{first_name}', $contact["First Name"], $msg); 


// Send email 
mail($contact["Email Address"], "Your Mi9 Registration is Confirmed", $msg, $headers); 

confirmation.html является HTML электронной почты, который мы создали.

У меня никогда не было проблем с вышеуказанным PHP-кодом для отправки писем раньше, однако все, что я могу вернуть, - это письмо, содержащее все HTML, а не фактическое письмо в формате HTML.

В основном я получаю по электронной почте с этим как содержание:

MIME-Version: 1.0 

Content-type: text/html; charset=ISO-8859-1 
Message-Id: <[email protected]> 
Date: Wed, 18 Apr 2012 01:03:25 -0700 (PDT) 

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
    </head> 
    <body> 
     ..... 

У меня есть один и тот же PHP код на другом сайте с тем же хозяином, и он прекрасно работает ...

+0

У меня была эта проблема раньше, и решил ее, играя с размещением '\ r \ n'.Возможно, вы захотите попробовать решение Данте. –

+0

Фактически встроенный HTML работает только с очень слабым (несоответствующим) пользовательским агентом. Вы можете получить это, чтобы отображать, как вы хотите, в своем почтовом клиенте, когда вы исправили проблему с новой строкой в ​​ehaders, но вы должны использовать 7-битную кодировку передачи, а html должен быть помечен как встроенный контент mime. – symcbean

ответ

6

Кажется, что из так или иначе есть дополнительные разрывы строк между двумя строками ваших заголовков. Как это удается, я не уверен, так как ваш код их не кладет. Возможно, что почтовый сервер-получатель каким-то образом перепутался и интерпретирует \r\n как два разрыва строки, а не один. Начнем с того, что я удалю \r, оставив только \n и посмотрю, что произойдет. Я знаю, что это не правильно для RFC, но начните с этого.

Чтобы вы чувствовали себя лучше, я использую очень похожий код - и электронное письмо доставляется правильно.

+0

. Я взял '\ r \ n' от первой строки (с' From: '), и теперь он отлично работает ... Это очень странно. – Marty

+0

@MartyWallace Ой, кстати, попробуйте добавить '\ r \ n \ r \ n' в последнюю строку заголовка вместо того, чтобы отбирать' \ r' - может быть, это путает отсутствующий двойной конец кода, строка в конце заголовков –

+0

Только что пришла к той же проблеме и действительно разрешила ее, удалив '\ r'. Спасибо за это :-) –

0

Попробуйте изменить:

$headers = "From: Mi9 Vault <[email protected]>\r\n"; 
$headers .= "MIME-Version: 1.0\r\n"; 
$headers .= "Content-type: text/html; charset=ISO-8859-1"; 

в

$headers = 'From: Mi9 Vault <[email protected]>' . "\r\n"; 
$headers .= 'MIME-Version: 1.0' . "\r\n"; 
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 
0

попытка удалить HTML и голову тег от вас HTML электронной почты, просто поместить простой HTML для контента нет необходимости добавлять дополнительные теги HTML, и Body запустите теги html после тега начала тега

2

Вы не указали, на какой платформе вы работаете, а какая почтовая программа - почтой(). Кажется, что почтовая программа, которую вы используете, ожидает, что \ n будет разделителем. Вы можете использовать PHP_EOL вместо \ r \ n или \ n, и в этом случае он будет использовать разделитель строк, используемый в рабочей платформе.

Для системы/Unix Linux,

Линия ломает в заголовках должна быть родными окончаниями линии для системы , на которых PHP работает.

Функция mail() не разговаривает с SMTP-сервером, поэтому RFC2822 делает здесь не применимым. mail() обращается к программе командной строки в локальной системе , и разумно ожидать, что программа потребует системных разрывов строк.

(source)

В конечном счете, рассмотреть возможность использования почты() альтернативы, которые имеют несколько подобных вопросов, как правило, улажены. mail() - очень «сырая» функция, которая имеет несколько gotchas, включая заголовок. Такие проблемы уже решены, например, в Swift Mailer или PHPMailer.

Смежные вопросы