web-dev-qa-db-fra.com

Comment changer l'enveloppe de l'adresse en utilisant PHP mail?

J'utilise PHP avec Apache sous Linux, avec Sendmail. J'utilise la fonction PHP mail ). e-mail est envoyé, mais l'enveloppe a le Apache_user@localhostname dans MAIL FROM (exemple [email protected]) et certains serveurs de messagerie distants rejettent cela car le domaine n'existe pas (évidemment). En utilisant mail, puis-je le forcer à changer l'enveloppe MAIL FROM?

EDIT: Si j'ajoute un en-tête dans le quatrième champ de la fonction mail (), cela modifie le champ From dans les en-têtes du corps du message et NE MODIFIE PAS l'enveloppe MAIL FROM.

Je peux le forcer en générant sendmail avec sendmail -t -odb -oi -frealname@realhost et y transférer le contenu de l'e-mail. Est-ce une meilleure approche?

Existe-t-il une meilleure manière, plus simple et plus PHP une manière appropriée de le faire?

EDIT: L'essentiel est que je devrais avoir RTM. Merci pour les réponses, le cinquième paramètre fonctionne et tout va bien.

33
codebunny

mail () a un 4e et 5e paramètre (facultatif). Le 5ème argument est ce qui devrait être transmis en tant qu'options directement à sendmail. J'utilise ce qui suit:

mail('[email protected]','subject!','body!','From: [email protected]','-f [email protected]');
66
Lucas Oman

Documentation officielle PHP pour mail ()

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

...

paramètres_ supplémentaires (facultatif)

Le paramètre additional_parameters peut être utilisé pour passer des indicateurs supplémentaires en tant qu'options de ligne de commande au programme configuré pour être utilisé lors de l'envoi de courrier, tel que défini par le sendmail_path Paramètre de configuration. Par exemple, cela peut être utilisé pour définir l'adresse d'expéditeur de l'enveloppe lors de l'utilisation de sendmail avec l'option -f Sendmail.

Ce paramètre est échappé par escapeshellcmd() en interne pour empêcher l'exécution de la commande. escapeshellcmd() empêche l'exécution des commandes, mais permet d'ajouter des paramètres supplémentaires. Pour des raisons de sécurité, il est recommandé à l'utilisateur de nettoyer ce paramètre pour éviter d'ajouter des paramètres indésirables à la commande Shell.

Puisque escapeshellcmd() est appliqué automatiquement, certains caractères autorisés comme adresses e-mail par les RFC Internet ne peuvent pas être utilisés. mail () ne peut pas autoriser de tels caractères, donc dans les programmes où l'utilisation de tels caractères est requise, des moyens alternatifs d'envoi d'e-mails (comme l'utilisation d'un framework ou une bibliothèque) est recommandé.

L'utilisateur sous lequel le serveur Web s'exécute doit être ajouté en tant qu'utilisateur approuvé à la configuration de sendmail pour empêcher l'ajout d'un en-tête "X-Warning" Au message lorsque l'expéditeur de l'enveloppe (-f) Est défini en utilisant cette méthode. Pour les utilisateurs de sendmail, ce fichier est /etc/mail/trusted-users.

2
Vladimir Kornea

Je recommanderais également de vérifier dans PHPMailer . Il est idéal pour créer et envoyer des e-mails, ce qui facilite considérablement le processus, ainsi que la prise en charge de SMTP.

1
Darryl Hein

Vous pouvez essayer ceci (je ne suis pas sûr):

ini_set("sendmail_from", [email protected]);
mail(...);
ini_restore("sendmail_from");
1
Joe Scylla