PHPMailer - 使用 URL 附加远程文件

问题描述 投票:0回答:4

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库中,我不想碰它,我想知道是否可以使用它的方法让它工作。

谢谢。

php email phpmailer
4个回答
27
投票

它不需要解决方法,您只需使用明确用于远程资源上的本地文件的函数即可。这是 PHPMailer 故意的选择,因为它不想充当 HTTP 客户端——这是一个完全独立的工作,最好由其他代码处理。要附加远程资源而不涉及本地文件,只需执行以下操作:

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

虽然这使得 HTTP 请求成为你的责任(正如 PHPMailer 的意图),但我不推荐这种直接内联方法,因为它会使错误处理更加困难(例如,如果 URL 无法响应)。

这本质上是

这个问题的重复。


1
投票
稍后在代码中它使用

file_get_contents()

 来包含附件的内容。虽然 
file_get_contents()
 支持 HTTP,但 
is_file()
 不支持。 

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

类似这样的东西(来自

PHP手册:sys_get_temp_dir从URL下载文件到服务器):

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

然后您可以附加

$tempFile

,发送邮件并
unlink($tempFile)


0
投票
引用自

PHP文档

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

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

    file:// — 访问本地文件系统
  • php:// — 访问各种 I/O 流
    • php://内存
    • php://临时
  • phar:// — PHP 存档
  • ssh2:// — 安全外壳 2
    • ssh2.sftp
  • rar:// — RAR
以下情况则不

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

    ftp:// — 访问 FTP URL
    • 文件大小()
    • 文件类型()
    • file_exists()
    • is_file()
    • is_dir()
    • filemtime() — 从 PHP 5.1.0 开始

0
投票
我只是网络开发的初学者,也许我错了,但我有这段代码可以工作:

$filePath1 = __DIR__ . "/files/" . $_FILES['foto-item']['name'];

__DIR__

表示文件的绝对路径。它适用于本地和远程服务器。

© www.soinside.com 2019 - 2024. All rights reserved.