【问题标题】:Mail Function displaying HTML as Text将 HTML 显示为文本的邮件功能
【发布时间】:2014-03-14 10:05:11
【问题描述】:

我有以下邮件功能:

<?php
{
$to = "alee@####.com";
$subject = "General Contact.";
$headers  = "From: ####<noreply@####.com>\r\n";
$headers .= "Reply-To: info@####.com\r\n";
$headers .= "Return-Path: info@####.com\r\n";
$headers .= 'MIME-Version: 1.0' . "\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$name = filter_input(INPUT_POST, 'name');
$telephone = filter_input(INPUT_POST, 'phone');
$nature = filter_input(INPUT_POST, 'nature');   
$comments = filter_input(INPUT_POST, 'comments');
$message = 
"<span style='font-weight: bold;'>Name: </span>"."<br />".$name."<br />"."<br />".
"<span style='font-weight: bold;'>Telephone: </span>"."<br />".$telephone."<br />"."<br   />".
"<span style='font-weight: bold;'>Nature of enquiry: </span>"."<br />".$nature."<br />"."<br />".
"<span style='font-weight: bold;'>Comments: </span>"."<br />".$comments."<br />"."<br />";

mail($to, $subject,"We have received a message via the online form at www.####.com<br />  <br />" . $message, $headers);
echo "Your message was successfully sent. Please <a href='contact.php'>click here</a> to return to the site.";
?>
<?php  }
?>

我遇到的问题是,当使用表单并且邮件到达我的收件箱时,HTML 显示为纯文本,并且无法正确显示。所以我可以看到所有内联 HTML 元素,即
将显示为段落的一部分,而不显示新行。任何帮助都会很棒!

编辑:

Reply-To: info@###.com
Return-Path: info@###.com
MIME-Version: 1.0
Content-type: text/html; charset: utf8

We have received a message via the online form at www.###.com<br /><br /><span    style='font-weight: bold;'>Name: </span><br />Aaron Lee<br /><br /><span style='font-weight:   bold;'>Telephone: </span><br />#####<br /><br /><span style='font-weight:   bold;'>Nature of enquiry: </span><br />###<br /><br /><span style='font-weight:   bold;'>Comments: </span><br />Testttttttttttt<br /><br />

【问题讨论】:

  • 您使用什么电子邮件客户端?我已经在 Outlook Express 中运行了您的代码并打开了电子邮件 - 绝对没问题

标签: php html-email mail-form


【解决方案1】:

尝试替换这些行:

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

与:

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

【讨论】:

  • 不高兴,outlook 和我的 webmail 程序仍在显示内联 HTML 元素。
  • 糟糕,我修正了答案中的错字。不确定它是否有效,但您可以重试吗?
  • 我错过了 .太哈哈。恐怕它仍然没有完成工作。上面的编辑显示了我在电子邮件中收到的内容。
  • 嗯.. 斯坦格。也许尝试为邮件添加正确的 HTML 结构(Here your HTML message),但真的不确定:/
  • @Diamondo25。 SMTP 并不奇怪。很好defined。据我了解,RFC 中的“”与“\r\n”相同。回车,然后是换行......它可以追溯到打字机。
【解决方案2】:

看起来它正在发送带有额外换行符的标题。

从您的示例中,您似乎在标题后有两个换行符。我会尝试删除\r,所以标题的最后一行只有\n

换行试试

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

$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\n";

我知道这是不正确的,但我看到同样的问题以这种方式解决了。

【讨论】:

    【解决方案3】:

    您可以尝试更改以下行:

    $headers .= 'MIME-Version: 1.0' . "\n";
    

    $headers .= 'MIME-Version: 1.0' . "\r\n";
    

    所有行都应以 \r\n 结尾,而不是其他任何内容。

    【讨论】:

      【解决方案4】:

      我正在使用这种方法发送邮件。也许你能看到一些有用的东西:

      public static function mailSend($mail_to,$fname,$mail_sub,$mail_msg,$from){
      
          $To=$mail_to;
      
          $Body =$mail_msg."<BR>";
      
          $Subject=$mail_sub;
      
          $headers  = "MIME-Version: 1.0\n";
          $headers .= "Content-type: text/html; charset=iso-8859-1\n";
          $headers .= "From: Robot <info@#####.com>  \n";
          $headers .= "X-Mailer: www.#####.com\n"; //mailer
          $headers .= "Return-Path: <info@#####.com>\n";
          $headers .= "X-Priority: 3\n"; //1 UrgentMessage, 3 Normal
      
          $mail = new PHPMailer();
      
          $mail->IsSMTP();            // set mailer to use SMTP
          $mail->IsHTML(true);
      
          $mail->From = $from;
          $mail->FromName = $fname;
          $mail->AddAddress($To);
      
          $mail->WordWrap = 100;      // set word wrap to 100 characters
      
          $mail->Subject = $Subject;
          $mail->Body    = $Body;
          $mail->AltBody    = $Body;
      
          $mail->Send();
      
      }
      

      【讨论】:

        【解决方案5】:

        消息

        您传递给mail() 函数的消息不是有效的HTML。这可能是您的客户未正确显示它的原因。

        试试这个:

        $message =
            "<!DOCTYPE html>\r\n"
            . "<html lang="en">\r\n"
            . "<body>\r\n"
            . "We have received a message via the online form at my.domain.com<br><br>\r\n"
            . "<strong>Name:</strong><br>{$name}<br><br>\r\n"
            . "<strong>Telephone:</strong><br>{$telephone}<br><br>\r\n"
            . "<strong>Nature of enquiry:</strong><br>{$nature}<br><br>\r\n"
            . "<strong>Comments:</strong><br>{$comments}<br><br>\r\n"
            . "</body>\r\n"
            . "</html>\r\n";
        

        还要确保标签中的属性值用 双引号 包裹,而不是单引号。所以是&lt;a href="#"&gt;link&lt;/a&gt;不是&lt;a href='#'&gt;link&lt;/a&gt;

        标题

        关于您正在使用的标题的一些注释(尽管我不认为这会导致您的问题):

        • 标题应以\r\n 分隔(而不是\n,如您的MIME-Version)。
        • From 的语法应该是 From: &lt;email&gt;From: "name" &lt;email&gt;
        • Reply-To 的语法应该是 Reply-To: &lt;email&gt;Reply-To: "name" &lt;email&gt;
        • Return-Path 的语法应该是 Return-Path: &lt;email&gt;
        • 您应该添加一个Content-Length 标头。

        试试这个:

        $headers = implode(
            "\r\n",
            array(
                'From: "My Name" <noreply@my.domain.com>',
                'Reply-To: <info@my.domain.com>',
                'Return-Path: <info@my.domain.com>',
                'MIME-Version: 1.0',
                'Content-type: text/html; charset=iso-8859-1',
                'Content-Length: ' . strlen($message)
            )
        );
        

        不要使用 mail()

        PHP mail() 函数存在很多问题。您真的应该考虑使用 3rd 方库来发送电子邮件。

        我建议你看看Swift Mailer,并且不要使用“邮件传输”(Swift_MailTransport);)

        【讨论】:

          【解决方案6】:

          我总是使用混合邮件,在发送 HTML 格式的邮件时,因为有些人禁用了 html。 构建邮件,多部分/混合,并添加一些行来划分部分($trenner)

          我的工作解决方案与您的解决方案的主要区别在于属性 Content-Transfer-Encoding,文本部分为7bit,html为quoted-printable

          $crlf = "\r\n";
          $trenner = '---wbs'.md5(uniqid(time()));
          
          if(!$this->from)throw new exception('wbs_mail:Kein Absender angegeben');
          if(!$this->to)throw new exception('wbs_mail:Kein Empfänger angegeben');
          if(!$this->subject)throw new exception('wbs_mail:Kein Betreff angegeben');
          if(!$this->content['html'])throw new exception('wbs_mail:Kein HTML-Inhalt angegeben');
          if(!$this->content['text'])throw new exception('wbs_mail:Kein Text-Inhalt angegeben');
          
          $this->header = "From: ".$this->from.$crlf;
          $this->header  .= "X-Mailer: wbs_mail php_ver". phpversion().$crlf;
          $this->header  .= "MIME-Version: 1.0".$crlf;
          $this->header .= 'Content-Type: multipart/mixed; boundary="'.$trenner.'"'.$crlf;
          
          // Der Textblock
          $content = $trenner.$crlf;
          $content .= 'Content-Type: text/plain; charset="iso-8859-1"'.$crlf;
          $content .= 'Content-Transfer-Encoding: 7bit'.$crlf;
          $content .= $this->getContent('text').$crlf.$crlf;
          
          // Der HTML Block
          $content .= $trenner.$crlf.$crlf;
          $content_html = 'Content-Type: text/html; charset="iso-8859-1"'.$crlf;
          $content_html .= 'Content-Transfer-Encoding: quoted-printable'.$crlf;
          $content_html .= $this->getContent('html').$crlf;
          $content .= $content_html.$crlf;
          $content .= $trenner.$crlf;
          

          【讨论】:

            【解决方案7】:

            您也可以使用PHP_EOL(PHP 行尾)常量代替\n\r\n

            PHP_EOL(字符串)
            此平台的正确“行尾”符号。自 PHP 4.3.10 和 PHP 5.0.2 起可用

            来源:http://www.php.net/manual/en/reserved.constants.php
            另请参阅:When do I use the PHP constant "PHP_EOL"?


            在实践中,您可以如下使用它:

            $br = PHP_EOL;
            
            $headers = 'From: Avatar <avatarparto@gmail.com>.'.$br;
            $headers .= 'Reply-To: Avatar <avatarparto@gmail.com>.'.$br;
            $headers .= 'Subject: Hello'.$br;
            $headers .= 'MIME-Version: 1.0'.$br;
            $headers .= 'X-Mailer: PHP'.phpversion();
            

            【讨论】:

              【解决方案8】:

              尝试使用以下函数,它发送带有multipart数据的邮件,

              function sendEmail($to,$from,$sub,$msg){
              
                  $subject = $sub; 
                  $headers = "From: $from";
              
                  // boundary 
                  $semi_rand = md5(time()); 
                  $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 
              
                  // headers for attachment 
                  $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; 
              
                  // multipart boundary 
                  $message = "--{$mime_boundary}\n" . "Content-Type: text/html; charset=\"iso-8859-1\"\n" .
                  "Content-Transfer-Encoding: 7bit\n\n" .  $msg . "\n\n"; 
                  $message .= "--{$mime_boundary}--";
                  $returnpath = "-f" . $from;
              
                  $ok = @mail($to, $subject, $message, $headers, $returnpath); 
                  return $ok;
                }
              

              【讨论】:

                【解决方案9】:

                换行试试

                $headers  = "From: ####<noreply@####.com>\r\n";
                

                $headers = 'From: <urmail@mail.com>' . "\r\n";
                

                我已将双引号更改为单引号。它对我来说很好用。试试你的运气。

                【讨论】:

                • 我认为 '####' 是 OP 用来替换私人日期的。不是吗?如果您忽略###,那么您的字符串与他的字符串并没有什么不同。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-03-29
                • 2013-05-19
                • 2018-07-29
                • 2014-09-20
                • 1970-01-01
                相关资源
                最近更新 更多