我目前正在 codeigniter 和 ion auth 库的帮助下开发一个网站。
我正在尝试使用ion auth的标准功能来重置用户密码。
在图书馆中有两个功能:
forgotten_password($identity)
forgotten_password_complete($code)
这两个功能(在验证通过的情况下)向用户发送电子邮件。功能本身有效,但我收到的电子邮件已损坏。电子邮件标题显示为电子邮件正文的一部分。这就是破损的电子邮件的外观:
Date: Fri, 18 Nov 2011 23:36:32 +0100
From: "Example.com" <admin@example.com>
Reply-To: "admin@example.com" <admin@example.com>
X-Sender: admin@example.com
X-Mailer: CodeIgniter
X-Priority: 3 (Normal)
Message-ID: <4ec6ddf0d26a3@example.com>
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary="B_ALT_4ec6ddf0d26b9"
This is a multi-part message in MIME format.
Your email application may not support this format.
--B_ALT_4ec6ddf0d26b9
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
New Password for test_user
Your password has been reset to: 0774b65f5e
--B_ALT_4ec6ddf0d26b9
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
<html>
<body>
<h1>New Password for test_user</h1>
=09
<p>Your password has been reset to: 0774b65f5e</p>
</body>
</html>
--B_ALT_4ec6ddf0d26b9--
然而,我能够找到引起麻烦的线路:
$this->ci->email->set_newline("\r\n");
当我注释掉这一行时(在上面提到的两个函数中),我在重置用户密码时收到的电子邮件都没问题。
有人可以向我解释这条线的目的和是否通过评论该线来解决这个问题是一个好主意。
我还发现了2个问题
指的是相同或至少类似的问题。由于他们已经很老了,还没有得到答复,我创造了一个新的。希望没有人介意。
答案 0 :(得分:3)
不同的操作系统使用不同的字符来确定新行(换行符到下一行的位置。)在HTML中,等效的是<br>
标记。一些(旧的?Mac)传统上使用\r
,一些(Unix)传统上使用\n
,而其他(Windows)传统上使用两者(\r\n
)。
Codeigniter默认为\n
(请参阅documentation),但是离线验证的编写者会覆盖使用\r\n
的{{3}}。standard。
因此,解析电子邮件标题的程序(我最好猜测是基于* nix)会看到非Unix标准的\r\n
行并开始将标题作为正文的一部分吐出。
据我所知,只需\n
即可完成,这就是Codeigniter默认使用它的原因。我见过的每一个遇到麻烦的人的例子都是使用\r\n
并且遇到同样问题的人。
答案 1 :(得分:1)
在CI中,当您对该行进行注释时,该设置默认为'\n'
。该设置取决于PHP使用的邮件服务器。有时postfix和其他一些服务器会将\r\n
替换为导致错误的\r\r\n
,因此在这些情况下最好只使用\n
,因为标准(RFC 822)需要\r\n