PHPMailer - 使用URL附加远程文件

时间:2014-12-10 16:06:13

标签: php email phpmailer

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

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

我的问题是,我可以让工作is_file仅提供文件的完整本地路径,而不是网址:

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

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

我做错了什么?这可能是许可问题吗?

修改

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

但是is_file位于PhpMailer library,我宁愿不接触它,我想知道是否可以使用它的方法使其工作。

感谢。

3 个答案:

答案 0 :(得分:17)

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

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

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

这基本上是this question的副本。

答案 1 :(得分:0)

引用PHP docs

  

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

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

  • file:// - 访问本地文件系统
  • php:// - 访问各种I / O流
    • php:// memory
    • PHP://温度
  • phar:// - PHP存档
  • ssh2:// - Secure Shell 2
    • ssh2.sftp
  • rar:// - RAR

以下不

  • http:// - 访问HTTP(s)URL
  • zlib:// - 压缩流
  • data:// - 数据(RFC 2397)
  • glob:// - 查找匹配模式的路径名
  • ssh2:// - Secure Shell 2
    • ssh2.shell
    • ssh2.exec
    • ssh2.tunnel
    • ssh2.scp
  • ogg:// - 音频流
  • expect:// - Process Interaction Streams

以下内容有限

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

答案 2 :(得分:0)

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

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

这样的事情(来自PHP manual: sys_get_temp_dirDownload 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)