2014-12-10 20 views
7

PHPMailer prüft is_file für jede Befestigung (in addAttachment Funktion, in class.phpmailer.php-Datei):PHPMailer - Befestigung mit URL

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

Mein Problem ist, dass ich is_file Arbeit machen kann nur vollständigen lokalen Pfad geben Datei, keine URLs :

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

So kann ich keine Datei vom Remote-Server anhängen.

Was mache ich falsch ?? Es kann sich um ein Berechtigungsproblem handeln.

EDIT:

Ich weiß, dass es andere Möglichkeiten gibt zu prüfen, ob Datei vorhanden ist.

Aber is_file ist in der PhpMailer library, ich bevorzuge es nicht zu berühren und ich möchte wissen, ob es möglich ist, es mit seinen Methoden arbeiten zu lassen.

Danke.

+1

Es ist billiger, 'get_headers' zu verwenden, um das Vorhandensein von entfernten Dateien zu überprüfen. – baldrs

+0

@Jordy das ist genau das, worüber ich spreche. – baldrs

+0

@baldrs: Ich weiß, dass es bessere Möglichkeiten gibt zu überprüfen, ob eine Datei existiert, aber dies ist in der PhpMailer-Funktion geschrieben. Ich würde wissen, wie es funktionieren kann. Oder ist es ein PhpMailer-Problem? – T30

Antwort

12

Es ist keine Umgehung erforderlich, Sie verwenden nur eine Funktion, die explizit für lokale Dateien auf einer Remote-Ressource vorgesehen ist. Um eine Remote-Ressource zu befestigen, ohne lokale Dateien beteiligt, gerade dies zu tun:

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

Ich kann diesen direkt inline Ansatz nicht empfehlen, weil es Fehler macht Handhabung erschwert (zum Beispiel wenn die URL nicht mehr reagiert).

Dies ist im Wesentlichen ein Duplikat von this question.

0

Zitiert aus den PHP docs:

Ab PHP 5.0.0 kann diese Funktion auch mit einigem URL-Wrapper verwendet werden. Unter Unterstützte Protokolle und Wrapper können Sie ermitteln, welche Wrapper die stat() - Funktionsfamilie unterstützen.

Von den Standard-Streams, die folgende Unterstützung stat()

  • file: // - Zugriff auf lokale Dateisystem
  • php: // - Zugriff auf verschiedene I/O Streams
    • php : // Speicher
    • php: // Temp
  • phar: // - PH P Archiv
  • ssh2: // - Secure Shell 2
    • ssh2.sftp
  • rar: // - RAR

und die folgenden nicht

  • http : // - Zugriff auf HTTP (s) URLs
  • zlib: // - Komprimierungsströme
  • Daten: // - Daten (RFC 2397)
  • glob: // - Finden Pfadnamen Anpassungsmuster
  • ssh2: // - Secure Shell 2
    • ssh2.shell
    • ssh2.exec
    • ssh2.
    • Tunnel
    • ssh2.scp
  • ogg: // - Audio-Streams
  • erwarten: // - Prozess Interaktion Streams

Während die begrenzt sind folgende

  • ftp: // - Zugriff auf FTP (s) URLs
    • filesize()
    • Datei des Typs()
    • file_exists()
    • is_file()
    • is_dir()
    • filemtime() - seit PHP 5.1.0
+0

Also für Sie kann es ein Versions-Problem sein? Ich benutze PHP 5.4.16 ... – T30

+0

Nichts mit Version zu tun ....Sie versuchen, auf "http: // localhost/myFolder/rocks.png" zuzugreifen, aber der 'http: //' -Stream unterstützt stat() nicht, so 'is_file()' ist nicht möglich mit dieser URL –

+0

Also für Sie können ein PhpMailer Problem sein? – T30

0

in Code Später nutzt file_get_contents(), um den Inhalt des Anhangs einzuschließen. Während file_get_contents() unterstützt HTTP, is_file() nicht.

Da Sie PhpMailer nicht ändern möchten, müssen Sie die Datei selbst von HTTP herunterladen und den temporären Pfad zu PhpMailer bereitstellen. Nach dem Senden können Sie die temporäre Datei löschen.

So etwas (von PHP manual: sys_get_temp_dir und Download File to server from URL):

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

Dann können Sie $tempFile befestigen, Ihre E-Mail und unlink($tempFile) senden.

+0

Vielen Dank! Ich werde Ihren Code testen, obwohl ich eine Lösung gefunden habe (siehe meine Antwort). Was ich nicht verstehen kann, ist, wenn ich diese Bibliothek falsch benutze, oder alle, die es benutzen, haben dieses Problem. – T30

+0

Es gibt mir zwei Fehler: Warnung: 'tempnam() [function.tempnam]: SAFE MODE Einschränkung wirksam. Das Skript, dessen UID 10328 ist, darf nicht auf/tmp im Besitz von UID 0' für die zweite Zeile und 'Warnung: file_put_contents() [function.file-put-contents]: Dateiname darf nicht leer sein 'für die dritte Zeile. .. – T30

+0

Ich weiß nicht, was die beste Praxis ist. Vielleicht erstellen Sie ein schreibbares Verzeichnis unter Ihrem www-root, anstatt 'sys_get_temp_dir()' zu verwenden. – CodeCaster