2008-10-07 8 views
32

Estoy usando PHP con Apache en Linux, con Sendmail. Uso la función PHP mail. El correo electrónico se envía, pero el sobre tiene el [email protected] en MAIL FROM (ejemplo [email protected]) y algunos servidores de correo remotos lo rechazan porque el dominio no existe (obviamente). Usando mail, ¿puedo forzarlo a cambiar el sobre MAIL FROM?¿Cómo cambiar el sobre de la dirección usando el correo de PHP?

EDIT: Si agrego un encabezado en el cuarto campo de la función mail(), que cambia el campo From en las cabeceras del cuerpo del mensaje, y no cambia el sobre MAIL FROM.

Puedo forzarlo al generar sendmail con sendmail -t -odb -oi [email protected] y conectar el contenido del correo electrónico. ¿Es este un mejor enfoque?

¿Hay una manera mejor, más simple, más apropiada de PHP para hacer esto?

EDIT: La conclusión es que debería tener RTM. Gracias por las respuestas, el quinto parámetro funciona y todo está bien.

Respuesta

62

mail() tiene un 4º y un 5º parámetro (opcional). El quinto argumento es lo que se debe pasar como opciones directamente a sendmail. Yo uso el siguiente:

mail('[email protected]','subject!','body!','From: [email protected]','-f [email protected]'); 
+2

Nota: Es posible que deba agregar el remitente a/etc/mail/trusted-users también. – Devon

+0

No pude encontrar usuarios de confianza en mi máquina:/ –

+8

@Lucas Oman: +1 su respuesta es correcta, solo quería advertir a quien le interese sobre casi todos los servicios de alojamiento compartido (cPanel/WHM) la función de correo PHP 5 el parámetro '-f ...' está desactivado por 'SAFE MODE Restriction in effect' y simplemente mostraría una advertencia de PHP sin cambiar el sobre predeterminado, por lo que su respuesta en estos casos no sería una opción. Y con respecto a Devon comentan que '/ etc/mail/trusted-users' no se puede cambiar en el alojamiento compartido porque pertenece a la configuración del servidor principal. –

1

Puede probar esto (aunque no estoy seguro):

ini_set("sendmail_from", [email protected]); 
mail(...); 
ini_restore("sendmail_from"); 
+0

Buena idea, probé esto en alojamiento compartido, pero desafortunadamente esto no es una solución porque cuando 'safe_mode = On' incluso el' ini_set ("sendmail_from" 'se ignora. Y cuando' safe_mode = Off' Lucas Oman responde es más fácil y más rápido [http://stackoverflow.com/questions/179014/how-to-change-envelope-from-address-using-php-mail/179061#179061] –

+1

Esto solo funciona en servidores Windows (como se indica en PHP.ini)), pero gran consejo. –

1

También recomendaría el ingreso en PHPMailer. Es ideal para crear y enviar correos electrónicos, lo que hace que el proceso sea mucho más fácil, junto con el soporte para SMTP.

+0

PHPMailer parece utilizar exactamente el 5 ° parámetro de correo PHP '-f ...' sugerido por Lucas Oman en su respuesta anterior. Puedes verlo en 'función MailSend' en la clase de archivo fuente PHPMailer. phpmailerphp' –

-8

Lo que realmente necesita hacer es cambio la nombre de host de la máquina Apache se está ejecutando en, además de la usuario se ejecuta Apache.

En su caso actual es:

  • usuario de Apache: nadie
  • nombre de host del servidor: conniptin.internal

Cambio de esos dos valores es bastante simple y va a resolver la raíz de tu problema

Aunque si necesita hacerlo desde PHP entonces quizás use las funciones system/exec. No creo que funcione en la práctica, ya que es necesario reiniciar Apache y probablemente también todo el host para que se utilicen los nuevos nombres.

+0

Cambiar el nombre de host y ejecutar Apache como un usuario diferente tiene consecuencias de gran alcance (graves consecuencias de seguridad en este último caso) y, a menudo, la política de la organización o su proveedor de alojamiento compartido no lo permiten. – qris

+0

Bueno, esto SOLO resolvió MIS problemas (después de buscar en Google) ... Pero estoy en un VPS. – Roemer

0

PHP Official documentation for mail()

bool mail (string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]])

...

parametros_adicionales (opcionales)

Los parametros_adicionales parámetro se puede utilizar para pasar banderas adicionales como opciones de línea de comandos para el programa configurado para ser empleado al enviar correo, según lo definido por la configuración sendmail_path ajuste. Por ejemplo, esto se puede usar para configurar el remitente del sobre dirección al usar sendmail con la opción -f sendmail.

Este parámetro se escapó internamente para evitar la ejecución del comando . escapeshellcmd() impide la ejecución del comando, pero permite agregar parámetros adicionales. Por razones de seguridad, es recomendado para el usuario desinfectar este parámetro para evitar agregar parámetros no deseados al comando de shell.

Dado que escapeshellcmd() se aplica automáticamente, algunos caracteres que están permitidos como direcciones de correo electrónico por Internet RFC no se pueden utilizar. mail() no se pueden permitir dichos caracteres, por lo que en los programas donde se requiere el uso de tales caracteres , se recomienda un medio alternativo para enviar correos electrónicos (como utilizando un marco o una biblioteca).

al usuario que el servidor web se ejecuta como debería añadirse como un usuario de confianza a la configuración sendmail para evitar un 'X-Warning' de cabeza desde que se añade al mensaje cuando el remitente del sobre (-f) se ajusta utilizando este método . Para usuarios de sendmail, este archivo es /etc/mail/trusted-users.

Cuestiones relacionadas