¿Por qué wp_mail() no me permite establecer la cabecera From: cuando el simple mail() de PHP sí lo hace?
Cuando uso wp_mail( $to, $subject, $message, $headers )
(con valores en su lugar, por supuesto), el correo se envía con un nombre y correo del remitente que no está configurado en ningún lugar que pueda encontrar (ni siquiera en la configuración de PHP o Apache). Sin embargo, usar mail( $to, $subject, $message, $headers )
en su lugar funciona perfectamente. ¿Qué podría estar pasando con wp_mail()
para causar esto?

Hola @helenyhou:
Puedes configurar el encabezado, solo que no con un parámetro. WordPress usa "hooks" y los hooks que necesitas son 'wp_mail_from'
y 'wp_mail_from_name'
.
Aquí están los hooks que podrías añadir al archivo functions.php
de tu tema para modificar el encabezado "De:"
cuando uses wp_mail()
para la dirección de correo electrónico Helen Hou-Sandi <helenyhou@example.com>
:
add_filter('wp_mail_from','yoursite_wp_mail_from');
function yoursite_wp_mail_from($content_type) {
return 'helenyhou@example.com';
}
add_filter('wp_mail_from_name','yoursite_wp_mail_from_name');
function yoursite_wp_mail_from_name($name) {
return 'Helen Hou-Sandi';
}

Estaba revisando los filtros y tienes razón, efectivamente soluciona el problema. Supongo que el Codex debería actualizarse? http://codex.wordpress.org/Function_Reference/wp_mail
También relacionado: esto parece afectar a muchos plugins de formularios, incluyendo el poderoso GravityForms. Actualmente estoy desarrollando un formulario personalizado, pero si este es el comportamiento esperado de WP, ¿por qué configurar los encabezados usando el método tradicional funciona para otros (e incluso en algunos de mis otros sitios)?

@helenyhou - Para evitar afectar otros formularios, necesitarías agregar los filtros en tu plugin justo antes de llamar a wp_mail()
y luego eliminarlos inmediatamente después. En cuanto a por qué funcionan los encabezados, no sé cuáles son tus otros casos de uso, pero me sorprendería que wp_mail()
funcionara de esa manera.

Ahhhh descubrí lo que estaba pasando - otro plugin estaba agregando los filtros globalmente para algo que no solicité y no puedo desactivar - mal, mal, mal. Así que ahora los encabezados regulares sí funcionan después de todo. Parece que usar esos filtros sería la mejor práctica, si ya están ahí.

Solo una nota aquí que cualquier filtro que un plugin agregue puede ser eliminado mediante remove_filter(HOOK, FUNCIÓN).

Bueno, si estás usando el formato From: "Tu Nombre" <tucorreo@ejemplo.com>\r\n
en tus cabeceras, no deberías tener un problema (a menos que tengas un plugin instalado que sobrescriba la función wp_mail).
Sin embargo, como dijo Mike, puedes filtrar los valores finales con esos filtros, o simplemente instalar este plugin:
Te dará una configuración de opciones para determinar qué nombre y correo electrónico usar en wp_mail()
.

Perdón por revivir una pregunta antigua, pero ¿no sería mejor configurarlo a través de los headers de esta manera?
$subject = "MyPlugin: Alerta (".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 esta manera no tienes que preocuparte por usar un filtro y luego eliminarlo después de wp_mail()
.

Yo no configuré el filtro, otro plugin lo hizo. El filtro tiene prioridad sobre el encabezado. Además, realmente deberías usar site_url()
en lugar de get_bloginfo('wpurl')

Pero entonces seguramente ese plugin es malo por no limpiar después de sí mismo... no hay mucho que puedas hacer al respecto :( en ese caso, mejor cambio mi plugin para usar filtros por si acaso otro plugin lo ha roto.

@helenyhou - +1 por recordarme lo de site_url(). También he cambiado mi plugin para usar filtros en lugar de usar $headers. Además me he asegurado de eliminar esos filtros una vez enviado el correo para no interferir con nada más :)

sí, es culpa de ese plugin por no darme una opción para no usar esos filtros, pero por suerte comentar los filtros funcionó para mi caso. Probablemente preguntaré a ver qué es mejor usar en el futuro - un filtro por uso o los headers más familiares. Los headers probablemente son más eficientes, pero entonces ¿por qué están esos filtros ahí? Siempre hay más preguntas :)

En la versión actual, es totalmente aceptable usar get_bloginfo('wpurl')
: Esto ya devuelve site_url()
. get_bloginfo('home')
y get_bloginfo('siteurl')
están obsoletos. https://developer.wordpress.org/reference/functions/get_bloginfo/

Es un poco un truco, pero también puedes usar la etiqueta de cabecera Reply To
:
$headers = 'Reply-To: "Aaren A. Aarenson" <aaron@somemail.com>';
Lamentablemente esto agrega la dirección de correo a la lista From, y al responder significa que tendrás que eliminar manualmente la dirección configurada en el filtro wp_mail_from
.

Tuve el mismo problema. En mi caso resultó que el proveedor de hosting (BlueHost) estaba impidiendo el cambio del campo from. 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 indican.
