¿Por qué wp_mail () no me permite establecer el encabezado From: cuando el viejo correo PHP () sí lo hará?

32

Cuando uso wp_mail( $to, $subject, $message, $headers )(con valores en su lugar, por supuesto), el correo electrónico se envía con un nombre de origen y un correo electrónico que no está configurado en ningún lugar que pueda encontrar (ni siquiera en la configuración de PHP o Apache). Sin embargo, usar en su mail( $to, $subject, $message, $headers )lugar funciona bien. ¿Qué podría estar pasando wp_mail()para causar esto?

helenhousandi
fuente

Respuestas:

44

Hola @helenyhou:

Puede configurar el encabezado, pero no con un parámetro. WordPress utiliza "ganchos" y los ganchos que necesita son 'wp_mail_from'y 'wp_mail_from_name'ganchos.

Estos son los ganchos que puede agregar al functions.phparchivo de su tema para modificar el "From:"encabezado al usarlo wp_mail()en la dirección de correo electrónico 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
fuente
Solo estaba mirando los filtros y tienes razón, soluciona el problema. ¿Supongo que el Codex debería actualizarse? codex.wordpress.org/Function_Reference/wp_mail También relacionado: esto parece afectar muchos complementos de formularios, incluidos los poderosos GravityForms. Actualmente estoy escribiendo un formulario personalizado, pero si así es como se supone que debe comportarse WP, ¿por qué la configuración de los encabezados utilizando el método antiguo normal funciona para otros (e incluso algunos de mis otros sitios)?
helenhousandi
@helenyhou: para evitar afectar otros formularios, debe agregar los filtros en su complemento justo antes de llamarlos wp_mail()y luego eliminarlos inmediatamente después. En cuanto a por qué funcionan los encabezados, no sé cuáles son sus otros casos de uso, pero me sorprendería si wp_mail()funcionara de esa manera.
MikeSchinkel
2
Ahhhh encontré lo que estaba sucediendo: otro complemento estaba agregando los filtros a nivel mundial por algo que no pedí y no puedo dejar de elegir: malo, malo, malo. Así que ahora los encabezados regulares funcionan después de todo. Sin embargo, parece que usar esos filtros sería una buena práctica, si están allí.
helenhousandi
Solo una nota aquí de que cualquier filtro que agregue un complemento se puede eliminar a través de remove_filter (HOOK, FUNCTION).
Jason Coleman
solo funciona si el dominio del correo electrónico es el mismo que el del sitio.
Omer
4

Bueno, si está utilizando el From: "Your Name" <[email protected]>\r\nformato en sus encabezados, no debería tener problemas (a menos que tenga un complemento instalado que anule la función wp_mail).

Sin embargo, como dijo Mike, puede filtrar los valores finales con esos filtros, o simplemente puede instalar este complemento:

Enviado desde

Le dará una configuración de opciones para determinar qué nombre y correo electrónico usar en wp_mail.

John P Bloch
fuente
1

Lamento revivir una vieja pregunta, pero ¿no es mejor establecerla mediante los encabezados de esta manera?

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

De esa manera no tiene que preocuparse por usar un filtro y luego eliminarlo después de wp_mail ().

Brady
fuente
2
No configuré el filtro, otro complemento lo hizo. El filtro tiene prioridad sobre el encabezado. Además, realmente debería usar en site_url()lugar deget_bloginfo('wpurl')
helenhousandi
Pero entonces seguramente ese complemento es malo para no limpiarse después de sí mismo ... aunque no puedes hacer mucho al respecto :( en ese caso, mejor cambio mi complemento para usar el filtro en caso de que otro complemento lo haya roto.
Brady
@helenyhou - +1 por recordarme sobre site_url (). También he cambiado mi complemento para usar filtros en lugar de usar $ encabezados. Además, me aseguré de eliminar esos filtros una vez que envié el correo electrónico para no interferir con nada más :)
Brady
sí, es que el complemento es malo por no darme una opción para no usar esos filtros, pero por suerte comentar los filtros que funcionaron para mi caso. Probablemente preguntaré para ver cuál es mejor usar en el futuro: un filtro por uso o los encabezados más familiares. Los encabezados son probablemente más eficientes, pero ¿por qué están esos filtros allí? Siempre más preguntas :)
helenhousandi
A partir de la versión actual, es totalmente aceptable de usar get_bloginfo('wpurl'): esto site_url()ya regresa . get_bloginfo('home')y get_bloginfo('siteurl')están en desuso. developer.wordpress.org/reference/functions/get_bloginfo
James M
1

Es un truco, pero también puedes usar la Reply Toetiqueta de encabezado:

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

Lamentablemente, esto agrega la dirección de correo electrónico a la lista De, y responder significa que tendrá que eliminar manualmente la dirección configurada en el wp_mail_fromfiltro.

Sjors Hijgenaar
fuente
Esto me lo arregló. ¡Salvaste un compañero de vida! ;)
user382738
0

Yo tuve el mismo problema. Para mí, resultó que el proveedor de alojamiento (BlueHost) impedía cambiar el campo de origen. Aquí lo explican https://my.bluehost.com/cgi/help/206 .

Solucioné el problema agregando el correo electrónico a los buzones de cPanel tal como dicen.

Tigran
fuente