Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHPMailer-使用URL附加远程文件_Php_Email_Phpmailer - Fatal编程技术网

PHPMailer-使用URL附加远程文件

PHPMailer-使用URL附加远程文件,php,email,phpmailer,Php,Email,Phpmailer,检查每个附件的is_文件(在addAttachment功能中,在文件中): 我的问题是,我可以使工作is_file只提供文件的完整本地路径,而不是URL: is_file('C:/wamp/www/myFolder/rocks.png'); //True is_file('http://localhost/myFolder/rocks.png'); //False :( 因此,我无法从远程服务器附加任何文件 我做错了什么??这可能是权限问题 编辑: 我知道还有其他方法可以检查文件是否

检查每个附件的
is_文件
(在
addAttachment
功能中,在文件中):

我的问题是,我可以使工作
is_file
只提供文件的完整本地路径,而不是URL:

is_file('C:/wamp/www/myFolder/rocks.png');      //True
is_file('http://localhost/myFolder/rocks.png'); //False :(
因此,我无法从远程服务器附加任何文件

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

编辑:

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

但是
是\u文件
在中,我不想碰它,我想知道是否可以使用它的方法使它工作

谢谢。

引用:

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

在标准流中,以下support stat()

  • 文件://-访问本地文件系统
  • php://-访问各种I/O流
    • php://memory
    • php://temp
  • phar://-PHP存档
  • ssh2://-固定外壳2
    • ssh2.sftp
  • rar://-rar
而以下情况则不适用

  • http://-访问http(s)URL
  • zlib://-压缩流
  • 数据://-数据(RFC 2397)
  • glob://-查找匹配模式的路径名
  • ssh2://-固定外壳2
    • ssh2.shell
    • ssh2.exec
    • ssh2.1隧道
    • ssh2.scp
  • ogg://-音频流
  • expect://-进程交互流
而以下是有限的

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

在后面的代码中,它使用
文件获取内容()
包含附件的内容。虽然
file\u get\u contents()
支持HTTP,但
是\u file()
不支持

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

类似这样的内容(来自和):


然后,您可以附加
$tempFile
,发送邮件并
取消链接($tempFile)

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

$mail->addStringAttachment(file_get_contents($url), 'filename');
我不推荐这种直接内联方法,因为它会使错误处理更加困难(例如,如果URL没有响应)


这本质上是的副本。

使用
get_headers
检查远程文件是否存在更便宜。@Jordy这正是我要说的。@baldrs:我知道有更好的方法来检查文件是否存在,但这是在PhpMailer函数中编写的。我知道它是如何工作的。提示:从PHP5.0.0开始,这个函数也可以与一些URL包装一起使用。请参阅支持的协议和包装器,以确定哪些包装器支持stat()系列功能。HTTP没有文件与目录的概念,因此is_file()/is_dir()结果未定义…与版本无关。。。。您正在尝试访问
http://localhost/myFolder/rocks.png
但是
http://
流不支持stat(),因此
is_file()
不可能与该URL一起使用,因此对您来说这可能是一个PHP编译器问题?谢谢!即使找到了解决方案,我也会测试您的代码(请参阅我的答案)。我无法理解的是,我是否以错误的方式使用了这个库,或者所有使用它的人都有这个问题。它给了我两个错误:警告:
tempnam()[function.tempnam]:安全模式限制生效。第二行不允许uid为10328的脚本访问uid 0所拥有的/tmp
,第三行不允许访问警告:file\u put\u contents()[function.file put contents]:Filename不能为空。我不知道最佳做法是什么。也许可以在您的www根目录下创建一个可写目录,而不是使用
sys\u get\u temp\u dir()
。使用它,效果非常好。向你致敬!
$attachmentUrl = "http://example.com/image.jpg";
$tempFile = tempnam(sys_get_temp_dir(), 'mailattachment');  
file_put_contents($tempFile, $attachmentUrl);
$mail->addStringAttachment(file_get_contents($url), 'filename');