PHP HTML-Email结果中随机出现感叹号

Posted

技术标签:

【中文标题】PHP HTML-Email结果中随机出现感叹号【英文标题】:Exclamation Point Randomly In Result of PHP HTML-Email 【发布时间】:2013-08-26 20:39:33 【问题描述】:

我在这个 php 电子邮件函数的结果中随机出现感叹号。我读到这是因为我的行太长,或者我必须用 Base64 对电子邮件进行编码,但我不知道该怎么做。

这就是我所拥有的:

$to = "you@you.you";
$subject = "Pulling Hair Out";
$from = "me@me.me";
$headers = "From:" . $from;
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$headers .= "Content-Transfer-Encoding: 64bit\r\n";

mail($to,$subject,$message,$headers); 

我该如何解决这个问题,所以没有随机!结果呢?谢谢!

【问题讨论】:

电子邮件正文为空,您还会遇到这个问题吗? 您能在问题中添加一个示例吗? 此问题已在此处提出并回答:***.com/questions/7921111/… 简单的答案:不要建立自己的 mime 电子邮件。使用 PHPMailer 或 Swiftmailer 为您完成。 【参考方案1】:

如此处所述:Exclamation Point in HTML Email

问题是你的字符串太长了。将一个长度超过 78 个字符的 HTML 字符串输入到 mail 函数,你会得到一个 ! (砰)在你的字符串中。

这是由于 RFC2822 https://www.rfc-editor.org/rfc/rfc2822#section-2.1.1 中的行长度限制

【讨论】:

我已经阅读了另一个问题“HTML 电子邮件中的感叹号”。我不确定该怎么做:“解决方法是将其更改为 base-64 编码数据或在我的长行 html 代码中添加 \r\n。” @tomuky 尝试$base64_email_text = rtrim(chunk_split(base64_encode($email_text))); 来源:brightlemon.com/blog/…【参考方案2】:

尝试使用这段代码:

$to = "you@you.you";
$subject = "Pulling Hair Out";
$from = "me@me.me";
$headers = "From:" . $from;
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$headers .= "Content-Transfer-Encoding: 64bit\r\n";

$finalMessage = wordwrap( $message, 75, "\n" );

mail($to,$subject,$finalMessage,$headers);

问题是一行不应超过 998 个字符。 (另见https://***.com/a/12840338/2136148)

【讨论】:

这对我来说非常有效。我们向 Outlook 和 Office 365 收件人发送大型电子邮件,并且 wordwrap 命令完美地消除了所有感叹号,而不会影响任何 HTML。一切都按预期呈现。 这行$finalMessage = wordwrap( $message, 75, "\n" ); 解决了这个问题。我正在向 Gmail 和其他人发送电子邮件。像魅力一样工作。【参考方案3】:

这里的答案包含有关行长的正确信息,但是没有一个为我提供了足够的代码 sn-p 来解决问题。我环顾四周,找到了最好的方法,就在这里;

<?php
// send base64 encoded email to allow large strings that will not get broken up
// ==============================================
$eol = "\r\n";
// a random hash will be necessary to send mixed content
$separator = md5(time());

$headers  = "MIME-Version: 1.0".$eol;
$headers .= "From: Me <info@example.com>".$eol;
$headers .= "Content-Type: multipart/alternative; boundary=\"$separator\"".$eol;
$headers .= "--$separator".$eol;
$headers .= "Content-Type: text/html; charset=utf-8".$eol;
$headers .= "Content-Transfer-Encoding: base64".$eol.$eol;

// message body
$body = rtrim(chunk_split(base64_encode($html)));

mail($email, $subject, $body, $headers);
// ==============================================

【讨论】:

代码几乎成功了。它有一个错误。 $headers .= "Content-Transfer-Encoding: base64".$eol.$eol; 行是错误的,应该是 $headers .= "Content-Transfer-Encoding: base64".$eol,它会正常工作 您是否只是删除了示例中的第二个$eol【参考方案4】:

你是对的,那是因为你的电子邮件太长了。尝试用邮件标题中的这一行替换。

Content-Transfer-Encoding: quoted-printable

【讨论】:

不确定你是否已经弄清楚了,但我忽略了这段代码。所以标题连同这个应该可以解决你的问题。 $message = quoted_printable_encode($message)php.net/manual/en/function.quoted-printable-encode.php 我对上面的许多答案和我自己的一些变通方法感到很生气,但这绝对是最简单、最快捷的解决方法,输出没有回扣...添加了这个标题: $headers 。 = "内容传输编码:引用打印"。"\r\n";调整了我的 html 字符串:$body =quoted_printable_encode($msgtosend);

以上是关于PHP HTML-Email结果中随机出现感叹号的主要内容,如果未能解决你的问题,请参考以下文章

解决:Centos中出现的“您在 /var/spool/mail/root 中有邮件”的问题

Wifi的5g网突然不好使了,出现了感叹号

利用PHP随机出现0到1000的数,不足四位的前面用0补足

php 生成一个随机数(0.11~999.99),判断是不是是所有数字相同 , 例如出现1.11 或者11.1,111.1,111.11 这种

php 概率问题一副扑克牌随机抽取,出现红色10次出3次,黑色10次出1次,大小王10次出1次,这个怎么做?

PHP中函数前的感叹号是啥意思