2

我遇到了一些电子邮件问题的严重问题。

简而言之:

  1. 加载一个 html 模板文件fopen
  2. %password用实际值替换一些值,像这样标记str_replace
  3. 通过以下函数发送邮件,$content加载的html模板文件在哪里:

公共函数发送($receiver, $subject, $content){

    $header = "From:".sender. "\n";
    $header .= "MIME-Version:1.0" . "\n";
    $header .= "Content-type:text/html;charset=utf-8" . "\n";

    $mailText = $content;
    mail($receiver, $subject, stripslashes(iconv('utf-8', 'iso-8859-1', $mailText)) , $header);

}

服务器是带有后缀的debian。

邮件模板以

<html> <body style="background-color: #fff;"> <table border="0"...

问题是,我无法复制它,在某些情况下,我可以在邮件中找到几个空格,而我没有放在那里。最有问题的是用户和密码字符串中的那些。

其他一切似乎都是正确的!编码没问题,接受html,所有邮件都可以投递...

密码生成:

public static function create_password($length = 12) {
        $characters = array("a", "b", "c", "d", "e", "f", "g", "h", "k", "m", "n", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "_");
        $password = "";
        for($i=0; $i<$length; $i++) {
            $index = rand(1, count($characters)) -1;
            $password .= $characters[$index];
        }
        $password = str_replace("__","_", $password);
        return $password;
    }

任何想法,从哪里开始我的搜索?

是模板,str_replace,后缀,客户端,...?

感谢到目前为止

4

4 回答 4

4

我首先将 HTML 保存到一个单独的文件中,然后用浏览器打开它。

如果你看到空格,那就是 HTML。

如果它看起来不错,邮件就会被破坏。

重整

这通常是因为您的行太长而邮件服务器执行的行数超过 80 列(古代标准)的时髦的东西。

为了防止损坏,我建议以下内容:

  1. 添加标题Content-Transfer-Encoding: base64

  2. 应用于chunk_split(base64_encode(...))整个电子邮件内容。

于 2012-06-15T16:38:39.287 回答
2

我最近遇到了同样的问题,但To:有多个电子邮件地址。以下是技术细节。

根据PHP 文档mail():此字符串的格式必须符合 » RFC 2822。这是用于$to$message参数。

特别是部分:2.1.1。行长限制


该标准对一行中的字符数有两个限制。每行字符必须不超过
998 个字符,并且应该不超过 78 个字符,不包括
CRLF。

998 个字符的限制是由于在发送、接收或存储 Internet 消息格式消息的许多实现中的限制,这些消息根本无法在一行中处理超过 998 个字符。为了健壮性,接收实现可以很好地处理一行中任意大量的字符。但是,有很多实现(符合 [RFC2821] 的传输要求)不接受包含超过 1000 个字符的消息,包括每行的 CR 和 LF,因此不创建此类消息对实现很重要。

更保守的 78 个字符推荐是为了适应显示这些
消息的用户界面的许多实现,这些消息可能会截断或灾难性地换
行,每行超过 78 个字符的显示,尽管这样的
实现不符合本
规范的意图(以及 [RFC2821] 的意图,如果它们实际上导致
信息丢失)。同样,即使对消息施加了这种限制,它也依赖于显示消息的实现

为了健壮性,在一行中处理任意数量的字符
(当然至少达到 998 个字符的限制) 。

有多种方法可以解决整个网络上的问题。

  1. 来自 PHP 文档:$message = wordwrap($message, 70, "\r\n");
  2. 杰克的回答chunk_split(base64_encode(...))
  3. 根据经验:foreach($emails as $email){ $to_email = $email."\n";}
于 2014-02-20T16:47:43.583 回答
1

看起来您可能超出了最大正文行长度,当这种情况发生时,电子邮件客户端会做这样的奇怪事情。不要把你所有的正文内容放在一行上,\n用来创建新的行。

像这样

<html>
    <body style="background-color: #fff;">
        <table border="0"...

代替

<html> <body style="background-color: #fff;"> <table border="0"...
于 2012-06-15T16:43:06.720 回答
0

这个:

stripslashes(iconv('utf-8', 'iso-8859-1', $mailText));

如果您传递的任何字符不是拉丁语(UTF8 编码),将产生一个通知,这意味着它们将被弄乱(停止在第一个非拉丁语,如果有的话)。

于 2012-06-15T16:57:13.547 回答