PHPMailer checks is_file
for every attachment (in addAttachment
function, in class.phpmailer.php file):
if (!@is_file($path)) {
throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
}
My problem is that I can make work is_file
only giving full local path to file, not URLs:
is_file('C:/wamp/www/myFolder/rocks.png'); //True
is_file('http://localhost/myFolder/rocks.png'); //False :(
So I can't attach any file from the remote server.
What am I doing wrong?? It can be a permission issue?
EDIT:
I know that there are other ways to check if file exists.
But is_file
is in the PhpMailer library, I prefer to not touch it and I want to know if it's possible to make it work using its methods.
Thanks.
It doesn't need a workaround, you're just using a function explicitly intended for local files on a remote resource. To attach a remote resource without involving local files, just do this:
$mail->addStringAttachment(file_get_contents($url), 'filename');
I would not recommend this directly inline approach because it makes error handling more difficult (e.g. if the URL fails to respond).
This is essentially a duplicate of this question.
Later in code it uses file_get_contents()
to include the attachment's contents. While file_get_contents()
supports HTTP, is_file()
doesn't.
Given you don't want to alter PhpMailer, you'll have to download the file from HTTP yourself and provide the temporary path to PhpMailer. After sending you can delete the temporary file.
Something like this (from PHP manual: sys_get_temp_dir and Download File to server from URL):
$attachmentUrl = "http://example.com/image.jpg";
$tempFile = tempnam(sys_get_temp_dir(), 'mailattachment');
file_put_contents($tempFile, $attachmentUrl);
Then you can attach $tempFile
, send your mail and unlink($tempFile)
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With