2011-02-11 349 views
4

如何通过PHP脚本发送HTML格式?出于某种原因,它始终显示为<b>Example</b>而不是Example。我相信我必须在某个地方包含HTML标头,我只是不知道需要做什么。我是一个完整的PHP nubcake。 :)在从PHP发送的电子邮件中使用HTML格式

这里是我的PHP脚本:(相当长,对不起!)

<?php 

if(!$_POST) exit; 

     $name  = $_POST['name']; 
     $email = $_POST['email']; 
     $phone = $_POST['phone']; 
     $subject = $_POST['subject']; 
     $comments = $_POST['comments']; 
     $verify = $_POST['verify']; 

     if(trim($name) == '') { 
      echo '<div class="error_message">You must enter your name.</div>'; 
      exit(); 
     } else if(trim($name) == 'Name') { 
      echo '<div class="error_message">You must enter your name.</div>'; 
      exit(); 
     } 

     else if(trim($email) == '') { 
      echo '<div class="error_message">Please enter a valid email address.</div>'; 
      exit(); 
     } else if(trim($email) == 'Email') { 
      echo '<div class="error_message">Please enter a valid email address.</div>'; 
      exit(); 
     } else if(!isEmail($email)) { 
      echo '<div class="error_message">Invalid e-mail address, please try again.</div>'; 
      exit(); 
     } 

     if(trim($subject) == '') { 
      echo '<div class="error_message">Please enter a subject.</div>'; 
      exit(); 
     } else if(trim($subject) == 'Subject') { 
      echo '<div class="error_message">Please enter a subject.</div>'; 
      exit(); 
     } 


     if($error == '') { 

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

     $address = "[email protected]"; 

     $e_subject = '' . $subject . '.'; 

     $e_body = "<b>Name:</b> $name \n\n<b>Subject:</b> $subject \n\n<b>Email:</b> $email \n\n<b>Message:</b> $comments"; 
     $e_content = ""; 
     $e_reply = ""; 

     $msg = $e_body . $e_content . $e_reply; 

     if(mail($address, $e_subject, $msg, "From: $email\r\nReply-To: $email\r\nReturn-Path: $email\r\n")) { 

     echo "<div id='success_page'>"; 
     echo "<h1>Email Sent Successfully.</h1>"; 
     echo "<p>Thank you <strong>$name</strong>, your message has been sent!</p>"; 
     echo "</div>"; 
     //echo "</fieldset>"; 

     } else { 

     echo 'ERROR!'; 

     } 

    } 

function isEmail($email) { // Email address verification, do not edit. 

return(preg_match("/^[-_.[:alnum:]][email protected]((([[:alnum:]]|[[:alnum:]][[:alnum:]-]*[[:alnum:]])\.)+(ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cs|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|in|info|int|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mil|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)$|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.){3}([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$/i",$email)); 

} 
?> 
+0

[Include HTML in email](http://stackoverflow.com/questions/4916477/include-html-in-email) – Quentin 2011-02-11 16:16:01

回答

11

您需要的内容类型添加到您的$ additional_headers参数:

$headers = "From: $email\r\n"; 
$headers .= "Reply-To: $email\r\n"; 
$headers .= "Return-Path: $email\r\n"; 
$headers .= "MIME-Version: 1.0\r\n"; 
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n"; 

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

我的建议是:做别人的海报说和使用外部发送服务或类似Zend_Mail这可以很容易地指定HTML和纯文本版本(我们有些人真的讨厌 HTML电子邮件;))

1

而不是试图把所有的正确发送电子邮件的细节(让过去的垃圾邮件过滤器等),你可以使用库如http://swiftmailer.org/。它处理设置所有适当的头等你。

我与swiftmailer没有任何关系。我刚刚使用过它并喜欢它。

+0

你是swiftmailer代表吗?他的问题是如何在PHP中做到这一点,而不是如何让别人为你做到这一点。正确设置标题非常简单,无需外包给其他类和库 – 2011-02-11 16:21:59

+0

发送HTML格式的电子邮件很困难(因为您必须执行多部分MIME)。重新开车是不好的。 GNU较宽松通用公共许可证是友好的。 – Quentin 2011-02-11 16:24:41

+1

@丹尼尔 - 不,我不是,只是一个使用过它而且喜欢它的人。我会更新我的答案,使其更清晰,并且将来会这样做。至于为什么当你尝试手动做某些事情时遇到麻烦,为什么当你可以使用图书馆来帮助你时呢?如果您要发送几种不同类型的电子邮件,它会变得更加容易。也可以将它外包给一个经过良好测试的库,而不是试图自己弄对它(可能会弄错但是没有意识到)。 – 2011-02-11 17:14:35

1

你需要一些HTML头,肯定的是,至少

<html> 
    <body> 
    Your data 
    </body> 
</html> 

,并设置正确的MIME类型

5

,这可能不是与你的实际问题,但你的正则表达式是巨大的和毫无意义的:/

的preg_match(“/^[-_ [:alnum:]] + @((([[:alnum:]] | [[:alnum:]] [[:alnum:] - ] * [[:alnum:]]))+(广告| AE |航空| AF | AG | AI | AL |上午|一个| AO |水溶液| AR | ARPA |为|在| AU | AW | AZ | BA | BB | BD |是| BF | BG | BH | BI | BIZ | BJ | BM | BN |博| BR | BS | BT | BV | BW |由| BZ | CA | CC | CD | CF | CG | C H | CI | CK | CL |厘米|爱泰克|合作| COM |会展|点| CS |铜|简历| CX | CY | CZ |代| DJ | DK |数据|做| DZ | EC | EDU | EE |例如|诶|呃| ES |等|欧盟|网络| FJ | FK | FM | FO | FR | GA | GB |广东| GE | GF | GH | GI | GL |通用| GN | GOV | GP | GQ | GR | GS | GT |谷| GW | GY |香港| HM | HN |人力资源| HT |胡锦涛| ID |即| IL |中|资讯|国际| IO | IQ |红外|是|它| JM |乔| JP |柯|公斤| KH |き|千米| KN | KP | KR |千瓦| KY | KZ | LA |磅| LC |李| LK | LR | LS | LT |陆| LV | LY |毫安| MC | MD |毫克| MH |密耳| MK |毫升|毫米| MN | MO | MP | MQ |先生|毫秒| MT |亩|博物馆| MV | MW | MX |我| MZ | NA |名称| NC | NE |网| NF | NG |妮| NL |没有| NP | NR | NT | NU |新西兰| OM |组织| PA | PE | PF | PG | pH值| PK | PL |发短消息| PN |公关|亲| PS | PT | PW | PY | QA |重新| RO | RU | RW | SA | SB | SC | SD | SE | SG | SH | SI | SJ | SK | SL | SM | SN |所以| SR | ST |苏| SV | SY |深圳| TC | TD | TF | TG |日| TJ | TK | TM | TN |于| TP | TR | TT |电视| TW |雅轩| UA | UG |英国| UM |美|乌伊| UZ | VA | VC |已经| VG | VI | VN |似曾相识| WF | WS |烨| YT |宇| ZA | ZM | ZW)$ |(([0-9] [0-9] | [0 -1] [0-9] [0-9] | [2] [0-4] [0-9] |。[2] [5] [0-5])){3}([0-9 ] [0-9] | [0-1] [0-9] [0-9] | [2] [0-4] [0-9] | [2] [5] [0-5]) )$/i“,$ email)

^^这是疯了:/

尝试一些更简单一些:

return filter_var($email, FILTER_VALIDATE_EMAIL); 
3

您需要一个HTML标头。此外

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

,如果我是你,我会让它更多的跨平台兼容:补充一点:

$headers = "MIME-Version: 1.0" . "\r\n"; 
$headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n"; 
$headers .= "From: $email\r\nReply-To: $email\r\nReturn-Path: $email\r\n"; 

然后在你发送邮件行重写这个样子。 * nix系统中的换行符是“\ n”,Mac中是“\ r”。我从来没有实际工作在Mac服务器上,所以我用这个来设置一个新的行定义:

if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') 
    define('EOL', "\r\n"); 
else 
    define('EOL', "\n"); 

而在我的头我用的,而不是EOL“\ r \ n”,所以它看起来是这样的:

$headers = "MIME-Version: 1.0" . EOL 
$headers .= "Content-type:text/html;charset=iso-8859-1" . EOL; 
$headers .= "From: $email".EOL."Reply-To: $email".EOL."Return-Path: $email".EOL.EOL; 

此外,结束你的头有两个换行符,以防止头部注入攻击。