PHPMailer - 使用 URL 附加远程文件

Posted

技术标签:

【中文标题】PHPMailer - 使用 URL 附加远程文件【英文标题】:PHPMailer - attach remote file with URL 【发布时间】:2015-02-08 22:00:45 【问题描述】:

phpMailer 检查每个附件的is_file(在addAttachment 函数中,在class.phpmailer.php 文件中):

if (!@is_file($path)) 
    throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);

我的问题是 is_file 只能提供文件的完整本地路径,而不是 URL:

is_file('C:/wamp/www/myFolder/rocks.png');      //True
is_file('http://localhost/myFolder/rocks.png'); //False :(

所以我无法从远程服务器附加任何文件。

我做错了什么??可能是权限问题?

编辑:

我知道还有其他方法可以检查文件是否存在。

但是is_file在PhpMailer library中,我宁愿不去碰它,我想知道是否有可能使用它的方法让它工作。

谢谢。

【问题讨论】:

使用get_headers检查远程文件是否存在比较便宜。 @Jordy 这正是我在说的。 @baldrs:我知道有更好的方法来检查文件是否存在,但这是写在 PhpMailer 函数中的。我会知道它是如何工作的。还是 PhpMailer 问题? 提示 从 PHP 5.0.0 开始,这个函数也可以与一些 URL 包装器一起使用。请参阅支持的协议和包装器以确定哪些包装器支持 stat() 系列功能。 HTTP 没有文件与目录的概念,因此 is_file() / is_dir() 结果未定义... 【参考方案1】:

它不需要解决方法,您只是使用一个明确用于远程资源上的本地文件的函数。要附加远程资源而不涉及本地文件,只需执行以下操作:

$mail->addStringAttachment(file_get_contents($url), 'filename');

我不推荐这种直接内联的方法,因为它使错误处理更加困难(例如,如果 URL 无法响应)。

这本质上是this question 的副本。

【讨论】:

用过这个,效果很好。向你致敬!【参考方案2】:

稍后在代码中它使用file_get_contents() 来包含附件的内容。 file_get_contents() 支持 HTTP,is_file() 不支持。

鉴于您不想更改 PhpMailer,您必须自己从 HTTP 下载文件并提供 PhpMailer 的临时路径。发送后可以删除临时文件。

类似这样的东西(来自PHP manual: sys_get_temp_dir 和Download File to server from URL):

$attachmentUrl = "http://example.com/image.jpg";
$tempFile = tempnam(sys_get_temp_dir(), 'mailattachment');  
file_put_contents($tempFile, $attachmentUrl);

然后您可以附加$tempFile,发送您的邮件和unlink($tempFile)

【讨论】:

谢谢!即使我找到了解决方案,我也会测试您的代码(请参阅我的答案)。我无法理解的是如果我以错误的方式使用这个库,或者所有使用它的人都有这个问题.. 它给了我两个错误:警告:tempnam() [function.tempnam]: SAFE MODE Restriction in effect. The script whose uid is 10328 is not allowed to access /tmp owned by uid 0 用于第二行,Warning: file_put_contents() [function.file-put-contents]: Filename cannot be empty 用于第三行... 我不知道最佳实践是什么。也许在您的 www-root 下创建一个可写目录,而不是使用 sys_get_temp_dir()【参考方案3】:

引用PHP docs:

从 PHP 5.0.0 开始,这个函数也可以与一些 URL 包装器一起使用。请参阅支持的协议和包装器以确定哪些包装器支持 stat() 系列功能。

标准流中,以下支持stat()

file:// — 访问本地文件系统 php:// — 访问各种 I/O 流 php://内存 php://temp phar:// — PHP 存档 ssh2:// — 安全外壳 2 ssh2.sftp rar:// — RAR

以下没有

http:// — 访问 HTTP(s) URL zlib:// — 压缩流 data:// — 数据 (RFC 2397) glob:// — 查找匹配模式的路径名 ssh2:// — 安全外壳 2 ssh2.shell ssh2.exec ssh2.tunnel ssh2.scp ogg:// — 音频流 expect:// — 处理交互流

虽然以下内容有限

ftp:// - 访问 FTP(s) URL 文件大小() 文件类型() file_exists() is_file() is_dir() filemtime() — 自 PHP 5.1.0 起

【讨论】:

与版本无关......您正在尝试访问http://localhost/myFolder/rocks.png,但http:// 流不支持stat(),因此is_file() 无法使用该网址 所以对你来说可能是 PhpMailer 问题?

以上是关于PHPMailer - 使用 URL 附加远程文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHPMailer 从 PC 将文件附加到电子邮件

PHPMailer 不发送带有附加 zip 文件的邮件

如何使用PHPMailer将多个文件附加到两个不同的电子邮件中?

使用 dompdf 的 phpmailer 动态文件

使用 mPDF 和 PHPmailer 即时附加 PDF

PHPMailer:使用远程SMTP服务器,在localhost下工作,远程服务器上的Connection refused(111)