CodeIgniter 重命名电子邮件附件文件

Posted

技术标签:

【中文标题】CodeIgniter 重命名电子邮件附件文件【英文标题】:CodeIgniter rename email attachment file 【发布时间】:2013-08-10 07:08:03 【问题描述】:

我有用于发送带有附件的电子邮件的 CodeIgniter 脚本。

$this->ci->email->attach("/path/to/file/myjhxvbXhjdSycv1y.pdf");

效果很好,但我不知道如何将附件重命名为更用户友好的字符串?

【问题讨论】:

rename() 附加文件之前服务器上的文件。 我无法在服务器目录上重命名它。发送前必须“即时”执行 您必须修改 CI 的电子邮件库才能使其正常工作。就目前的库而言,这是不可能的,尽管它是一个相当容易的修改。 很好,它有效,谢谢你的帮助! 【参考方案1】:

CodeIgniter v3.x

从CI v3开始添加此功能:

/**
 * Assign file attachments
 *
 * @param   string  $file   Can be local path, URL or buffered content
 * @param   string  $disposition = 'attachment'
 * @param   string  $newname = NULL
 * @param   string  $mime = ''
 * @return  CI_Email
 */
public function attach($file, $disposition = '', $newname = NULL, $mime = '')

根据user guide:

如果您想使用自定义文件名,可以使用第三个 参数:

$this->email->attach('filename.pdf', 'attachment', 'report.pdf');


CodeIgniter v2.x

但是对于 CodeIgniter v2.x,您可以扩展 Email 库来实现它:

    创建system/libraries/Email.php 的副本并将其放入application/libraries/ 重命名文件并添加MY_前缀(或您在config.php中设置的任何内容)application/libraries/MY_Email.php 打开文件并更改以下内容:

首先:#72行插入:

var $_attach_new_name = array();

第二:#161-166行的代码改为:

if ($clear_attachments !== FALSE)

    $this->_attach_new_name = array();
    $this->_attach_name     = array();
    $this->_attach_type     = array();
    $this->_attach_disp     = array();

第三:#409行找到attach()函数并将其更改为:

public function attach($filename, $disposition = 'attachment', $new_name = NULL)

    $this->_attach_new_name[] = $new_name;
    $this->_attach_name[]     = $filename;
    $this->_attach_type[]     = $this->_mime_types(pathinfo($filename, PATHINFO_EXTENSION));
    $this->_attach_disp[]     = $disposition; // Can also be 'inline'  Not sure if it matters
    return $this;

第四:最后在#1143行将代码更改为:

$basename = ($this->_attach_new_name[$i] === NULL)
    ? basename($filename) : $this->_attach_new_name[$i];

用法

$this->email->attach('/path/to/fileName.ext', 'attachment', 'newFileName.ext');

【讨论】:

Hashem 的回答很棒,但您必须覆盖到核心 Email.php 库,因此无需在副本前加上 MY_【参考方案2】:

该方法也适用于 CodeIgniter v1.7x

但你一定不要忘记修改下面的这个函数来添加$this->_attach_new_name也被清理:

public function clear($clear_attachments = FALSE)
    $this->_subject     = "";
    $this->_body        = "";
    $this->_finalbody   = "";
    $this->_header_str  = "";
    $this->_replyto_flag = FALSE;
    $this->_recipients  = array();
    $this->_cc_array    = array();
    $this->_bcc_array   = array();
    $this->_headers     = array();
    $this->_debug_msg   = array();
    $this->_set_header('User-Agent', $this->useragent);
    $this->_set_header('Date', $this->_set_date());
    if ($clear_attachments !== FALSE)
        $this->_attach_new_name = array();
        $this->_attach_name     = array();
        $this->_attach_type     = array();
        $this->_attach_disp     = array();
    
    return $this;
  

【讨论】:

以上是关于CodeIgniter 重命名电子邮件附件文件的主要内容,如果未能解决你的问题,请参考以下文章

从 codeigniter 中的视图发送动态电子邮件附件

当我有来自的命名附件时,Outlook 365 不接受 Python 电子邮件消息库输出

Lotus Notes 富文本中的 AX 2009 附件

当我使用 codeigniter 电子邮件类发送电子邮件时显示 html 源的电子邮件

PHP 获取电子邮件附件

从 Outlook 下载附件并在 Excel 中打开