使用 CodeIgniter 发送 base64 编码的电子邮件
Posted
技术标签:
【中文标题】使用 CodeIgniter 发送 base64 编码的电子邮件【英文标题】:Send base64 encoded email using CodeIgniter 【发布时间】:2015-09-21 13:55:57 【问题描述】:我正在尝试。 代码下方:
$message = base64_encode($body);
$config = Array('protocol' => 'smtp', 'smtp_host' => $smtp, 'smtp_port' => $port, 'smtp_user' => $user, 'smtp_pass' => $pass, 'mailtype' => 'html', 'charset' => 'utf-8','_bit_depths' => array('7bit', '8bit', 'base64'),'_encoding' => 'base64',);
$this->load->library('email', $config);
$this->email->set_newline("\r\n");
$this->email->from($disemail, $disname);
$this->email->reply_to($disemail, $disname);
$this->email->to($email);
$this->email->subject($subject);
$this->email->message($message);
但电子邮件发送不正确。我刚刚在邮件中发现了 base64 编码文本,而不是 base64 解码。
这里是发送的调试:
Mime 版本:1.0
内容类型:多部分/替代;边界="B_ALT_5596ca8577c5c" 这是 MIME 格式的多部分消息。您的电子邮件应用程序 可能不支持这种格式。
--B_ALT_5596ca8577c5c 内容类型:文本/纯文本; charset=utf-8 内容传输编码:base64
PGh0bWw+PGJvZHk+PGgxPnRoaXMgaXMgaHRtbDwvaDE+PC9ib2R5PjwvaHRtbD4=
--B_ALT_5596ca8577c5c Content-Type: text/html; charset=utf-8 内容传输编码:quoted-printable
PGh0bWw+PGJvZHk+PGgxPnRoaXMgaXMgaHRtbDwvaDE+PC9ib2R5PjwvaHRtbD4=3D
--B_ALT_5596ca8577c5c--
我找不到确切的问题。
我正在使用 CodeIgniter 版本2.1.3
。
【问题讨论】:
那么您对收件人的期望是什么? 收件人浏览器将对此进行解码。您没有看到任何编码的电子邮件吗? 设置Content-Transfer-Encoding:
标头。 (顺便说一句,一个完全基于 base64 的主体可能会触发更多垃圾邮件过滤器。)
@mario , '_encoding' => 'base64'
正在这样做。
How to send an email in base64 encode in CodeIgniter? 的可能重复项
【参考方案1】:
您必须将内容的标题设置为Content-Transfer-Encoding:base64
。默认情况下 CodeIgniter 不设置此项。为此,您要么必须修改他们的电子邮件库,要么只需扩展他们的电子邮件类并添加此标头,以符合标准并确保您不会破解核心。
【讨论】:
请在此处查看答案。 ***.com/questions/7804198/… 我认为` '_encoding' => 'base64' ` 正在这样做 @slash-bang:这取决于您如何实现 - 但关键是内容类型标头需要相应更改,以便它可以识别 base64。我不认为它是'_encoding'。输出类标头通常接受确切的 HTTP 标头键 我已经更新了这个问题。请检查调试消息。【参考方案2】:CodeIgniter 版本2.1.3
没有base64
编码电子邮件的任何选项。在核心文件中编辑后,找到了解决方案。我已经分享了解决方案。
答案:
注意:这是对核心文件的破解。如果您只需要 base64 编码的消息,请尝试一下。否则创建额外的库文件。
我们需要在库文件 email.php 中编辑一些内容。位于“libraries/Email.php”中。
仅用于文本消息。
1/
首先添加base64
作为编码选项。
编辑:$_bit_depths
变量。
var $_bit_depths = array('7bit', '8bit','base64');
2/
然后在发送控制器。在电子邮件配置中添加'_encoding' => 'base64'
。检查我有问题的代码。
HTML 消息
执行第 1 步和第 2 步。然后执行以下步骤:
3/
在 Email.php 文件中,找到函数 function _build_message()
。
在这个函数中,找到switch ($this->_get_content_type())
,到case 'html '
,并删除或评论两个地方。
以下编辑代码:
case 'html' :
if ($this->send_multipart === FALSE)
$hdr .= "Content-Type: text/html; charset=" . $this->charset . $this->newline;
$hdr .= "Content-Transfer-Encoding: quoted-printable";
else
$hdr .= "Content-Type: multipart/alternative; boundary=\"" . $this->_alt_boundary . "\"" . $this->newline . $this->newline;
$body .= $this->_get_mime_message() . $this->newline . $this->newline;
$body .= "--" . $this->_alt_boundary . $this->newline;
// change this to text/plain to text/html
$body .= "Content-Type: text/html; charset=" . $this->charset . $this->newline;
$body .= "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline;
// I have commented 3 lines
/*
$body .= $this->_get_alt_message() . $this->newline . $this->newline . "--" . $this->_alt_boundary . $this->newline;
$body .= "Content-Type: text/html; charset=" . $this->charset . $this->newline;
$body .= "Content-Transfer-Encoding: quoted-printable" . $this->newline . $this->newline;
*/
//Instead of this commented line, use line below.
//$this->_finalbody = $body . $this->_prep_quoted_printable($this->_body) . $this->newline . $this->newline;
$this->_finalbody = $body . $this->_body . $this->newline . $this->newline;
就是这样。现在 base64 编码的电子邮件将正确发送。
【讨论】:
以上是关于使用 CodeIgniter 发送 base64 编码的电子邮件的主要内容,如果未能解决你的问题,请参考以下文章
Summernote 图像上传在 codeigniter 中不起作用
OpenCV在带有C++的iOS上使用base64通过HTTP发送图像