Mengapa wp_mail () tidak mengizinkan saya mengatur header Dari: bila surat PHP lama biasa () akan?

32

Ketika saya menggunakan wp_mail( $to, $subject, $message, $headers )(dengan nilai di tempat, tentu saja), email akan dikirim dengan dari dan nama email yang tidak diatur di mana pun saya dapat menemukan (bahkan dalam pengaturan PHP atau Apache). Namun, menggunakan mail( $to, $subject, $message, $headers )bukan berfungsi dengan baik. Apa yang mungkin terjadi dengan wp_mail()penyebab ini?

helenhousandi
sumber

Jawaban:

44

Hai @helenyhou:

Anda dapat mengatur header, hanya saja tidak dengan parameter. WordPress menggunakan "kait" dan kait yang Anda butuhkan adalah 'wp_mail_from'dan 'wp_mail_from_name'kait.

Berikut adalah kait yang mungkin Anda tambahkan ke functions.phpfile tema Anda untuk memodifikasi "From:"header saat menggunakan wp_mail()ke alamat email 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
sumber
Saya hanya melihat filter dan Anda benar, itu memperbaiki masalah. Saya kira Codex harus diperbarui? codex.wordpress.org/Function_Reference/wp_mail Juga terkait: ini tampaknya memengaruhi banyak plugin formulir di luar sana, termasuk GravityForms yang perkasa. Saat ini saya sedang menulis formulir kustom, tetapi jika ini adalah bagaimana seharusnya WP berperilaku, mengapa pengaturan header menggunakan metode lama biasa bekerja untuk orang lain (dan bahkan beberapa situs saya yang lain)?
helenhousandi
@helenyhou - Agar tidak memengaruhi formulir lain, Anda harus menambahkan filter di plugin Anda sebelum dipanggil wp_mail()dan kemudian hapus segera. Adapun mengapa pengaturan header bekerja, saya tidak tahu apa kasus penggunaan Anda yang lain, tetapi saya akan terkejut jika wp_mail()akan bekerja seperti itu.
MikeSchinkel
2
Ahhhh saya menemukan apa yang terjadi - plugin lain menambahkan filter secara global untuk sesuatu yang saya tidak minta dan tidak dapat memilih keluar - buruk, buruk, buruk. Jadi sekarang tajuk biasa memang berfungsi. Sepertinya menggunakan filter tersebut akan menjadi praktik terbaik, jika ada di sana.
helenhousandi
Catat di sini bahwa filter apa pun yang ditambahkan plugin dapat dihapus melalui remove_filter (HOOK, FUNCTION).
Jason Coleman
itu hanya berfungsi jika dari domain email sama dengan situs.
Omer
4

Nah, jika Anda menggunakan From: "Your Name" <[email protected]>\r\nformat di header Anda, Anda seharusnya tidak memiliki masalah (kecuali jika Anda memiliki plugin yang diinstal yang menimpa fungsi wp_mail).

Namun, seperti yang dikatakan Mike, Anda dapat memfilter nilai-nilai pamungkas dengan filter tersebut, atau Anda cukup menginstal plugin ini:

Dikirim dari

Ini akan memberi Anda pengaturan opsi untuk menentukan nama dan email apa yang akan digunakan di wp_mail.

John P Bloch
sumber
1

Maaf menghidupkan kembali pertanyaan lama tapi bukankah lebih baik ditetapkan melalui tajuk seperti:

$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);

Dengan begitu Anda tidak perlu khawatir menggunakan filter dan kemudian menghapus di setelah wp_mail ().

Brady
sumber
2
Saya tidak mengatur filter, plugin lain melakukannya. Filter diutamakan di atas tajuk. Juga, Anda benar-benar harus menggunakan site_url()bukannyaget_bloginfo('wpurl')
helenhousandi
Tapi tentu saja plugin itu buruk karena tidak beres setelah itu sendiri .... tidak banyak yang dapat Anda lakukan tentang hal itu :( dalam hal ini saya lebih baik mengubah plugin saya untuk menggunakan filter kalau-kalau plugin lain telah rusak itu.
Brady
@helenyhou - +1 untuk mengingatkan saya tentang site_url (). Saya juga mengubah plugin saya untuk menggunakan filter daripada menggunakan $ header. Plus saya sudah memastikan untuk menghapus filter-filter itu begitu saya sudah mengirim email agar tidak menghalangi hal lain :)
Brady
ya, itu plugin yang buruk karena tidak memberi saya pilihan untuk tidak menggunakan filter itu, tapi untungnya mengomentari filter berhasil untuk kasus saya. Saya mungkin akan bertanya-tanya untuk melihat mana yang lebih baik untuk digunakan di masa depan - filter per penggunaan atau header yang lebih akrab. Header mungkin lebih efisien, tetapi mengapa filter itu ada? Selalu ada lebih banyak pertanyaan :)
helenhousandi
Pada versi saat ini, itu benar-benar dapat diterima untuk digunakan get_bloginfo('wpurl'): Ini site_url()sudah kembali . get_bloginfo('home')dan get_bloginfo('siteurl')sudah usang. developer.wordpress.org/reference/functions/get_bloginfo
James M
1

Ini sedikit meretas tetapi Anda juga dapat menggunakan Reply Totag tajuk:

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

Sayangnya ini menambahkan alamat email ke daftar Dari, dan membalas berarti Anda harus menghapus alamat yang dikonfigurasi dalam wp_mail_fromfilter secara manual .

Sjors Hijgenaar
sumber
Ini memperbaikinya untuk saya. Anda menyelamatkan pasangan hidup! ;)
user382738
0

Saya memiliki masalah yang sama. Bagi saya itu keluar bahwa penyedia hosting (BlueHost) mencegah dari mengubah bidang dari. Di sini mereka menjelaskannya https://my.bluehost.com/cgi/help/206 .

Saya memperbaiki masalah dengan menambahkan email ke kotak surat cPanel seperti yang mereka katakan.

Tigran
sumber