Envío de correo electrónico con PHP desde un servidor SMTP

131
$from = "[email protected]";
$headers = "From:" . $from;
echo mail ("[email protected]" ,"testmailfunction" , "Oj",$headers);

Tengo problemas para enviar correos electrónicos en PHP. Me aparece un error: SMTP server response: 530 SMTP authentication is required.

Tenía la impresión de que puede enviar un correo electrónico sin SMTP para verificar. Sé que este correo se filtrará, pero eso no importa en este momento.

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = someonelse@example.com

Esta es la configuración en el php.iniarchivo. ¿Cómo debo configurar SMTP? ¿Hay algún servidor SMTP que no requiera verificación o debo configurar un servidor yo mismo?

Borut Flis
fuente

Respuestas:

168

Cuando envía un correo electrónico a través de un servidor que requiere autenticación SMTP, realmente necesita especificarlo y configurar el host, el nombre de usuario y la contraseña (y tal vez el puerto si no es el predeterminado: 25).

Por ejemplo, generalmente uso PHPMailer con configuraciones similares a estas:

$mail = new PHPMailer();

// Settings
$mail->IsSMTP();
$mail->CharSet = 'UTF-8';

$mail->Host       = "mail.example.com"; // SMTP server example
$mail->SMTPDebug  = 0;                     // enables SMTP debug information (for testing)
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Port       = 25;                    // set the SMTP port for the GMAIL server
$mail->Username   = "username"; // SMTP account username example
$mail->Password   = "password";        // SMTP account password example

// Content
$mail->isHTML(true);                                  // Set email format to HTML
$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

$mail->send();

Puede encontrar más información sobre PHPMailer aquí: https://github.com/PHPMailer/PHPMailer

Ivo Pereira
fuente
21
+1 para phpMailer: es la alternativa de personas sensatas a la mail()función integrada de PHP .
COSUDE
8
Vale la pena señalar para aquellos que tropiezan con esta respuesta que PHPMailer también está integrado en WordPress y se puede configurar usando el 'phpmailer_init'gancho de acción. Es una forma conveniente de configurar WordPress para correo SMTP o Amazon SES (que admite conexiones SMTP).
Matt van Andel
1
¿Se permite utilizar PHP Mailer en scripts pagados?
Luka
2
@Luka Sí, lo es. Según su archivo de licencia, PHPMailer utiliza la licencia LGPL 2.1, que permite el uso comercial.
Alejandro
¿Necesito hacer algo especial para usar este código? ¿Dónde pongo esto? ¿Puedo llamarlo con un formulario HTML5 con una solicitud POST? ¿Cómo envío un correo electrónico una vez que creé este objeto PHPMailer?
Aaron Franke el
53
<?php
ini_set("SMTP", "aspmx.l.google.com");
ini_set("sendmail_from", "[email protected]");

$message = "The mail message was sent with the following mail setting:\r\nSMTP = aspmx.l.google.com\r\nsmtp_port = 25\r\nsendmail_from = [email protected]";

$headers = "From: [email protected]";

mail("[email protected]", "Testing", $message, $headers);
echo "Check your email now....&lt;BR/>";
?>

o, para más detalles, sigue leyendo .

Dipesh Parmar
fuente
La IP que está utilizando para enviar correo no está autorizada para enviar 550-5.7.1 correo electrónico directamente a nuestros servidores. Me sale este error. Todo lo que quiero es un correo abierto.
Borut Flis
No tengo una IP estática. ¿Conoces alguna retransmisión de correo abierto?
Borut Flis
1
Además, consulte support.google.com/a/answer/176600?hl=es para los retransmisores SMTP de Google.
Fyrye
55
Esta es la mejor respuesta para los php mail()problemas de la función GoDaddy - 2017 - no debería tener que descargar PHPMailer o algún otro recurso de terceros - gracias
soulshined
44
El enlace "LEER EN" está roto
vladkras
46

Para los usuarios de Unix, mail () está usando el comando Sendmail para enviar correos electrónicos. En lugar de modificar la aplicación, puede cambiar el entorno. msmtp es un cliente SMTP con sintaxis CLI compatible con Sendmail, lo que significa que se puede usar en lugar de Sendmail. Solo requiere un pequeño cambio en su php.ini.

sendmail_path = "/usr/bin/msmtp -C /path/to/your/config -t"

Entonces, incluso la función lowly mail () puede funcionar con la bondad SMTP. Es súper útil si está intentando conectar una aplicación existente a servicios de correo como sendgrid o mandrill sin modificar la aplicación.

txyoji
fuente
1
Gran solución, ¡úsala en varios servidores ahora!
raice
3
Implementar esto en mis contenedores Docker para aplicaciones que no usan una biblioteca de correo.
Batandwa
Excelente ruta de migración de vainilla mail()a algo que admita SMTP. ¡Gracias!
rinogo
MSMTP también está disponible para Windows. Las descargas obvias tienen la versión 1.4. La versión que encontré en alguna parte es 1.6.2. No sé si hay un 1.8.6 para Windows.
Bilbo
El autor dejó de proporcionar binarios de Windows antes de febrero de 2016.
Bilbo
17

El problema es que la mail()función PHP tiene una funcionalidad muy limitada. Hay varias formas de enviar correo desde PHP.

  1. mail()utiliza el servidor SMTP en su sistema. Hay al menos dos servidores que puede usar en Windows: hMailServer y xmail . Pasé varias horas configurándolos y levantándolos. El primero es más simple en mi opinión. En este momento, hMailServer está trabajando en Windows 7 x64.
  2. mail()utiliza el servidor SMTP en una máquina remota o virtual con Linux. Por supuesto, el servicio de correo real como Gmail no permite la conexión directa sin credenciales o claves. Puede configurar una máquina virtual o usar una ubicada en su LAN. La mayoría de las distribuciones de Linux tienen un servidor de correo listo para usar. Configúralo y diviértete. Yo uso exim4 predeterminado en Debian 7 que escucha su interfaz LAN.
  3. Las bibliotecas de correo usan conexiones directas. Las bibliotecas son más fáciles de configurar. Usé SwiftMailer y envía perfectamente el correo de la cuenta de Gmail. Creo que PHPMailer también es bastante bueno.

No importa qué opción elija, le recomiendo que use una capa de abstracción. Puede usar la biblioteca PHP en su máquina de desarrollo con Windows y simplemente mail()funcionar en la máquina de producción con Linux. La capa de abstracción le permite intercambiar controladores de correo dependiendo del sistema en el que se esté ejecutando su aplicación. Crear MyMailerclase abstracta o interfaz con send()método abstracto . Heredar dos clases MyPhpMailery MySwiftMailer. Implemente el send()método de manera apropiada.

George Sovetov
fuente
17

Aquí hay una manera de hacerlo con PHP PEAR

// Pear Mail Library
require_once "Mail.php";

$from = '<[email protected]>'; //change this to your email address
$to = '<[email protected]>'; // change to address
$subject = 'Insert subject here'; // subject of mail
$body = "Hello world! this is the content of the email"; //content of mail

$headers = array(
    'From' => $from,
    'To' => $to,
    'Subject' => $subject
);

$smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => '[email protected]', //your gmail account
        'password' => 'snip' // your password
    ));

// Send the mail
$mail = $smtp->send($to, $headers, $body);

//check mail sent or not
if (PEAR::isError($mail)) {
    echo '<p>'.$mail->getMessage().'</p>';
} else {
    echo '<p>Message successfully sent!</p>';
}

Si usa Gmail SMTP, recuerde habilitar SMTP en su cuenta de Gmail, en la configuración

EDITAR: si no puede encontrar Mail.php en debian / ubuntu, puede instalar php-pear con

sudo apt install php-pear

Luego instale la extensión de correo:

sudo pear install mail
sudo pear install Net_SMTP
sudo pear install Auth_SASL
sudo pear install mail_mime

Entonces deberías poder cargarlo simplemente require_once "Mail.php" si no está ubicado aquí:/usr/share/php/Mail.php

Bolli
fuente
1
require_once ('/usr/share/somewhere/Mail.php');
10

Hay algunos servidores SMTP que funcionan sin autenticación, pero si el servidor requiere autenticación, no hay forma de evitarlo.

Las funciones de correo incorporadas de PHP son muy limitadas: la especificación del servidor SMTP solo es posible en Windows. En * nix, mail()usará los binarios del sistema operativo.

Si desea enviar un correo electrónico a un servidor SMTP arbitrario en la red, considere usar una biblioteca como SwiftMailer . Eso le permitirá utilizar, por ejemplo, los servidores salientes de Google Mail.

Pekka
fuente
2

En los casos en que aloja un sitio de Wordpress en Linux y tiene acceso al servidor, puede ahorrar algunos dolores de cabeza instalando msmtp que le permite enviar a través de smtp desde la función php mail () estándar. msmtp es una alternativa más simple a postfix que requiere un poco más de configuración.

Aquí están los pasos:

Instalar msmtp

sudo apt-get install msmtp-mta ca-certificates

Cree un nuevo archivo de configuración:

sudo nano /etc/msmtprc

... con la siguiente información de configuración:

# Set defaults.    
defaults

# Enable or disable TLS/SSL encryption.
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt

# Set up a default account's settings.
account default
host <smtp.example.net>
port 587
auth on
user <username@example.net>
password <password>
from <address-to-receive-bounces@example.net>
syslog LOG_MAIL

Debe reemplazar los datos de configuración representados por todo dentro de "<" y ">" (inclusive, elimínelos). Para host / nombre de usuario / contraseña, use sus credenciales normales para enviar correo a través de su proveedor de correo.

Dile a PHP que lo use

sudo nano /etc/php5/apache2/php.ini

Agregue esta sola línea:

sendmail_path = /usr/bin/msmtp -t

La documentación completa se puede encontrar aquí:

https://marlam.de/msmtp/

Peter Drinnan
fuente
ssmtp también es una solución, consulte (guía en francés): elliptips.info/guide-debian-7-envoi-de-mails-ligne-de-commande
ıɾuǝʞ