如何使表单发送简单的HTML邮件而不是纯文本

4

好的,我之前问过这个问题,但是没有得到清晰的答案,这次我会更好地解释。

我有一个联系表格,当提交后,接收到的电子邮件是纯文本,这不是我想要的。我希望提交具有一些样式,并且更整洁(使用我下面的HTML)。我曾尝试过使其工作,但没有成功,现在需要外部协助。

以下是处理php表单的过程:

 <?php if (!isset($_SESSION)) session_start();

 if(!$_POST) exit;

if (!defined("PHP_EOL")) define("PHP_EOL", "\r\n");


$address = "email@domain.com";
$bcc = "email@domain.com";

    $twitter_active     = 0;
    $twitter_user       = ""; 
    $consumer_key       = "";
    $consumer_secret    = "";
    $token              = "";
    $secret             = "";


$name    = $_POST['name'];
$email  = $_POST['email'];
$phone  = $_POST['phone'];
$dayin  = $_POST['dayin'];
$dayout = $_POST['dayout'];
$comments = $_POST['comments'];

if (isset($_POST['verify'])) :
    $posted_verify   = $_POST['verify'];
    $posted_verify   = md5($posted_verify);
else :
    $posted_verify = '';
endif;

// Important Variables
$session_verify = $_SESSION['verify'];

if (empty($session_verify)) $session_verify = $_COOKIE['verify'];

$error = '';

    if(trim($name) == '') {
        $error .= '<li>Your name is required.</li>';
    }

    if(trim($email) == '') {
        $error .= '<li>Your e-mail address is required.</li>';
    } elseif(!isEmail($email)) {
        $error .= '<li>You have entered an invalid e-mail address.</li>';
    }

    if(trim($phone) == '') {
        $error .= '<li>Your phone number is required.</li>';
    } elseif(!is_numeric($phone)) {
        $error .= '<li>Your phone number can only contain digits (no 
spaces).</li>';
    }

    if(trim($comments) == '') {
        $error .= '<li>You must enter a message to send.</li>';
    }

    if($session_verify != $posted_verify) {
        $error .= '<li>The verification code you entered is incorrect.
</li>';
    }

    if($error != '') {
        echo '<div class="error_message">Attention! Please correct the 
errors below and try again.';
        echo '<ul class="error_messages">' . $error . '</ul>';
        echo '</div>';

    } else {

    if(get_magic_quotes_gpc()) { $comments = stripslashes($comments); }

     $e_subject = 'Website Enquiry';

     $msg = '<html><body>
     <strong>WEBSITE ENQUIRY FROM:</strong><br>
     www.domainname.com<br>
     -----------------------------------------------------------<br><br>
     <strong>Name: </strong>
     '.$_POST['name'].' <br>
     <strong>Email: </strong>
     '.$_POST['email'].' <br>
     <strong>Contact Number: </strong>
     '.$_POST['phone'].' <br>
     <strong>Day in: </strong>
     '.$_POST['dayin'].' <br>
     <strong>Day out: </strong>
     '.$_POST['dayout'].'<br><br>
     <strong>Notes / Comments: </strong><br>
     '.$_POST['comments'].'
     </body></html>';

    if($twitter_active == 1) {

        $twitter_msg = $name . " - " . $comments . ". You can contact " . 
$name . " via email, " . $email ." or via phone " . $phone . ".";
        twittermessage($twitter_user, $twitter_msg, $consumer_key, 
$consumer_secret, $token, $secret);

    }

    $msg = wordwrap( $msg, 70 );

    $headers = "From: $email\r\nBCC:{$bcc}\r\n" . PHP_EOL;
    $headers .= "Reply-To: $email" . PHP_EOL;
    $headers .= "MIME-Version: 1.0" . PHP_EOL;
    $headers .= "Content-type: text/html; charset=utf-8" . PHP_EOL;
    $headers .= "Content-Transfer-Encoding: quoted-printable" . PHP_EOL;

    if(mail($address, $e_subject, $msg, $headers)) {

     echo "<fieldset>";
     echo "<div id='success_page'>";
     echo "<img src='success.png' align='absmiddle' style='padding-right:5px;' 
/><strong>Email Sent Successfully.</strong>";
     echo "</div>";
     echo "</fieldset>";

     } else {

     echo 'ERROR!'; // Dont Edit.

     }

}


function twittermessage($user, $message, $consumer_key, $consumer_secret, $token, 
$secret) { // Twitter Direct Message function, do not edit.

require_once('twitter/EpiCurl.php');
require_once('twitter/EpiOAuth.php');
require_once('twitter/EpiTwitter.php');

$Twitter = new EpiTwitter($consumer_key, $consumer_secret);
$Twitter->setToken($token, $secret);

$direct_message = $Twitter->post_direct_messagesNew( array('user' => $user, 'text' 
    => $message) );
$tweet_info = $direct_message->responseText;

 }
?>

请注意上述表单中的代码:
 $msg = '<html><body>
     <strong>WEBSITE ENQUIRY FROM:</strong><br>
     www.domainname.com<br>
     -----------------------------------------------------------<br><br>
     <strong>Name: </strong>
     '.$_POST['name'].' <br>
     <strong>Email: </strong>
     '.$_POST['email'].' <br>
     <strong>Contact Number: </strong>
     '.$_POST['phone'].' <br>
     <strong>Day in: </strong>
     '.$_POST['dayin'].' <br>
     <strong>Day out: </strong>
     '.$_POST['dayout'].'<br><br>
     <strong>Notes / Comments: </strong><br>
     '.$_POST['comments'].'
     </body></html>';

我想用这个样式化的HTML替换上面的代码(产生纯文本电子邮件)。
<table width="550" border="0" cellpadding="0" cellspacing="0">
<!--DWLayoutTable-->
<tr>
<td height="78" colspan="2" align="center" valign="middle" bgcolor="#F0F5FB"><span 
style="font-family:Georgia, 'Times New Roman', Times, serif; font-size: 24px; 
font-style:italic; color:#0099CC; ">WEBSITE ENQUIRY FROM:</span><br />
  <span style="font-family:Arial, Helvetica, sans-serif; font-size:12px;  
color:#333333">www.domainname.com</span></td>
</tr>
<tr>
<td width="177" height="166" valign="middle"><span style="font-family:Arial, 
Helvetica, sans-serif; font-size:14px; color:#333333; font-weight:bold;">Name:<br />
Country<br />
Contact Number<br />
Email<br />
No. Guests<br />
Day in<br />
Day Out<br />
Comments
</span></td>
<td width="373" valign="middle"><span style="font-family:Arial, Helvetica, sans-serif; 
font-size:14px; color:#333333; font-weight:bold;">'.$_POST['name'].'<br />
'.$_POST['country'].'<br />
'.$_POST['tel'].'<br />
'.$_POST['email'].'<br />
'.$_POST['guests'].'<br />
'.$_POST['day in'].'<br />
'.$_POST['day out'].'<br />
'.$_POST['comments'].'<br />


</span></td>
</tr>
</table>

逐步说明如何使其正常工作。我曾尝试用我的样式化HTML代码替换纯文本代码,但未能成功。还需要做什么?
感谢您的回复!
编辑
请查看此处: 这是HTML电子邮件应该看起来像:http://www.testing123.co.za/styled.jpg ..... 这是实际效果:http://www.testing123.co.za/not-correct.jpg

你可以尝试使用Smarty模板。 - Ajeet Sinha
不,需要与这段代码一起使用,谢谢。 - Reflex84
2
它以纯文本形式到达吗?您确定客户邮件不会剥离HTML标签吗? - Elen
你可能需要进行 MIME 编码。我记不清具体的步骤了,因为我已经很久没有使用 PHP 发送 HTML 邮件了。 - GordonM
这绝对不是由于我的电子邮件客户端,因为我的其他表单使用了样式化的HTML,并且在我的电子邮件客户端上看起来完美。所以我认为我的电子邮件客户端与此无关?除非我理解错误? - Reflex84
这是HTML邮件应该看起来的样子:http://www.testing123.co.za/styled.jpg ..... 然而实际呈现的是这样的:http://www.testing123.co.za/not-correct.jpg - Reflex84
3个回答

4

我们的(工作中的)代码:

$text = "";
$text .= "<html>\n";
$text .= "<body style=\"font-family:Arial; \">\n";
$text .= "<b>more text</b>";
. . .
$text .= "</body>\n";
$text .= "</html>\n";

$headers = 'From: ' . $frm . "\r\n";
$headers .= 'To: ' . $mmail_to . "\r\n";
$headers .= 'Bcc: ' . $mmail_bcc . "\r\n";  
$headers .= 'Return-Path: ' . $frm . "\r\n";
$headers .= 'MIME-Version: 1.0' ."\r\n";
$headers .= 'Content-Type: text/HTML; charset=ISO-8859-1' . "\r\n";
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n";
$headers .= $text . "\r\n";

if (!mail('', $strSubject, '', $headers)) {
. . . 

也许您需要添加 'Content-Transfer-Encoding',或者 $msg 应该是 $headers 的一部分吗?

好的,现在已经完美了!我所做的只是将我的头文件 $headers .= "Content-Transfer-Encoding: quoted-printable" . PHP_EOL; 替换为你上面的头文件 $headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n" . PHP_EOL; ... 现在它完美地呈现出来了!谢谢,伙计! - Reflex84
如果我想添加主题怎么办 - $headers .= 'subject: ' . $title . "\r\n"; - 其中$title是文本框的名称,用户可以输入电子邮件主题。这样正确吗? - Mohammed Moustafa
1
查看我的最新PHP 5.4.43代码 - https://dev59.com/NV0Z5IYBdhLWcg3w8kFJ#31671606 mail()函数的第二个参数是电子邮件主题。 - Atara

1
请检查您的“样式化HTML”。我认为问题在于单引号font-family: 'Times New Roman',也许您可以改为font-family:\'Times News Roman\'。另外,我曾尝试用样式化的HTML替换纯文本代码,但并没有成功。

嗨,好的,这个起作用了!但是...现在电子邮件提交(我记得以前发生过这种情况)看起来与我的样式化HTML完全不同。电子邮件具有橙色背景颜色,单元格宽度非常挤压和狭窄。 - Reflex84
哦,它仍然以纯文本形式到达。 - Reflex84
这是HTML电子邮件应该看起来的样子:http://www.testing123.co.za/styled.jpg ..... 这是实际效果:http://www.testing123.co.za/not-correct.jpg - Reflex84
1
嗨,谢谢你的帮助,虽然Atara提到了Content-Transfer-Encoding头部,这正是修正了一切的地方。请看我对Atara的评论。 - Reflex84

-1

在头部使用charset=iso-8859-1

$headers  = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";

要发送HTML电子邮件,您必须使用上面的字符集(此处),以及(此处),您可以看到大多数人都在使用该字符集。


不要这样做,完全没有帮助。 - GordonM
这些是发送HTML电子邮件的正确标头,他的电子邮件正文可能存在错误。 - Erik
@GordonM,你能否仅浏览答案中的链接? - Manigandan Arjunan
是的,正如zulkhaery Basrul所提到的那样,它在正文(单引号)中。 但HTML电子邮件的结果看起来完全不同。请参见我上面帖子中的编辑。 - Reflex84
需要更改的是传输编码头:$headers .= 'Content-Transfer-Encoding: 8bit'。现在完美无瑕了!谢谢大家! - Reflex84

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接