Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHPMailer - attach remote file with URL

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.

like image 441
T30 Avatar asked Dec 10 '14 16:12

T30


2 Answers

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.

like image 130
Synchro Avatar answered Oct 31 '22 21:10

Synchro


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).

like image 1
CodeCaster Avatar answered Oct 31 '22 21:10

CodeCaster