2008-10-07 2 views
32

Ich verwende PHP mit Apache auf Linux, mit Sendmail. Ich benutze die PHP mail Funktion. Die E-Mail wird gesendet, aber der Umschlag hat die [email protected] in MAIL FROM (Beispiel [email protected]) und einige Remote-Mail-Server lehnen dies ab, weil die Domain (offensichtlich) nicht existiert. Kann ich es unter Verwendung mail erzwingen, den Umschlag MAIL FROM zu ändern?Wie ändern Umschlag von Adresse mit PHP Mail?

EDIT: Wenn ich einen Header im vierten Feld der mail() Funktion hinzuzufügen, die das From Feld in den Header des Körpers der Nachricht MAIL FROM und ändert sich nicht, den Umschlag ändert.

Ich kann es erzwingen, indem ich sendmail mit sendmail -t -odb -oi [email protected] und spawning die E-Mail-Inhalte zu ihm. Ist das ein besserer Ansatz?

Gibt es eine bessere, einfachere, PHP-geeignete Art und Weise, dies zu tun?

EDIT: Die Quintessenz ist, ich sollte RTM haben. Danke für die Antworten Leute, der fünfte Parameter funktioniert und alles ist gut.

Antwort

62

mail() hat einen 4. und 5. Parameter (optional). Das fünfte Argument ist, was als Optionen direkt an sendmail übergeben werden soll. Ich benutze das folgende:

mail('[email protected]','subject!','body!','From: [email protected]','-f [email protected]'); 
+2

Hinweis: Möglicherweise müssen Sie den Absender auch zu/etc/mail/trusted-users hinzufügen. – Devon

+0

Konnte keine vertrauenswürdigen Benutzer auf meinem Rechner finden:/ –

+8

@Lucas Oman: +1 deine Antwort ist richtig, wollte nur denjenigen warnen, der daran interessiert sein könnte, dass auf fast allen Shared Hosting Services (cPanel/WHM) die PHP Mail Funktion 5th Der Parameter '-f ...' wird durch 'SAFE MODE Restriction in effect' deaktiviert und würde einfach eine PHP-Warnung anzeigen, ohne den Standard-Envelope zu ändern - daher wäre Ihre Antwort in diesen Fällen keine Option. Und bezüglich des Devon-Kommentars kann die '/ etc/mail/trusted-users' nicht auf Shared Hosting geändert werden, da sie zur Hauptserverkonfiguration gehört. –

1

Sie können versuchen, diese (im nicht sicher, tho):

ini_set("sendmail_from", [email protected]); 
mail(...); 
ini_restore("sendmail_from"); 
+0

Gute Idee, ich habe dies auf Shared Hosting versucht, aber das ist leider kein Workaround, denn wenn 'safe_mode = On' wird auch das' ini_set ("sendmail_from" 'ignoriert. Und wenn' safe_mode = Off' ist, ist Lucas Oman Antwort einfacher und schneller [http://stackoverflow.com/questions/179014/how-to-change-envelope-from-address-using-php-mail/179061#179061] –

+1

Dies funktioniert nur auf Windows-Servern (wie in PHP.ini angegeben), aber guter Tipp –

1

ich auch in PHPMailer Überprüfung empfehlen würde. Es eignet sich hervorragend zum Erstellen und Senden von E-Mails, was den Vorgang erheblich vereinfacht und SMTP unterstützt.

+0

PHPMailer scheint genau den PHP-Mail-5-Parameter '-f ...' zu verwenden, wie Lucas Oman in seiner obigen Antwort vorgeschlagen hat.Sie ​​können es in 'function MailSend' in PHPMailer-Quelldatei' klasse sehen. phpmailer.php' –

-8

Was Sie wirklich tun müssen, ist Änderung der Hostnamen der Maschine Apache auf ausgeführt wird, plus der Benutzer Apache läuft wie.

In Ihrem aktuellen Fall ist es:

  • Apache Benutzer: niemand
  • Server Host-Name: conniptin.internal

diese beiden Werte ändern ist ziemlich einfach und lösen die Wurzel deines Problems.

Obwohl, wenn Sie es von PHP aus tun müssen, dann vielleicht die system/exec Funktionen verwenden. Ich glaube nicht, dass es in der Praxis funktionieren wird, da Apache und wahrscheinlich auch der gesamte Host für die neuen Namen neu gestartet werden müssen.

+0

Das Ändern des Hostnamens und das Ausführen von Apache als anderer Benutzer haben weitreichende Konsequenzen (schwerwiegende Sicherheitskonsequenzen im letzteren Fall) und sind oft nicht von den Organisationsrichtlinien oder von Ihrem Shared Hosting-Provider zugelassen. – qris

+0

Nun, das hat meine Probleme gelöst (nach etwas googeln) ... Aber ich bin auf einem VPS. – Roemer

0

PHP Official documentation for mail()

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

...

additional_parameters (optional)

Die additional_parameters Parameter zusätzliche Flags als Befehlszeilenoptionen an das Programm übergeben werden verwendet, können so konfiguriert verwendet werden, beim Senden von Nachrichten, durch die sendmail_path Konfiguration wie definiert Rahmen. Zum Beispiel kann dies verwendet werden, um den Umschlag Absender Adresse bei der Verwendung von sendmail mit der -f sendmail -Option.

Dieser Parameter wird intern von escapeshellcmd() mit Escapezeichen versehen, um die Ausführung des Befehls zu verhindern. escapeshellcmd() verhindert die Ausführung des Befehls, aber ermöglicht das Hinzufügen zusätzlicher Parameter. Aus Sicherheitsgründen wird empfohlen, dass der Benutzer diesen Parameter bereinigt, um zu vermeiden, dass dem Shell-Befehl unerwünschte Parameter hinzugefügt werden.

Da escapeshellcmd() automatisch angewendet wird, können einige Zeichen, die als E-Mail-Adressen von Internet-RFCs verwendet werden, nicht verwendet werden. mail() können solche Zeichen nicht zulassen, so dass in Programmen, in denen die Verwendung solcher Zeichen erforderlich ist, alternative Mittel zum Senden von E-Mails (wie mit einem Framework oder einer Bibliothek) empfohlen wird.

Der Benutzer, der der Web-Server läuft, wie als einen vertrauenswürdigen Benutzer an die send Konfiguration hinzugefügt werden soll, einen ‚X-Warning‘ -Headers wird hinzugefügt, um die Nachricht zu verhindern, wenn der Umschlag Sender (-f) mit dieser Methode festgelegt ist . Für sendmail-Benutzer lautet diese Datei /etc/mail/trusted-users.