PHPMailer - joindre des fichiers à distance avec l'URL
PHPMailer vérifie is_file
pour chaque pièce jointe (en addAttachment
fonction, dans class.phpmailer.php fichier):
if (!@is_file($path)) {
throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
}
Mon problème est que je peux faire le travail is_file
seulement de donner chemin d'accès local complet vers le fichier, pas d'Url:
is_file('C:/wamp/www/myFolder/rocks.png'); //True
is_file('http://localhost/myFolder/rocks.png'); //False :(
Donc je ne peux pas joindre un fichier à partir du serveur distant.
Ce que je fais mal?? Il peut être un problème de permission?
EDIT:
Je sais qu'il existe d'autres moyens de vérifier si le fichier existe.
Mais is_file
est dans le PhpMailer bibliothèque, je préfère ne pas y toucher et je veux savoir si il est possible de le faire fonctionner à l'aide de ses méthodes.
Grâce.
Il est moins cher d'utiliser
c'est exactement ce que je parle.
Je sais qu'il y a de meilleures façons de vérifier si le fichier existe, mais c'est écrit dans la PhpMailer fonction. Je voudrais savoir comment cela peut fonctionner. Ou c'est une PhpMailer problème?
Astuce depuis PHP 5.0.0, cette fonction peut également être utilisée avec certaines URL wrappers. Reportez-vous à pris en charge les Protocoles et les Wrappers pour déterminer les wrappers de soutien stat() de la famille de la fonctionnalité.
HTTP n'a pas de notion de fichier vs. répertoire, is_file() / is_dir() résultats ne sont pas définis ...
get_headers
de vérifier à distance existence du fichier.c'est exactement ce que je parle.
Je sais qu'il y a de meilleures façons de vérifier si le fichier existe, mais c'est écrit dans la PhpMailer fonction. Je voudrais savoir comment cela peut fonctionner. Ou c'est une PhpMailer problème?
Astuce depuis PHP 5.0.0, cette fonction peut également être utilisée avec certaines URL wrappers. Reportez-vous à pris en charge les Protocoles et les Wrappers pour déterminer les wrappers de soutien stat() de la famille de la fonctionnalité.
HTTP n'a pas de notion de fichier vs. répertoire, is_file() / is_dir() résultats ne sont pas définis ...
OriginalL'auteur T30 | 2014-12-10
Vous devez vous connecter pour publier un commentaire.
Il n'a pas besoin d'une solution de contournement, vous êtes juste en utilisant une fonction explicitement prévu pour les fichiers locaux sur une ressource distante. Pour joindre une ressource distante, sans l'implication des fichiers, il suffit de faire ceci:
Je ne recommanderais pas cela directement inline approche, car elle rend la gestion des erreurs plus difficile (par exemple, si l'URL ne parvient pas à répondre).
Il s'agit essentiellement d'un double de cette question.
OriginalL'auteur Synchro
Citant le PHP docs:
De flux standard, la prise en charge suivante stat()
et les suivants ne sont pas
Tandis que les suivants sont limitées
Rien à voir avec la version.... vous essayez d'accéder à
http://localhost/myFolder/rocks.png
mais lahttp://
flux ne supporte pas les stat(), de sorteis_file()
n'est pas possible avec cette urlDonc pour vous, il peut être un PhpMailer problème?
Vous ne pouvez pas le faire fonctionner
OriginalL'auteur Mark Baker
Plus tard dans le code qu'il utilise
file_get_contents()
pour inclure le contenu de la pièce jointe. Alors quefile_get_contents()
prend en charge HTTP,is_file()
ne l'est pas.Donné que vous ne voulez pas modifier PhpMailer, vous devrez télécharger le fichier à partir de l'adresse HTTP de vous-même et de fournir le chemin d'accès temporaire à PhpMailer. Après l'envoi, vous pouvez supprimer le fichier temporaire.
Quelque chose comme ceci (à partir de Manuel PHP: sys_get_temp_dir et Télécharger le Fichier sur le serveur à partir de l'URL):
Alors vous pouvez joindre
$tempFile
, envoyer votre e-mail etunlink($tempFile)
.Il me donne deux erreurs: Avertissement:
tempnam() [function.tempnam]: SAFE MODE Restriction in effect. The script whose uid is 10328 is not allowed to access /tmp owned by uid 0
pour la deuxième ligne, etWarning: file_put_contents() [function.file-put-contents]: Filename cannot be empty
pour le troisième...Je ne sais pas quelle est la meilleure pratique est. Peut-être créer un répertoire accessible sous votre www-racine au lieu d'utiliser
sys_get_temp_dir()
.OriginalL'auteur CodeCaster