2011-07-04 13 views
7

Tengo mi correo electrónico alojado en Rackspace Email y me gustaría utilizarlo como mi servidor de correo para el formulario de contacto en mi sitio web.¿Cómo especifico a PHP que el correo() debe enviarse usando un servidor de correo externo?

Al mirar el archivo php.ini, solo puedo especificar el sendmail_path en sistemas UNIX, desde el que he leído puntos del programa que realmente envía correo en el servidor.

No quiero enviar correos desde mi servidor Ubuntu ya que no tengo la experiencia suficiente para hacer una configuración segura para el correo electrónico ... Me gustaría retransmitir todo a mail.emailsrvr.com de Rackspace.

Mi pregunta es, ¿cómo especifico a la configuración de PHP en mi servidor que la función mail() debería estar usando un servidor de correo externo?

+3

Puntales por no tratar de enviar correo desde el servidor web directamente. Si bien puede reconfigurar su sendmail.cf para usar un servidor de correo externo, será más fácil usar un paquete PHP como se menciona en las respuestas. Uso Swiftmailer con un SMTP de terceros (SendGrid, un servicio basado en la nube de Rackspace) que hasta ahora parece funcionar bastante bien. – ldg

+0

Got SwiftMailer configurado con Rackspace correo electrónico, será el cambio a través de Rackspace SendGrid más adelante una vez que aumenta el volumen de correo electrónico. ¡Gracias! – Matt

Respuesta

11

mail() está destinado a entregar fuera a un servidor SMTP local, y hace un trabajo pobre de ella. Para obtener el soporte de correo adecuado, use Swiftmailer o PHPMailer, los cuales son totalmente compatibles con servidores SMTP externos y son mucho más fáciles de usar (además de permitirle hacer cosas como mensajes de texto mixto/html, archivos adjuntos, etc.)

+0

Swiftmailer fue extremadamente fácil de configurar, funcionó al instante con la configuración SMTP adecuada. – Matt

1

Configuración la función interna mail para usar SMTP solo está disponible en Windows. En otras plataformas, PHP debería usar el complemento sendmail o sendmail disponible localmente.

Si desea utilizar un SMTP en un servidor que no sea de Windows, tendrá que utilizar una biblioteca de terceros, como mi favorito Switfmailer.

Con el envío de un correo electrónico SwiftMailer se parece a esto:

require_once 'lib/swift_required.php'; 

//Create the Transport 
$transport = Swift_SmtpTransport::newInstance('smtp.example.org', 25) 
    ->setUsername('your username') 
    ->setPassword('your password') 
    ; 

//Create the Mailer using your created Transport 
$mailer = Swift_Mailer::newInstance($transport); 

//Create a message 
$message = Swift_Message::newInstance('Wonderful Subject') 
    ->setFrom(array('[email protected]' => 'John Doe')) 
    ->setTo(array('[email protected]', '[email protected]' => 'A name')) 
    ->setBody('Here is the message itself') 
    ; 

//Send the message 
$result = $mailer->send($message); 
1

'mail()' La función de PHP por defecto sólo va a la funcionalidad básica para enviar un correo electrónico. Para Rackspace, probablemente necesite configurar una conexión SMTP a su servidor de correo. Para hacer esto, es mejor obtener una clase de correo más avanzada y desarrollada. Varios frameworks de códigos los tienen disponibles. Si está buscando un buen paquete, consulte PHP Mailer. Es casi un estándar en estos días.

http://phpmailer.worxware.com/

require_once('../class.phpmailer.php'); 
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded 

$mail    = new PHPMailer(); 

$body    = file_get_contents('contents.html'); 
$body    = eregi_replace("[\]",'',$body); 

$mail->IsSMTP(); // telling the class to use SMTP 
$mail->Host  = "mail.yourdomain.com"; // SMTP server 
$mail->SMTPDebug = 2;      // enables SMTP debug information (for testing) 
             // 1 = errors and messages 
             // 2 = messages only 
$mail->SMTPAuth = true;     // enable SMTP authentication 
$mail->Host  = "mail.yourdomain.com"; // sets the SMTP server 
$mail->Port  = 26;     // set the SMTP port for the GMAIL server 
$mail->Username = "[email protected]"; // SMTP account username 
$mail->Password = "yourpassword";  // SMTP account password 

$mail->SetFrom('[email protected]', 'First Last'); 

$mail->AddReplyTo("[email protected]","First Last"); 

$mail->Subject = "PHPMailer Test Subject via smtp, basic with authentication"; 

$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test 

$mail->MsgHTML($body); 

$address = "[email protected]"; 
$mail->AddAddress($address, "John Doe"); 

$mail->AddAttachment("images/phpmailer.gif");  // attachment 
$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment 

if(!$mail->Send()) { 
    echo "Mailer Error: " . $mail->ErrorInfo; 
} else { 
    echo "Message sent!"; 
} 
2

no relacionado con la pregunta, pero hay demonios anuncio publicitario que sólo actúa como un daemon Sendmail, pero retransmite a un correo externo.

http://freshmeat.net/projects/nullmailer/

Si usted ni siquiera necesita un exim/sendmail instalar en su máquina, le sugiero que trate de eso. Por supuesto, todavía puede usar otras alternativas de terceros, sin embargo, si ejecuta un daemon localmente, también podrá poner en cola el correo, lo que php lib no puede hacer, si el smtp de retransmisión no está disponible.

Es parte del repositorio normal de Debian, así que supongo que también es cierto para ubuntu, solo apt-get install nullmailer debería ser suficiente. Luego puede configurarlo con 1 o más relés smtp que puede usar.

Ver más aquí: http://packages.ubuntu.com/oneiric/nullmailer

Como nota al margen, un sistema Linux sin un sistema de anuncio publicitario se convierte paralizado de muchas otras maneras, por lo que creo que es una buena idea tampoco cómo.

9

Como yo estaba investigando este problema y me encontré con este puesto y una biblioteca PHP de terceros no era una opción para mí.

Como sabemos, PHP utiliza el comando sendmail del servidor por defecto La opción sendmail_path en php.ini se puede cambiar para anular la configuración de su propio mando con sus propios argumentos, etc. Por ejemplo: sendmail_path = /usr/bin/unix2dos | /usr/bin/dos2unix | /usr/sbin/sendmail -t -i

ssmtp le permitirá dirigir los correos electrónicos salientes a un mailhost de su servidor web/php. https://wiki.archlinux.org/index.php/SSMTP

apt-get install ssmtp 

continuación, puede utilizar sendmail_path = /usr/sbin/ssmtp -t para contar php para usar ssmtp en lugar de sendmail. Asegúrese de reiniciar el servidor web después de haber hecho cambios a php.ini

También asegúrese de que ha configurado ssmtp y validado el SPF, DKIM, registros DMARC antes de realizar los cambios en sendmail_path en php.ini

Por ejemplo, servidor de correo gmail. /etc/ssmtp/ssmtp.conf

# The user that gets all the mails (UID < 1000, usually the admin) 
[email protected] 

# The mail server (where the mail is sent to), both port 465 or 587 should be acceptable 
# See also http://mail.google.com/support/bin/answer.py?answer=78799 
mailhub=smtp.gmail.com:587 

# The address where the mail appears to come from for user authentication. 
rewriteDomain=yourdomain.com 

# The full hostname 
hostname=FQDN.yourdomain.com 

# Use SSL/TLS before starting negotiation 
UseTLS=Yes 
UseSTARTTLS=Yes 

# Username/Password 
[email protected] 
AuthPass=postmaster-password 

# Email 'From header's can override the default domain? 
FromLineOverride=yes 

Por una cuestión de cambio de pila para ver la misma https://unix.stackexchange.com/questions/36982/can-i-set-up-system-mail-to-use-an-external-smtp-server

Para ampliar esto.

Si el uso de Google, cada dirección de correo electrónico From: debe ser configurado en la cuenta que se envía como una "cuenta que el propietario de" ajuste en las cuentas. De lo contrario, Google reescribirá los encabezados con x-google-original-from y especificará el De como cuenta de envío.

2

Para aquellos que no desean usar una biblioteca PHP como Swiftmailer (y en última instancia, aquellos que no quieren tocar su código PHP solo para cambiar de servidor SMTP), puede hacer una de las siguientes cosas:

1.) los servidores de Windows: Modificar el archivo PHP INI a utilizar un servidor de retransmisión SMTP externo. Lo verá en la sección de correo con la etiqueta "Solo para servidores de Windows", o algo similar.

2.) Servidores Linux: Instalación de Postfix (e-mail servicio de retransmisión) y configurarlo para usar un servidor SMTP externo. Su instalación de PHP intentará usar esto para enviar correos electrónicos por defecto sin ninguna configuración adicional.

** Evidentemente, esto no pretende brindarle detalles paso a paso de las opciones anteriores, sino que lo guía en la dirección correcta si está buscando una solución que no requiera cambiar las instancias en su código donde se llama el correo de PHP()

Cuestiones relacionadas