使用 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发送图像

如何使用ajax发送大图像或其base64字符串?

无法使用文件路径将通用 base64 图像发送到 API

获取 Base64 编码的图像并使用 ExpressJS 作为图像发送

无法将 base64 字符串发送到 PubNub