2014-12-10 9 views
7

PHPMailer sprawdza is_file dla każdego przywiązania (w addAttachment funkcji w class.phpmailer.php pliku):PHPMailer - załącznik z URL

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

Moim problemem jest to, że mogę zrobić pracę is_file tylko dając pełną ścieżkę lokalną do pliku, a nie URL :

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

Dlatego nie mogę dołączyć żadnego pliku ze zdalnego serwera.

Co robię źle? Może to być problem z uprawnieniami?

EDIT:

wiem, że istnieją inne sposoby, aby sprawdzić, czy plik istnieje.

Ale is_file jest w PhpMailer library, wolę go nie dotykać i chcę wiedzieć, czy można go uruchomić przy użyciu jego metod.

Dzięki.

+1

Taniej jest używać 'get_headers' do sprawdzania istnienia zdalnego pliku. – baldrs

+0

@Jordy to dokładnie to, o czym mówię. – baldrs

+0

@baldrs: Wiem, że istnieją lepsze sposoby sprawdzenia, czy plik istnieje, ale jest to napisane w funkcji PhpMailer. Wiedziałbym, jak to działa. Lub jest to problem PhpMailer? – T30

Odpowiedz

12

Nie wymaga obejścia, wystarczy użyć funkcji jawnie przeznaczonej dla plików lokalnych na zdalnym zasobie. Aby dołączyć do zdalnego zasobu bez angażowania lokalnych plików, po prostu to zrobić:

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

ja nie polecam tego bezpośrednio inline podejście, ponieważ sprawia, że ​​obsługa błędów trudniejsze (np jeśli URL nie odpowiada). Jest to zasadniczo duplikat this question.

0

Cytowanie od PHP docs:

Od PHP 5.0.0, ta funkcja może być użyta także z niektórymi nakładkami URL. Zapoznaj się z częścią Obsługiwane protokoły i opakowania, aby dowiedzieć się, które opakowania obsługują funkcjonalność funkcji stat().

ze standardowych strumieni następujące wsparcie stat()

  • file: // - Dostęp lokalny system plików
  • php: // - dostępu do różnych I/O strumieni
    • php : // pamięć
    • php: // temp
  • Phar: // - PH P Archiwum
  • ssh2: // - Secure Shell 2
    • ssh2.sftp
  • rar: // - RAR

a następnego nie

  • http : // - Dostęp do adresów URL HTTP
  • zlib: // - Strumienie kompresji
  • dane: // - Dane (RFC 2397)
  • glob: // - Znajdź ścieżek pasujący wzorzec
  • SSH2: // - Secure Shell 2
    • ssh2.shell
    • ssh2.exec
    • ssh2.Tunel
    • ssh2.scp
  • ogg: // - strumieni audio
  • spodziewać: // - interakcji strumieni procesowych

Podczas ograniczania

  • ftp następujące: // - Uzyskiwanie dostępu do adresów URL (adresów URL)
    • filesize()
    • filetype()
    • file_exists()
    • is_file()
    • is_dir()
    • filemtime() - od PHP 5.1.0
+0

Dla Ciebie może to być problem z wersją? Używam php 5.4.16 ... – T30

+0

Nic wspólnego z wersją ....próbujesz uzyskać dostęp do 'http: // localhost/myFolder/rocks.png', ale strumień' http: // 'nie obsługuje stat(), więc' is_file() 'nie jest możliwe z tym adresem –

+0

Więc dla czy to może być problem z PhpMailer? – T30

0

Później w kodzie używa file_get_contents(), aby dołączyć zawartość załącznika. Podczas gdy file_get_contents() obsługuje HTTP, is_file() nie.

Ponieważ nie chcesz modyfikować PhpMailer, musisz sam pobrać plik z HTTP i podać tymczasową ścieżkę do PhpMailer. Po wysłaniu możesz usunąć plik tymczasowy.

Coś takiego (od PHP manual: sys_get_temp_dir i Download File to server from URL):

$attachmentUrl = "http://example.com/image.jpg"; 
$tempFile = tempnam(sys_get_temp_dir(), 'mailattachment'); 
file_put_contents($tempFile, $attachmentUrl); 

Następnie można dołączyć $tempFile, wysyłać pocztę i unlink($tempFile).

+0

Dziękujemy! Przetestuję Twój kod, mimo że znalazłem rozwiązanie (zobacz moją odpowiedź). Nie mogę zrozumieć, czy używam tej biblioteki w niewłaściwy sposób, czy też wszyscy, którzy jej używają, mają ten problem .. – T30

+0

Daje mi dwa błędy: Ostrzeżenie: 'tempnam() [function.tempnam]: SAFE TRYB Ograniczenie w działaniu. Skrypt, którego uid ma wartość 10328, nie ma dostępu do/tmp posiadanego przez uid 0' dla drugiej linii i 'Ostrzeżenie: file_put_contents() [plik-zawartość-pliku]: Nazwa pliku nie może być pusta' dla trzeciej. .. – T30

+0

Nie wiem, jaka jest najlepsza praktyka. Być może utwórz katalog z możliwością zapisu pod swoim www-root zamiast używać 'sys_get_temp_dir()'. – CodeCaster