2014-12-10 4 views
7

PHPMailer проверяет is_file для каждого вложения (в addAttachment функции, в class.phpmailer.php файле):PHPMailer - крепление с помощью URL

if ([email protected]_file($path)) { 
    throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE); 
} 

Моя проблема заключается в том, что я могу сделать работу is_file только дает полный локальный путь к файлу, а не URL-адресов :

is_file('C:/wamp/www/myFolder/rocks.png');  //True 
is_file('http://localhost/myFolder/rocks.png'); //False :(

Поэтому я не могу прикрепить файлы с удаленного сервера.

Что я делаю неправильно? Это может быть проблема разрешения?

EDIT:

Я знаю, что есть и другие способы, чтобы проверить, существует ли файл.

Но is_file находится в PhpMailer library, я предпочитаю не прикасаться к нему, и я хочу знать, можно ли заставить его работать, используя его методы.

Спасибо.

+1

Дешевле использовать 'get_headers' для проверки существования удаленного файла. – baldrs

+0

@ Джорди, это именно то, о чем я говорю. – baldrs

+0

@baldrs: Я знаю, что есть лучшие способы проверить, существует ли файл, но это написано в функции PhpMailer. Я бы знал, как он может работать. Или это проблема PhpMailer? – T30

ответ

12

Это не требует обходного пути, вы просто используете функцию, явно предназначенную для локальных файлов на удаленном ресурсе. Для присоединения к удаленному ресурсу без привлечения локальных файлов, просто сделать это:

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

Я бы не рекомендовал это непосредственно встроенный подход, поскольку он делает обработку ошибок более трудным (например, если URL не отвечает).

Это по существу дубликат this question.

0

Цитируя PHP docs:

В РНР 5.0.0, эта функция также может быть использована с некоторыми URL-оберток. Обратитесь к поддерживаемым протоколам и упаковщикам, чтобы определить, какие обертки поддерживают семейство функций stat().

Из стандартных потоков, следующая поддержка стат()

  • файл: // - Доступ к локальной файловой системе
  • PHP: // - Доступ к различным I/O потоков
    • PHP : // память
    • PHP: // температура
  • Фар: // - PH P Архив
  • ssh2: // - Secure Shell 2
    • ssh2.sftp
  • RAR: // - RAR

и следующий не

  • HTTP : // - Доступ к URL-адреса HTTP (-ов)
  • zlib: // - Потоки сжатия
  • данные: // - Data (RFC 2397)
  • Глоб: // - Найти файловые пути, совпадающие шаблон
  • ssh2: // - Secure Shell 2
    • ssh2.shell
    • ssh2.exec
    • ssh2.Туннель
    • ssh2.scp
  • OGG: // - Аудио потоки
  • ожидать: // - процесс взаимодействия Streams

Хотя ограничены

  • FTP следующим образом: // - Доступ к FTP-адресам
    • filesize()
    • FILETYPE()
    • file_exists()
    • is_file()
    • is_dir()
    • filemtime() - с PHP 5.1.0
+0

Итак, для вас это может быть проблема с версией? Я использую php 5.4.16 ... – T30

+0

Ничего общего с версией ....вы пытаетесь получить доступ к 'http: // localhost/myFolder/rocks.png', но поток' http: // 'не поддерживает stat(), поэтому' is_file() 'невозможно с этим URL-адресом –

+0

Итак, для вы можете быть проблемой PhpMailer? – T30

0

Позже в коде используется file_get_contents(), чтобы включить содержимое приложения. Пока file_get_contents() поддерживает HTTP, is_file() нет.

Учитывая, что вы не хотите изменять PhpMailer, вам придется загрузить файл из HTTP самостоятельно и предоставить временный путь к PhpMailer. После отправки вы можете удалить временный файл.

Что-то вроде этого (от PHP manual: sys_get_temp_dir и Download 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).

+0

Спасибо! Я проверю ваш код, хотя я нашел решение (см. Мой ответ). Я не могу понять, если я использую эту библиотеку неправильно, или все, кто ее использует, имеют эту проблему. – T30

+0

Это дает мне две ошибки: Предупреждение: 'tempnam() [function.tempnam]: SAFE РЕЖИМ РЕЖИМА. Сценарий, которому uid равен 10328, не имеет права доступа/tmp, принадлежащего uid 0' для второй строки, и 'Warning: file_put_contents() [function.file-put-contents]: имя файла не может быть пустым' для третьего. .. – T30

+0

Я не знаю, что такое лучшая практика. Возможно, создайте записываемый каталог под вашим www-root вместо использования 'sys_get_temp_dir()'. – CodeCaster

Смежные вопросы