PHP和PHPMailer:禁用fopen时无法发送附件

问题描述

我使用PHPMailer已有十年,没有任何问题。 但是,现在我的服务器需要禁用PHP中的“ fopen”,而PHPMailer中的“ file_get_contents”会受到影响。 我尝试使用CURL而不是“ file_get_contents”。 一切正常,可以发送文本,但是无法发送附件。 这是我使用的CURL,而不是“ file_get_contents”:

function file_get_contents_curl($url) {
  $ch = curl_init();
  curl_setopt($ch,CURLOPT_AUTOREFERER,TRUE);
  curl_setopt($ch,CURLOPT_HEADER,0);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
  curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);       
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}

我使用PHPMailer 6.1.6。 问题出在PHPMailer.PHP中,函数encodeFile @第3143行

$file_buffer = file_get_contents($path);

如何发送不含“ file_get_contents”的文件; 请帮帮我,我尝试修复一个月。

先谢谢您。 不。


发送邮件时出现错误

30352#0:* 9113244在stderr中发送的FastCGI:“ PHP消息:PHP致命错误:未捕获的PHPMailer \ PHPMailer \ Exception:文件错误:无法打开文件:/ var / www / vhosts /中的temp / attachFile.jpg kjubzz.com/PHP7v5.kjubzz.com/lib/PHPMailer/src/PHPMailer.PHP:3147 堆栈跟踪:

#0 /var/www/vhosts/kjubzz.com/PHP7v5.kjubzz.com/lib/PHPMailer/src/PHPMailer.PHP(3115):PHPMailer \ PHPMailer \ PHPMailer-> encodeFile()

#1 /var/www/vhosts/kjubzz.com/PHP7v5.kjubzz.com/lib/PHPMailer/src/PHPMailer.PHP(2624):PHPMailer \ PHPMailer \ PHPMailer-> attachAll()

#2 /var/www/vhosts/kjubzz.com/PHP7v5.kjubzz.com/lib/PHPMailer/src/PHPMailer.PHP(1532):PHPMailer \ PHPMailer \ PHPMailer-> createBody()

#3 /var/www/vhosts/kjubzz.com/PHP7v5.kjubzz.com/lib/PHPMailer/src/PHPMailer.PHP(1430):PHPMailer \ PHPMailer \ PHPMailer-> preSend()

#4 /var/www/vhosts/kjubzz.com/PHP7v5.kjubzz.com/contact3.PHP(157):PHPMailer \ PHPMailer \ PHPMailer-> send()

#5 {main} 在读取上游消息的同时,在第3147行上将其扔进/var/www/vhosts/kjubzz.com/PHP7v5.kjubzz.com/lib/PHPMailer/src/PHPMailer.PHP

解决方法

我回答了on Github

我在这里的主要建议是切换到提供适当PHP配置的托管服务提供商。

否则,您可以以任何方式检索文件(curl很好),但是如果根本无法直接读取或写入本地文件,则所有这些都需要在内存中进行,PHPMailer提供了addStringAttachment( )方法即可执行此操作,因此您可以按照以下代码操作:

$ mail-> addStringAttachment(file_get_contents_curl($ url),'myimage.jpg'); 它应该全部解决。请记住,尽管您需要比我在这里建议的要谨慎一些-在将结果交给PHPMailer之前,您需要对响应进行一些错误检查,以防万一获取失败。