38 Stimmen

Wie ändere ich den Umschlag von der Adresse mit PHP Mail?

Ich verwende PHP mit Apache auf Linux, mit Sendmail. Ich verwende die PHP mail Funktion. Die E-Mail wird versendet, aber der Umschlag hat die Apache_user@localhostname en MAIL FROM (Beispiel nobody@conniptin.internal) und einige entfernte Mailserver lehnen dies ab, weil die Domäne nicht existiert (offensichtlich). verwenden mail kann ich die Änderung des Umschlags erzwingen MAIL FROM ?

EDIT: Wenn ich eine Kopfzeile in das vierte Feld der mail ()-Funktion, die die From Feld in den Kopfzeilen des Nachrichtentextes und ändert NICHT den Umschlag MAIL FROM .

Ich kann es erzwingen, indem ich sendmail mit sendmail -t -odb -oi -frealname@realhost und leiten den Inhalt der E-Mail an diese weiter. Ist dies ein besserer Ansatz?

Gibt es eine bessere, einfachere, PHP-gerechtere Methode, dies zu tun?

EDIT: Das Fazit ist, dass ich RTM haben sollte. Vielen Dank für die Antworten Leute, der fünfte Parameter funktioniert und alles ist gut.

78voto

Lucas Oman Punkte 15159

Mail() hat einen 4. und 5. Parameter (optional). Das 5. Argument ist das, was als Optionen direkt an sendmail übergeben werden sollte. Ich verwende die folgenden:

mail('to@blah.com','subject!','body!','From: from@blah.com','-f from@blah.com');

2 Stimmen

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

0 Stimmen

Ich konnte keine vertrauenswürdigen Benutzer auf meinem Rechner finden :/

10 Stimmen

@Lucas Oman: +1 Ihre Antwort ist richtig, ich wollte nur alle Interessierten warnen, dass bei fast allen Shared-Hosting-Diensten (cPanel/WHM) die PHP-Mail-Funktion 5. -f ... wird deaktiviert durch SAFE MODE Restriction in effect und würde einfach eine PHP-Warnung anzeigen, ohne den Standardumschlag zu ändern - daher wäre Ihre Antwort in diesen Fällen keine Option. Und in Bezug auf Devon kommentieren die /etc/mail/trusted-users kann bei Shared Hosting nicht geändert werden, da es zur Hauptserverkonfiguration gehört.

2voto

Vladimir Kornea Punkte 3872

PHP Offizielle Dokumentation für mail()

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

...

additional_parameters (optional)

El zusätzliche_Parameter Parameter kann verwendet werden, um zusätzliche Flags als Befehlszeilenoptionen an das Programm übergeben, das für den Versand von beim Versenden von Mails zu verwenden, wie es durch den Parameter sendmail_path Konfiguration Einstellung. Dies kann zum Beispiel verwendet werden, um den Absender des Umschlags festlegen Adresse wenn Sie sendmail mit der Option -f sendmail-Option.

Dieser Parameter wird durch escapeshellcmd() intern zu verhindern, dass Befehlsausführung zu verhindern. escapeshellcmd() verhindert die Befehlsausführung, aber erlaubt es, zusätzliche Parameter hinzuzufügen. Aus Sicherheitsgründen ist es dem Benutzer empfohlen, diesen Parameter zu bereinigen, um das Hinzufügen von unerwünschte Parameter zum Shell-Befehl hinzuzufügen.

Seit escapeshellcmd() automatisch angewendet wird, werden einige Zeichen, die die nach den Internet-RFCs als E-Mail-Adressen zulässig sind, nicht verwendet werden. mail() können solche Zeichen nicht zulassen, so dass in Programmen, in denen die Verwendung solcher Zeichen erforderlich ist, wird die Verwendung alternativer Methoden zum Senden von E-Mails (z. B. Verwendung eines Frameworks oder einer Bibliothek) empfohlen.

Der Benutzer, unter dem der Webserver läuft, sollte als vertrauenswürdiger Benutzer hinzugefügt werden in die sendmail-Konfiguration aufgenommen werden, um einen ' X-Warning ' Kopfzeile von der Nachricht hinzugefügt wird, wenn der Absender des Umschlags ( -f ) wird mit diese Methode. Für sendmail-Benutzer ist diese Datei /etc/mail/trusted-users .

0 Stimmen

Kann mir jemand sagen, wo ich das Äquivalent zu /etc/mail/trusted-users in einer Nicht-Unix-Umgebung wie Shared Hosting?

1voto

Joe Scylla Punkte 701

Sie können dies versuchen (ich bin mir nicht sicher):

ini_set("sendmail_from", yourmail@example.com);
mail(...);
ini_restore("sendmail_from");

0 Stimmen

Gute Idee, ich habe das bei Shared Hosting ausprobiert, aber leider ist das kein Workaround, denn wenn safe_mode=On selbst die ini_set("sendmail_from" wird ignoriert. Und wenn safe_mode=Off Lucas Oman Antwort ist einfacher und schneller [ stackoverflow.com/questions/179014/

1 Stimmen

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

1voto

Darryl Hein Punkte 138311

Ich würde auch empfehlen, Folgendes zu überprüfen PHPMailer . Es ist großartig für die Erstellung und den Versand von E-Mails, was den Prozess viel einfacher macht, zusammen mit der Unterstützung für SMTP.

0 Stimmen

PHPMailer scheint genau den PHP Mail 5th-Parameter zu verwenden -f ... wie von Lucas Oman in seiner obigen Antwort vorgeschlagen. Sie können es sehen in function MailSend in der PHPMailer-Quelldatei class.phpmailer.php

-10voto

mr-euro Punkte 2748

Was Sie tatsächlich tun müssen, ist ändern die Hostname des Rechners, auf dem Apache läuft, sowie die Benutzer Apache wird ausgeführt als.

In Ihrem aktuellen Fall ist das der Fall:

  • Apache-Benutzer: niemand
  • Hostname des Servers: conniptin.intern

Das Ändern dieser beiden Werte ist ziemlich einfach und wird die Wurzel Ihres Problems lösen.

Wenn Sie es jedoch von PHP aus tun müssen, verwenden Sie vielleicht die system/exec Funktionen. Ich glaube jedoch nicht, dass dies in der Praxis funktioniert, da Sie Apache und wahrscheinlich auch den gesamten Host neu starten müssen, damit die neuen Namen verwendet werden können.

0 Stimmen

Das Ändern des Hostnamens und das Ausführen von Apache unter einem anderen Benutzer haben weitreichende Folgen (im letzteren Fall schwerwiegende Sicherheitsauswirkungen) und sind oft nicht durch die Unternehmensrichtlinien oder durch Ihren Shared-Hosting-Anbieter gestattet.

0 Stimmen

Nun, das hat MEINE Probleme gelöst (nach einigem Googeln)... Aber ich bin auf einem VPS.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X