PHPMailer -使用URL附加远程文件

zujrkrfu  于 2023-03-28  发布在  PHP
关注(0)|答案(4)|浏览(147)

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_filePhpMailer library中,我不想碰它,我想知道是否有可能使用它的方法使它工作。
谢谢。

kuhbmx9i

kuhbmx9i1#

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

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

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

dm7nw8vv

dm7nw8vv2#

在后面的代码中,它使用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)

gmxoilav

gmxoilav3#

引用PHP docs
从PHP 5.0.0开始,此函数也可以用于一些URL Package 器。请参阅支持的协议和 Package 器以确定哪些 Package 器支持stat()系列功能。
在标准流中,以下流支持stat()

  • file://-访问本地文件系统
  • php:// -访问各种I/O流
  • php://内存
  • php://temp
  • phar:// - PHP Archive
  • ssh 2:// -安全 shell 2
  • ssh2.sftp
  • rar:// - RAR

而以下则不

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

虽然以下是有限的

  • ftp://-访问FTP URL
  • 文件大小()
  • 文件类型()
  • 文件存在()
  • 是_文件()
  • 是_目录()
  • filemtime()-从PHP 5.1.0开始
falq053o

falq053o4#

我只是Web开发的初学者,也许我错了,但我有这样的代码工作($filePath1 = DIR ."/files/”. $_FILES ['foto-item']['name'];)
DIR”表示文件的绝对路径。它在本地和远程服务器上都有效

相关问题