2015-10-07 21 views
10

Wysyłam wiadomości za pomocą PHP przy użyciu funkcji mail(), ale wysyłanie jest wyświetlane jako adres serwera, a nie to, co skonfigurowałem w skrypcie. Postfix jest zainstalowany na serwerze apache. Na ServerFault answer czytam użyć -f a -R flagi, ale to nie działa albo tak:Postfix Ignoruje funkcję PHP mail()

mail($to, $subject, $message, $headers,'From: ' . $fromname . ' <'.$from.'>', "-f $from -r [email protected]"); 

Najlepszym Byłem w stanie zrobić, to zmienić myorigin Postfix, który jest nazwą komputera lokalnego hosta do domeny nadrzędnej nazwy komputera.

To prowadzi mnie do przekonania, że ​​Postfix ignoruje lub odbiera element From:?

+0

link do strony ubuntu –

+0

Jak to zrobić? @KarolyHorvath –

+0

Nieważne, zdaję sobie sprawę z tego, co teraz mówisz ... To była odpowiedź na pytanie o serwer ... Dodałem link. –

Odpowiedz

5

Możesz pozwolić Postfixowi na zapisywanie nagłówków i dodawanie poprawnych adresów From:. W tym celu Postfix ma sender_canonical_maps.

Załóżmy, że Twój serwer WWW (lub kierownik procesu) biegnie pod użytkownika o nazwie username, a chcesz mieć [email protected] w nagłówku wiadomości e-mail zamiast niejasnego [email protected]From:.Następnie mapa kanoniczna będzie zawierać:

#/etc/postfix/canonical 
username [email protected] 

Konfiguracja Postfix używać nie może być prostsze:

postmap /etc/postfix/canonical 
postconf -e sender_canonical_maps=hash:/etc/postfix/canonical 

Inną opcją jest powiedzieć postfix, aby zaznaczyć wszystkie maile wysyłane z was serwerze jak wysłać z [email protected] za pomocą luser_relay:

postconf -ev [email protected] 

Jeśli nie możesz zrobić, całkiem możliwe, ktoś już to zrobił dla ciebie, ale zrobił to źle. To może być powód, dla którego nie możesz zmienić adresu From:, ponieważ jest on wymuszany przez Postfix.

9
mail($to, $subject, $message, $headers,'From: ' . $fromname . ' <'.$from.'>', "-f $from -r [email protected]"); 

nie może pracować jako mail() akceptuje tylko 5 parametrów: bool mail (string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]])

Dla mnie zarówno

mail($to, $subject, $message, null, "-r [email protected]"); 
mail($to, $subject, $message, 'Name <[email protected]>', "-r [email protected]"); 

pracy (nie mam żadnych dodatkowych ograniczeń w postfix, który może przepisać nadawców). Upewnij się także, że nadawca jest poprawnie sformatowany (bez spacji lub w ogóle).

Zalecam jednak, aby zmienić ustawienie sendmail_path w pliku php.ini, aby uwzględnić parametr "-r moja_pod adresem=przyklad.com".

Jeśli to nie działa, należy umieścić tutaj nagłówki wiadomości i sprawdzić pliki dziennika pod kątem warnigns/errors.

PS: Upewnij się, że nie przekazujesz danych wprowadzonych przez użytkownika bezpośrednio do numeru mail(), ponieważ jeśli użytkownicy mogą wstawiać znaki nowej linii (takie jak \nCC: [email protected] w temacie, na pocztę lub z poczty), Twój serwer może być używany do rozsyłania spamu.

4

Masz dwa razy argument nagłówka w twoim zgłoszeniu mail(), a zatem twój argument $additional_parameters nie jest używany, ponieważ jest to 6-ty argument w funkcji, która akceptuje tylko 5. Powinieneś przesunąć nagłówek, aby dołączyć do reszta nagłówkach:

//Be mindful to protect from email injection attacks. 
$fromname = str_replace("\n", "", $fromname); 
$from = str_replace("\n", "", $from); 

//This assumes that $headers is already set, containing your other headers 
$headers .= 'From: ' . $fromname . ' <'.$from.">\n"; 

mail($to, $subject, $message, $headers, "-f $from -r [email protected]"); 

Używanie tego, spodziewam się, że 5-szy argument jest teraz zbędna i może zostać uproszczony do:

$fromname = str_replace("\n", "", $fromname); 
$from = str_replace("\n", "", $from); 

$headers .= 'From: ' . $fromname . ' <'.$from.">\n"; 

mail($to, $subject, $message, $headers); 
+1

"Wykończenie" nie pomaga w stosunku do znaków nowej linii w ciągu znaków. – cweiske

+0

Nie ma potrzeby jednoczesnego podawania "-r" i "-f". – MrTux

+0

@MrTux - masz rację, te flagi wydają się robić dokładnie to samo. Jednak nie jestem przekonany, że powoduje problemy opisane w pytaniu; dla jasności zostawię to tak, jak jest. – HPierce

4

W PHP składnia mail f namaszczenie jest następująca:

mail($to, $subject, $message, $headers, $parameters); 

Więc w twoim przypadku, jeśli chcesz podać inny adres „Od” i inny „kanał zwrotny” Twój kod powinien wyglądać następująco:

$to = "[email protected]"; 
$subject = "Your reset email"; 
$message = "<message text/html>"; 
$from = "[email protected]"; 
$bounceEmail = "[email protected]"; 
$headers = array(
    "From: " . $from 
); 
$headers = implode("\r\n", $headers); 
$parameters = "-r" . $bounceEmail; 

// Send it! 
mail($to, $subject, $message, $headers, $parameters); 

Nadzieja to pomaga!

+0

Cytując dokumentację PHP: Łańcuch do wstawienia na końcu nagłówka wiadomości e-mail. Zazwyczaj służy do dodawania dodatkowych nagłówków (Od, DW i UDW). ** Wiele dodatkowych nagłówków należy oddzielić za pomocą CRLF (\ r \ n) **. Jeśli do utworzenia tego nagłówka używa się danych zewnętrznych, dane powinny zostać oczyszczone, aby nie można było wprowadzić niepożądanych nagłówków. http://php.net/manual/en/function.mail.php – Jamesking56

+0

^(Uwaga pana MrTuksa została usunięta, ale zostawię to tutaj dla dobrobytu) – Jamesking56

Powiązane problemy