Dlaczego wp_mail () nie pozwala mi ustawić nagłówka From:, gdy zwykła stara poczta PHP () zrobi to?

32

Kiedy używam wp_mail( $to, $subject, $message, $headers )(oczywiście z wartościami na miejscu), wiadomość e-mail jest wysyłana z nazwą i adresem e-mail, które nie są nigdzie ustawione (nawet w ustawieniach PHP lub Apache). Jednak użycie mail( $to, $subject, $message, $headers )zamiast tego działa dobrze. Co może się stać, wp_mail()aby to spowodować?

helenhousandi
źródło

Odpowiedzi:

44

Cześć @helenyhou:

Możesz ustawić nagłówek, ale nie z parametrem. WordPress używa „haków” i haczyków, których potrzebujesz 'wp_mail_from'i 'wp_mail_from_name'haków.

Oto zaczepy, które możesz dodać do functions.phppliku motywu, aby zmodyfikować "From:"nagłówek przy użyciu wp_mail()adresu e-mail Helen Hou-Sandi <[email protected]>:

add_filter('wp_mail_from','yoursite_wp_mail_from');
function yoursite_wp_mail_from($content_type) {
  return '[email protected]';
}
add_filter('wp_mail_from_name','yoursite_wp_mail_from_name');
function yoursite_wp_mail_from_name($name) {
  return 'Helen Hou-Sandi';
}
MikeSchinkel
źródło
Właśnie patrzyłem na filtry i masz rację, to naprawia problem. Przypuszczam, że Kodeks powinien zostać zaktualizowany? codex.wordpress.org/Function_Reference/wp_mail Również powiązane: wydaje się, że wpływa to na wiele wtyczek formularzy, w tym potężne GravityForms. Obecnie piszę niestandardowy formularz, ale jeśli tak ma się zachowywać WP, dlaczego ustawianie nagłówków przy użyciu zwykłej starej metody działa w przypadku innych (a nawet niektórych innych moich witryn)?
helenhousandi
@helenyhou - Aby nie wpływać na inne formularze, musisz dodać filtry do wtyczki tuż przed wywołaniem, wp_mail()a następnie usunąć je zaraz po. Jeśli chodzi o to, dlaczego ustawianie nagłówków działa, nie wiem, jakie są inne przypadki użycia, ale byłbym zaskoczony, gdyby wp_mail()działał w ten sposób.
MikeSchinkel,
2
Ahhhh, znalazłem, co się dzieje - kolejna wtyczka dodawała filtry globalnie do czegoś, o co nie prosiłam i nie mogę zrezygnować - źle, źle, źle. Więc teraz zwykłe nagłówki naprawdę działają. Wygląda na to, że najlepszym rozwiązaniem byłoby użycie tych filtrów, jeśli są tam.
helenhousandi
Uwaga: każdy filtr dodawany przez wtyczkę można usunąć za pomocą remove_filter (HOOK, FUNCTION).
Jason Coleman
działa tylko wtedy, gdy z domeny e-mail jest taka sama jak witryna.
Omer
4

Cóż, jeśli używasz From: "Your Name" <[email protected]>\r\nformatu w nagłówkach, nie powinieneś mieć problemu (chyba że masz zainstalowaną wtyczkę, która przesłania funkcję wp_mail).

Jednak, jak powiedział Mike, możesz filtrować najwyższe wartości za pomocą tych filtrów lub możesz po prostu zainstalować tę wtyczkę:

Wyślij z

Daje to ustawienie opcji określających, jakiej nazwy i adresu e-mail użyć w wp_mail.

John P. Bloch
źródło
1

Przykro mi, aby ożywić stare pytanie, ale czy nie lepiej jest ustawić za pomocą nagłówków:

$subject  = "MyPlugin: Alert (".get_bloginfo('wpurl').")";
$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=".get_bloginfo('charset')."" . "\r\n";
$headers .= "From: MyPlugin <".$this->settings['from_address'].">" . "\r\n";
wp_mail($this->settings['notify_address'], $subject, $alertMessage, $headers);

W ten sposób nie musisz się martwić o użycie filtra, a następnie usunięcie go po wp_mail ().

Brady
źródło
2
Nie ustawiłem filtra, zrobiła to inna wtyczka. Filtr ma pierwszeństwo przed nagłówkiem. Ponadto powinieneś użyć site_url()zamiastget_bloginfo('wpurl')
helenhousandi 16.04.11
Ale z pewnością ta wtyczka jest zła, ponieważ nie usuwa się sama po sobie ... niestety możesz to zrobić :( w takim przypadku lepiej zmienić wtyczkę na filtr, na wypadek, gdyby inna wtyczka go zepsuła.
Brady
@helenyhou - +1 za przypomnienie mi o site_url (). Zmieniłem też wtyczkę, aby używała filtrów zamiast nagłówków $. Poza tym upewniłem się, że usunę te filtry po wysłaniu e-maila, aby nie przeszkadzać w niczym innym :)
Brady,
tak, to źle, że wtyczka nie daje mi opcji nieużywania tych filtrów, ale na szczęście komentuje filtry opracowane w moim przypadku. Prawdopodobnie zapytam się, czy lepiej użyć w przyszłości - filtru według zastosowania lub bardziej znanych nagłówków. Nagłówki są prawdopodobnie bardziej wydajne, ale dlaczego są tam te filtry? Zawsze więcej pytań :)
helenhousandi
Od obecnej wersji jest całkowicie dopuszczalne użycie get_bloginfo('wpurl'): Zwraca site_url()już. get_bloginfo('home')i get_bloginfo('siteurl')są przestarzałe. developer.wordpress.org/reference/functions/get_bloginfo
James M
1

To trochę włamanie, ale możesz także użyć Reply Totagu nagłówka:

$headers = 'Reply-To: "Aaren A. Aarenson" <[email protected]>';

Niestety dodaje to adres e-mail do listy Od, a odpowiedź oznacza, że ​​będziesz musiał ręcznie usunąć adres skonfigurowany w wp_mail_fromfiltrze.

Sjors Hijgenaar
źródło
Naprawiłem to dla mnie. Uratowałeś partnera życiowego! ;)
user382738
0

Miałem ten sam problem. Dla mnie okazało się, że dostawca hostingu (BlueHost) uniemożliwia zmianę pola z. Wyjaśniają to https://my.bluehost.com/cgi/help/206 .

Rozwiązałem problem, dodając wiadomość e-mail do skrzynek pocztowych cPanel, tak jak mówią.

Tigran
źródło