Código de autorización SMTP. Envío de correos electrónicos (SMTP vs correo PHP). Cómo enviar correos electrónicos usando ASP

Dado que está prohibido enviar mensajes anónimos desde servidores de hosting virtuales de Windows, el envío de cartas debe realizarse a través de un servidor SMTP, para lo cual también es posible utilizar nuestro sistema de correo.

¿Cómo enviar correos electrónicos usando PHP?

Usando cualquier clase PHP que admita autorización en el servidor smtp. Por ejemplo, puede utilizar el conjunto de clases PHPMailer.

También puede utilizar nuestro ejemplo, que implementa el envío de cartas mediante un servidor SMTP, que requiere autorización. Por lo tanto, no olvide agregar los detalles de acceso apropiados al script, por ejemplo:

// Si necesita mostrar el registro de la sesión SMTP, puede descomentar la siguiente línea. // $_SERVER["depurar"] = verdadero; función MailSmtp ($reciever, $asunto, $contenido, $headers, $debug = 0) ( $smtp_server = "smtp.site"; // dirección del servidor SMTP$smtp_port = 25; // puerto del servidor SMTP$smtp_user = " [correo electrónico protegido]" ; // Nombre de usuario para autorización en el servidor SMTP$smtp_password = "pAsSword"; // Contraseña para autorización en el servidor SMTP$correo_de = " [correo electrónico protegido]" ; // Buzón desde donde se envía la carta$calcetín = fsockopen ($smtp_server, $smtp_port, $errno, $errstr, 30); $cadena = fgets ($calcetín, 512); if (! $calcetín ) ( printf ( "El socket no está creado\n" ); exit(1 ); ) smtp_msg ($sock , "HELO " . $_SERVER [ "SERVIDOR_NOMBRE" ]); smtp_msg($calcetín, "AUTH INICIO DE SESIÓN"); smtp_msg ($calcetín, base64_encode ($smtp_user)); smtp_msg ($calcetín, código base64 ($smtp_contraseña)); smtp_msg ($calcetín, "CORREO DE:<" . $mail_from . ">" ); smtp_msg ($calcetín, "RCPT A:<" . $reciever . ">" ); smtp_msg ($sock , "DATOS" ); $encabezados = "Asunto: " . $asunto . "\r\n" . $encabezados ; $datos = $encabezados . "\r\n\r\n" . $contenido . "\r\n." ; smtp_msg ($calcetín, $datos); smtp_msg ($calcetín, "SALIR"); fclose ($calcetín); ) función smtp_msg ($calcetín, $msg) ( si ( ! $calcetín ) ( printf ("¡Socket roto!\n" ); exit(1 ); ) if (isset($_SERVER [ "depurar" ]) && $_SERVER [ "depurar" ]) ( printf ( "Enviar desde nosotros : %s
" , nl2br (htmlspecialchars ($msg )); ) fputs ($sock , " $msg \r\n" ); $str = fgets ($sock , 512 ); if (! $sock ) ( printf ( "El zócalo es abajo\n" ); salir(1); ) else ( if (isset($_SERVER [ "depurar" ]) && $_SERVER [ "depurar" ]) ( printf ("Obtenido del servidor: %s
" , nl2br (htmlspecialchars ($str )); ) $e = explotar (" " , $str ); $code = array_shift ($e ); $str = implosionar ( " " , $e ); if ($code > 499 ) ( imprimirf ( "Problemas con la conversación SMTP.

Código %d.
Mensaje %s
"
, $código , $cadena ); salir(1); ) ) ) ?>

Descargue un ejemplo de un script listo para usar con la función MailSmtp(): smtpauth.php.sample

Puede utilizar la función MailSmtp() descrita anteriormente para reemplazar directamente la función mail(); considere un ejemplo de la forma más simple en PHP:

// Encabezados de mensajes, definen la codificación del mensaje, campos De, A, etc.$headers = "Versión MIME: 1.0\r\n" ; $encabezados .= "Tipo de contenido: texto/html; charset=windows-1251\r\n"; $encabezados .= "Para: $para \r\n" ; $encabezados .= "De: nombre del remitente " ; // correo ($a, $asunto, $mensaje, $encabezados); require_once "smtpauth.php"; MailSmtp ($a, $asunto, $mensaje, $encabezados); ) ?>
A quien: Sujeto: Texto: 
 
 

Con el fin de esta forma funcionó sin la función mail(), incluimos el archivo smtpauth.php a través de require_once y llamamos a la función MailSmtp() descrita en él, con argumentos similares a mail(). Al mismo tiempo, comentamos la llamada mail() en el código para evitar errores al ejecutar el script.

¿Cómo enviar correos electrónicos usando ASP.NET?

Si está utilizando la versión 2.0, utilice la clase MailMessage Sistema.Net.Mail), Bien descrito.

A continuación se muestran ejemplos de su uso para los lenguajes C# y VisualBasic:

Ejemplo para el lenguaje C#:

<% @Page Language="c#" %> <% @Import Namespace="System.Net.Mail" %> <% @Import Namespace="System.Net" %> <% MailMessage message = new MailMessage(); //creando una nueva carta mensaje.Para.Agregar(" [correo electrónico protegido]"); // agregando la dirección del destinatario mensaje.De = nueva dirección de correo("de@ dominio.tld", "Nombre del remitente"); // especificando el nombre y la dirección del remitente message.Subject = "Asunto del mensaje"; // especificando el asunto de la carta mensaje.BodyEncoding = System.Text.Encoding.UTF8; // especificando la codificación de letras mensaje.IsBodyHtml = falso; // especificando el formato de la letra (verdadero - HTML, falso - no HTML) mensaje.Cuerpo = "Texto del mensaje"; // especificando el texto (cuerpo) de la carta Cliente SmtpClient = nuevo SmtpClient("smtp.site",25); // creando una nueva conexión al servidor "smtp.site" client.DeliveryMethod = SmtpDeliveryMethod.Network; // define el método para enviar mensajes client.EnableSsl = falso; // desactiva la necesidad de utilizar una conexión segura al servidor client.UseDefaultCredentials = falso; // deshabilitar el uso de detalles de autorización predeterminados client.Credentials = nueva NetworkCredential("postmaster@ dominio.tld", "***contraseña***"); // especificando los detalles necesarios (nombre de usuario y contraseña) para la autorización en el servidor SMTP cliente.Enviar(mensaje); // enviar mensaje %>

Descargue un ejemplo de un formulario completo que demuestra el uso este método: Formulario de correo.aspx.

Ejemplo para el lenguaje VisualBasic:

<% @Page Language="VB" Debug="true" %> <% @Import Namespace="System.Net.Mail" %> <% @Import Namespace="System.Net" %> <% Dim smtpMssg AS new MailMessage smtpMssg.From = New MailAddress ("admin@dominio.tld", "Nombre_remitente") smtpMssg.To.Add (" [correo electrónico protegido]") "agregando la dirección del destinatario smtpMssg.Subject = "Asunto del correo electrónico" "indicación del asunto de la carta smtpMssg.Body = "Texto del mensaje" "indicación del texto (cuerpo) de la carta smtpMssg.BodyEncoding = System.Text.Encoding.UTF8 "indicación de la codificación de letras smtpMssg.IsBodyHtml = falso " indicación del formato de la letra (verdadero - HTML, falso - no HTML) Atenuar SmtpMail como nuevo SmtpClient("smtp.site", 25) "declaración de un nuevo objeto de tipo "SmtpClient" SmtpMail.DeliveryMethod = SmtpDeliveryMethod.Network "indicación del método de entrega de la carta SmtpMail.UseDefaultCredentials = Falso "deshabilitar el uso de credenciales de autorización de forma predeterminada" SmtpMail.EnableSsl = Falso " desactiva la necesidad de utilizar una conexión segura al servidor SmtpMail.Credentials = nueva NetworkCredential("postmaster@ dominio.tld", "***contraseña***") "indicando los datos necesarios (nombre de usuario y contraseña) para la autorización en el servidor SMTP SmtpMail.Enviar(smtpMssg) " enviando un mensaje %>

También hay una clase SmtpMail obsoleta (y obsoleta) (que usa el espacio de nombres Sistema.Web.Mail). A continuación se muestra un ejemplo de su uso para el lenguaje VisualBasic:

<% @Page Language="VB" Debug="true" %> <% @Import Namespace="System.Web" %> <% @Import Namespace="System.Web.Mail" %> <% Dim smtpMssg = new MailMessage "declaración de un nuevo objeto de tipo "MailMessage" smtpMssg.From = "nombre_remitente dominio.tld>" "Indicación del nombre y dirección del remitente smtpMssg.To = "admin@ dominio.tld" " indicación de la dirección del destinatario smtpMssg.BodyFormat = Formatodecorreo.Texto "indicación del formato de la carta smtpMssg.BodyEncoding = Codificación.UTF8 "indicando la codificación de letras smtpMssg.Subject = "Asunto del correo electrónico" "indicación del asunto de la carta smtpMssg.Body = "Texto del mensaje" " indicación del texto de la carta smtpMssg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate",1) "que indica la necesidad de autorización SMTP en el servidor smtpMssg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "admin@ dominio.tld") "nombre de usuario para autorización smtpMssg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "***contraseña***") "contraseña para autorización SmtpMail.SmtpServer = "smtp.sitio" "especificando la dirección del servidor SMTP SmtpMail.Enviar(smtpMssg) " enviando un mensaje %>

¿Cómo enviar correos electrónicos usando ASP?

Tenga en cuenta que cuando utilice nuestro servidor SMTP, se requiere autorización, así que no olvide agregar los detalles de acceso apropiados al script, por ejemplo:

<% iConfig = Server.CreateObject("CDO.Configuration") Set iConfig = Server.CreateObject("CDO.Configuration") With iConfig.Fields .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.сайт" .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 .Item("http://schemas.microsoft.com/cdo/configuration/languagecode") = "ru" .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "postmaster@dominio.tld" .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "contraseña" .Update End With Set cdoMessage = CreateObject("CDO.Message") With cdoMessage Set .Configuration = iConfig .From = "Usuario de prueba dominio.tld>" .To = "Usuario " .Subject = "Hola, usuario" .TextBody = "Escribo este mensaje desde un script ASP." .Enviar finalizar con Establecer cdoMessage = Nada Establecer iConfig = Nada %>

Algunos CMS ya tienen herramientas integradas para enviar correspondencia o módulos correspondientes; veamos los más populares.

Wordpress

Para este CMS hay un módulo especial "WP Mail SMTP", un ejemplo de su configuración se describe en la página del módulo.

Preste atención a la ilustración del ejemplo, en nuestro sistema de correo es necesario utilizar el puerto 25 y no se requiere cifrado SSL.

Joomla

En el panel de administración, vaya a la sección "Configuración general", seleccione la pestaña "Servidor". En el campo "Correo", debe seleccionar el método de envío como "servidor SMTP", en los campos "dirección del servidor SMTP" e "inicio de sesión SMTP" y "contraseña SMTP" especifique los detalles apropiados del sistema de correo, por ejemplo: sitio smtp, caja@tu_dominio y correspondiente contraseña.

drupal

Este CMS también dispone de su propio módulo para trabajar con un servidor SMTP, basado en el PHPMailer. Puede descargar este módulo en su página en el sitio web de CMS Drupal; una descripción de la instalación del módulo está disponible en el archivo que lo acompaña.

NetCat

Este CMS no tiene funciones integradas para trabajar con un servidor SMTP. Para enviar correo utilizando scripts del sitio, podemos ofrecerle el uso de nuestra solución; para conectarla debe realizar los siguientes pasos:

  • Descargue un archivo con los archivos necesarios de nuestro sitio web ( enviar_auth_mail.php Y correo.inc.php) y descomprímalo en su computadora;
  • Editar archivo enviar_auth_mail.php del archivo, indicando en él los detalles de conexión al servidor SMTP deseado:

    • $correo_smtpServer = "sitio smtp"; (Dirección del servidor SMTP)
    • $puerto_correo = "25" ; (puerto de conexión)
    • $correo_nombredeusuario = "[correo electrónico protegido]" ; (nombre de usuario para autorización en el servidor SMTP)
    • $contraseña_correo = "Contraseña"; (contraseña de autorización en el servidor SMTP)
  • Crear una copia de seguridad del archivo dominio.tld/www/netcat/admin/mail.inc.php;
  • descargar archivos enviar_auth_mail.php Y correo.inc.php al sitio virtual en el directorio dominio.tld/www/netcat/admin/

dominio.tld debe ser reemplazado con su nombre de dominio.

La solución propuesta funciona con todos los módulos de NetCat que utilizan las funciones estándar de este CMS para enviar correo.

Durante mucho tiempo estuve buscando una solución para enviar cartas a los usuarios no a través de la función mail() en PHP, sino a través de servidores de correo SMTP. En Internet no hay mucha información variada y la que hay no funciona del todo bien o no funciona en absoluto. Por lo tanto, armé todo y escribí mi propio código, basado en los ya preparados que se presentan en los sitios.

¿Por qué enviar por SMTP y no por correo()?

Mi respuesta es bastante simple: durante algún tiempo, los virus enviaron toneladas de cartas a través de mi servidor, lo que provocó que muchos remitentes de correo, en particular gmail.com, prohibieran mi dirección IP y, en relación con esto, los usuarios podían recibir cartas, así que Tuve que buscar una alternativa y la encontré: esto es SMTP.

Quizás te interese saber por qué mi guión es mejor que otros que están a la vista. contestaré

  1. Funciona con Yandex, Rambler, Mail (gmail no pudo ganar)
  2. Borrar código. Para configurarlo basta con cambiar unas líneas
  3. Envía correos electrónicos en formato HTML

Aquí están las ventajas de mi script, que no encontré en ningún lugar de Internet, pero de cada uno saqué todo lo que necesitaba. Entonces, veamos el código.

Función smtpmail($mail_to, $subject, $message, $service="yandex") ( $config["smtp_charset"] = "windows-1251"; //codificación de mensajes. (o UTF-8, etc.) $config [ "smtp_from"] = "mashintop.ru"; //Su nombre - o el nombre de su sitio. Se mostrará cuando se lea en el campo "De" $config["smtp_debug"] = false; //Si lo desea para ver mensajes de error, especifique verdadero en lugar de falso $config["smtp_port"] = "25"; // Puerto de trabajo. No cambie si no está seguro. if($service=="yandex") ( $config[ "smtp_searcher"] = "yandex.ru"; $config["smtp_email"] = " [correo electrónico protegido]"; $config["smtp_username"] = "mashintop"; //Cambie el nombre de su buzón. $config["smtp_host"] = "smtp.yandex.ru"; //servidor para enviar correo $config[" smtp_password "] = "moi_parol"; //Cambiar la contraseña ) elseif($service=="rambler") ( $config["smtp_searcher"] = "rambler.ru"; $config["smtp_email"] = " [correo electrónico protegido]"; $config["smtp_username"] = "mashintop"; //Cambie el nombre de su buzón. $config["smtp_host"] = "smtp.rambler.ru"; //servidor para enviar correo $config[" smtp_password "] = "moi_parol"; //Cambiar la contraseña ) elseif($service=="mail") ( $config["smtp_searcher"] = "mail.ru"; $config["smtp_email"] = " [correo electrónico protegido]"; $config["smtp_username"] = "mashintop"; //Cambie el nombre de su buzón. $config["smtp_host"] = "smtp.mail.ru"; //servidor para enviar correo $config[" smtp_password "] = "moi_parol"; //Cambiar contraseña) elseif($service=="gmail") ( $config["smtp_searcher"] = "gmail.com"; $config["smtp_email"] = " [correo electrónico protegido]"; $config["smtp_username"] = "alexeybertram"; //Cambie el nombre de su buzón. $config["smtp_host"] = "smtp.gmail.com"; //servidor para enviar correo $config[" smtp_password "] = "moi_parol"; //Cambiar contraseña ) $header="Fecha: ".date("D, j M Y G:i:s")." +0700rn"; $header.="Desde: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("".$config[" smtp_from"]."")))."?=<".$config["smtp_email"].">rn"; $header.="X-Mailer: ¡El murciélago! (v3.99.3) Profesional"; $header.="Responder a: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode(" ".$config["smtp_from"]."")))."?=<".$config["smtp_email"].">rn"; $header.="Prioridad X: 3 (Normal)rn"; $header.="ID del mensaje:<172562218.".date("YmjHis")."@".$config["smtp_searcher"].">rn"; $header.="Para: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("")))."? =<$mail_to>rn"; $header.="Asunto: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("".$subject."" )))."?=rn"; $header.="Versión MIME: 1.0rn"; $header.="Tipo de contenido: texto/html; charset=windows-1251rn"; $header.="Codificación-de-transferencia-de-contenido: 8bitrn"; $smtp_conn = fsockopen("".$config["smtp_host"]."", $config["smtp_port"],$errno , $errstr, 10); if(!$smtp_conn) (imprimir "falló la conexión desde los servidores"; fclose($smtp_conn); salir;) $data = get_data($smtp_conn); fputs($smtp_conn,"EHLO ". $ config["smtp_searcher"]."rn"); $code = substr(get_data($smtp_conn),0.3000); if($code != 250) (imprimir "EHLO hola error"; fclose($smtp_conn); salir; ) fputs($smtp_conn,"AUTH LOGINrn"); $code = substr(get_data($smtp_conn),0.3000); if($code != 334) (print "el servidor no permitió que comenzara la autorización"; fclose ($ smtp_conn); salir;) fputs($smtp_conn,base64_encode("".$config["smtp_username"]."")."rn"); $code = substr(get_data($smtp_conn),0,3000) ; si ($code != 334) (print "error al acceder a este usuario"; fclose($smtp_conn); exit;) fputs($smtp_conn,base64_encode("".$config["smtp_password"].""). "rn" ); $code = substr(get_data($smtp_conn),0,3000); if($code != 235) (imprimir "contraseña incorrecta"; fclose($smtp_conn); salir;) fputs($smtp_conn,"MAIL FROM:".$config["smtp_email"]."rn"); $código = substr(get_data($smtp_conn),0.3000); if($code != 250) (imprime "el servidor rechazó el comando MAIL FROM"; fclose($smtp_conn); exit;) fputs($smtp_conn,"RCPT TO:".$mail_to."rn"); $código = substr(get_data($smtp_conn),0.3000); if($code!= 250 AND $code!= 251) (print "El servidor no aceptó el comando RCPT TO"; fclose($smtp_conn); exit;) fputs($smtp_conn,"DATArn"); $código = substr(get_data($smtp_conn),0.3000); if($código!= 354) (imprimir "el servidor no aceptó DATOS"; fclose($smtp_conn); salir;) fputs($smtp_conn,$header."rn".$message."rn.rn"); $código = substr(get_data($smtp_conn),0.3000); if($code != 250) (imprimir "error al enviar carta"; fclose($smtp_conn); salir;) fputs($smtp_conn,"QUITrn"); fclose($smtp_conn); ) función get_data($smtp_conn) ( $datos=""; while($str = fgets($smtp_conn,515)) ( $datos .= $str; if(substr($str,3,1) == " " ) ( descanso; ) ) devolver $datos; ) $text_email = " Acaba de añadir un anuncio en el sitio web mashintop.ru. Puedes verlo aquí
Tu clave: ".$key".

Con esta clave podrás gestionar tu anuncio.

"; $text_email .= " "; smtpmail(" [correo electrónico protegido]", "La clave del anuncio en mashintop.ru", $text_email, "yandex"); //usa Yandex smtpmail(" [correo electrónico protegido]", "La clave del anuncio en mashintop.ru", $text_email, "mail"); //usa el correo electrónico smtpmail(" [correo electrónico protegido]", "La clave del anuncio en mashintop.ru", $text_email, "rambler"); //usa el rambler smtpmail(" [correo electrónico protegido]", "La clave del anuncio en mashintop.ru", $text_email, "gmail"); // pero gmail no funciona :(

Eso es todo, el script terminado está en tus manos, simplemente cópialo, cambia los valores de la matriz $config y todo funcionará bien.

Ahora veamos algunos elementos en los que me gustaría centrarme.

Por ejemplo, el error que nos sale cuando intentamos enviar vía SMTP a Google. Inicialmente vemos este texto de error:

Para ver algo más específico modifiquemos un poco el código.

Fputs($smtp_conn,"AUTH LOGINrn"); $código = substr(get_data($smtp_conn),0.3000); eco $código; if($code != 334) (imprimir "el servidor no permitió que comenzara la autorización"; fclose($smtp_conn); salir;)

Y al final obtenemos un error muy específico.

530 5.7.0 Primero debe emitir un comando STARTTLS. x4sm16408296lbn.2 - gsmtp

No sé qué significa exactamente, pero creo que tiene algo que ver con una conexión segura y no segura. Todavía no sé cómo deshacerme de él, por lo que Gmail sigue invicto por el momento.



2019-08-05

¡Hola querido visitante!

Perdóneme por el retraso en actualizar el blog. Pero hay una explicación completamente comprensible para esto. Después de todo, era verano, la casa de campo, los invitados, el bosque, el agua y mucho más, lo que no me permitió abordar los problemas de la creación de un sitio web. Pero ahora me he liberado un poco, los invitados se han ido y creo que ahora definitivamente podré prestarle la debida atención.

Entonces, después de que en el último artículo conectamos el correo de nuestro dominio a uno de los servicios de correo, ahora veamos cómo enviar correos electrónicos desde el sitio. Además, de tal forma que nuestras cartas no acaben en SPAM, sino que sean entregadas de forma fiable, con un alto grado de probabilidad, a nuestros destinatarios.

En general, existe una función mail() incorporada para enviar cartas en PHP. Pero cabe señalar que a pesar de la sencillez de este método (en este caso, para enviar cartas basta con especificar una sola línea de código con determinados parámetros), el uso de esta opción tiene un inconveniente importante asociado al problema del SPAM. .

El hecho es que los filtros anti-SPAM de los servidores de correo del lado del destinatario no favorecen realmente las cartas enviadas a través de la función mail(). Y en la mayoría de los casos, estos mensajes se filtran o incluso se eliminan antes de llegar al destinatario.

Y para eliminar al máximo estos casos se suele recurrir a otra opción, en la que las cartas se envían como si lo hiciera un servicio de correo de terceros.

Este método se llama enviar correo vía SMTP con autorización. Lo cual veremos hoy usando el ejemplo de envío de un formulario de comentarios. Además, para ello utilizaremos la conocida y popular biblioteca PHPMailer, que le permite organizar de forma muy sencilla el envío de cartas a través de SMTP.

  • Cómo enviaremos cartas de comentarios
  • Crear un formulario de comentarios
  • Instalación de la biblioteca PHPMailer
  • Creamos un script para enviar correo vía SMTP
  • Comprobando el envío de correo electrónico
  • Archivos fuente del sitio

Cómo enviaremos cartas de comentarios

Antes de comenzar el trabajo práctico de enviar cartas de comentarios, primero decidamos cómo lo haremos.

El formulario de comentarios está diseñado para permitir que el usuario se comunique con el administrador del sitio para transmitir su mensaje. Normalmente, este formulario consta de varios campos y un botón "Enviar".

En principio, para enviar un correo electrónico basta con utilizar sólo unos pocos campos que proporcionen información suficiente sobre el usuario y el contenido del mensaje, como por ejemplo:

  • "Nombre": para ingresar el nombre del remitente del mensaje;
  • "Correo electrónico": para la dirección de correo electrónico del remitente;
  • "Asunto del mensaje";
  • "Mensaje de texto".

Aunque puedes agregar otros. Por ejemplo, un número de teléfono, si es realmente necesario.

En nuestro caso, dichas cartas se enviarán a la dirección del administrador del sitio desde un buzón real con autorización en el servicio de correo al que está conectado nuestro dominio.

Dado que en el artículo anterior nos centramos en comprobar la conexión del correo del dominio al servicio Yandex.Mail, enviaremos correo para esta opción. Aunque esto no es importante. A continuación verá las opciones que, cuando se modifiquen, le permitirán enviar correo electrónico a través del servidor de correo Mail.ru.

Como buzón real desde el que se enviarán las cartas, utilizaremos la cuenta de un usuario de correo de dominio recién creado, digamos con la dirección [correo electrónico protegido]. Y enviaremos estas cartas al buzón del administrador. [correo electrónico protegido], que creamos previamente en el artículo anterior.

Por lo tanto, el remitente de la carta del formulario de comentarios será el buzón. [correo electrónico protegido]., y el destinatario - [correo electrónico protegido]. En este caso, toda la información sobre el usuario que envió el mensaje con su contenido se transmitirá en el cuerpo de la carta enviada.

Crear un formulario de comentarios

Una vez que hayamos decidido el procedimiento para enviar cartas, ahora crearemos un formulario de comentarios con el que lo haremos.

A continuación se muestra el código HTML para este formulario, que colocaremos en la página "Contactos" (archivo kontakty.php en el directorio de artículos).

    "artículo" >

    Contactos

    Comentario

    "contacto" acción = "#" método = "correo" >

    Formulario de comentarios

    Para todas las preguntas, solicitudes y propuestas comerciales, puede contactarnos a través del formulario de comentarios a continuación.

    "bloque de contacto" >

    "entrada de contacto" >

    "texto" identificación = "nombre de contacto" nombre = "nombre de contacto" título = "El nombre debe estar en ruso y contener al menos 3 caracteres" patrón = "{3,}" requerido >

  1. "contacto vacío" >

    "entrada de contacto" >

    "correo electrónico" identificación = "Email de contacto" nombre = "Email de contacto" requerido >

  2. "asunto-contacto" >

  3. "contacto-comentario" >

  4. "boton-contacto" >

    "entregar" nombre = "boton-contacto" valor = "Enviar" >

Fig.1 Código HTML del formulario de comentarios

Puede ver cómo se ve finalmente el formulario de comentarios que se muestra aquí en la siguiente captura de pantalla.

De este modo se crea la forma deseada. Y ahora puede pasar a las cuestiones del procesamiento y envío de datos en forma de mensaje de correo electrónico.

Instalación de la biblioteca PHPMailer

Como se señaló anteriormente, para enviar correo usaremos la biblioteca PHPMailer, que simplificará significativamente el envío de correo electrónico a través del protocolo SMTP con autorización en un servicio de correo de terceros.

Para instalarlo es necesario descargar los archivos necesarios. Esto se puede hacer desde el servicio web GitHub usando Composer (un administrador de dependencias de paquetes para PHP). O simplemente descargue los archivos necesarios de la forma habitual.

captura de pantalla 73

A continuación se muestra la página del servicio web GitHub, donde está marcado el enlace para la descarga regular de la biblioteca PHPMailer.

Además, la última versión 6.0.7, que se guardó al momento de escribir este artículo, se puede descargar desde los materiales adjuntos.

En cualquier caso, el archivo resultante debe descomprimirse, después de lo cual la carpeta PHPMailer-master extraída con todo su contenido debe colocarse en la raíz del sitio. Al mismo tiempo, para simplificar, puede cambiarle el nombre a PHPMailer. A continuación se muestra el contenido de la carpeta PHPMailer ubicada en el directorio raíz del sitio.

Así instalamos la biblioteca PHPMailer. Tras lo cual ya podremos empezar a crear un script con el que enviaremos mensajes de correo electrónico desde nuestra web.

Creamos un script para enviar correo vía SMTP

Para redactar el script, basta con utilizar las recomendaciones de uso de PHPMailer que figuran en la página de GitHub, que utilizamos anteriormente para descargar la biblioteca.

En particular, indican que al comienzo del script es necesario importar las clases PHPMailer al espacio de nombres global. Y se proporcionan líneas específicas del código correspondiente. También hay ejemplos del uso de las propiedades y métodos de PHPMailer, incluida la opción de enviar correo a través de SMTP.

Pero si esto no es suficiente, también puede utilizar la documentación, que contiene una descripción de todas las propiedades y métodos de esta biblioteca.

captura de pantalla 74

A continuación se muestra el código de secuencia de comandos para enviar correo desde el formulario de comentarios a través de SMTP con autorización. Donde todas las líneas relacionadas con PHPMailer se dan con explicación y resaltadas con un fondo claro.

El resto de la parte, incluidos los fragmentos relacionados con la recepción y procesamiento de datos del formulario, que antes teníamos que utilizar en otros procesadores, se indica con un fondo oscuro. Se discutieron con cierto detalle anteriormente en un artículo dedicado específicamente a las cuestiones de obtener y verificar datos de un formulario en PHP. Donde también hablamos de la función de usuario universal para validar y procesar datos de formularios. símbolo_check().

Colocaremos este script en el mismo archivo kontakty.php en el que creamos previamente el formulario de comentarios.

    //----Script para enviar correo vía SMTP usando PHPMailer----

    //Importa clases PHPMailer al espacio de nombres global. Deben estar en la parte superior del script, no dentro de la función.

    usar PHPMailer\PHPMailer\PHPMailer ;

    usar PHPMailer\PHPMailer\Exception ;

    si (!vacío($_POST["botón-contacto" ])) (

    $nombre = $_POST["nombre-contacto" ];

    $nombre = check_symbol ($nombre, "Nombre", "1", "/^+\z/iu");

    $correo electrónico = $_POST["contacto-correo electrónico" ];

    $correo electrónico = símbolo_de verificación ($correo electrónico, "Correo electrónico", "1", "/^+@(+\.)+(2,6)\z/i");

    $asunto = $_POST["contacto-asunto" ];

    $asunto = check_symbol ($asunto, "Asunto del mensaje", "1", "0");

    $comentario = $_POST["contacto-comentario" ];

    $comentario = check_symbol ($comentario, "Mensaje de texto", "1" , "0" );

    si (!vacío($GLOBALS["alerta" ])) (

    $alerta = "Los datos del formulario no fueron enviados. Se encontraron los siguientes errores:\n".$alerta;

    incluir"alerta.php" ;

    demás {

    //Conectando la biblioteca

    requerir"PHPMailer/src/PHPMailer.php";

    requerir"PHPMailer/src/Exception.php";

    requerir"PHPMailer/src/SMTP.php";

    $correo = nuevo PHPMailer(); //Inicialización de clase

    $de = " [correo electrónico protegido]" ; //Dirección de correo electrónico desde donde se envía la carta

    $a = " [correo electrónico protegido]" ; //Dirección del destinatario

    $correo -> esSMTP(); //Usar protocolo SMTP

    $correo -> Anfitrión = "smtp.yandex.ru" ; //Dirección del servidor de correo

    $correo -> SMTPAuth = verdadero ; //Habilitar modo de autorización

    $correo -> Nombre de usuario = " [correo electrónico protegido]" ; //Iniciar sesión desde un dominio de correo electrónico conectado a un servicio de correo electrónico de terceros (en este caso, Yandex.Mail)

    $correo -> Contraseña = "27MrDon89" ; //Contraseña para el correo del dominio

    $correo -> SMTPSecure = "ssl"; //Protocolo de cifrado

    $correo -> Puerto = "465" ; //puerto del servidor SMTP

    $correo -> CharSet = "UTF-8"; //Codificación

    $correo -> setFrom ($de, "Administrador" ); //Dirección y nombre del remitente

    $correo -> agregarDirección ($a, "Administrador"); //Dirección y nombre del destinatario

    $correo -> esHTML ( verdadero ); //Establecer formato de correo electrónico en HTML

    $correo -> Asunto = "Formulario de comentarios enviado"; //Asunto del correo electrónico (encabezado)

    $correo -> Cuerpo = "

    Nombre del remitente: $nombre

    Dirección del remitente: $correo electrónico

    Asunto del mensaje: $asunto

    Contenido del mensaje: $comentario



    " ; //Contenido del mensaje

    $correo -> AltCuerpo = "Texto de letra alternativo"; //Correo electrónico alternativo si el cliente de correo electrónico no soporta el formato HTML

    $correo -> SMTPDebug = 0 ; //Habilitar la depuración SMTP: 0 - desactivado (para uso normal), 1 = mensajes del cliente, 2 - mensajes del cliente y del servidor

    si($correo -> enviar()) (

    $alerta = "Mensaje enviado"; //Enviar un mensaje en el cuadro de diálogo del navegador sobre el envío exitoso de la carta

    demás {

    $alerta = "Error, no se puede enviar el correo electrónico: ".$correo -> Información de error; //Enviar un mensaje de error

    incluir"alerta.php" ;

Fig.5 Script para enviar correo electrónico vía SMTP con autorización

Como puede ver, todas las líneas directamente relacionadas con el envío de un mensaje de correo electrónico, en las que se especifican los métodos y propiedades necesarios, van acompañadas de comentarios. Por lo tanto, no tiene sentido repetirnos, sino que podemos detenernos sólo en algunos de ellos, que ciertamente requieren explicaciones adicionales, a saber:

1. Debido a que la carta se envía desde un servicio de correo de terceros, aquí se aplican la configuración correspondiente al servidor SMTP específico. En este caso, para el caso de uso del servidor Yandex.Mail, se aplican los siguientes valores de propiedad:

  • Propiedad Anfitrión(pos.28) - Dirección del servidor de correo con el valor smtp.yandex.ru;
  • Propiedad SMTPSeguro
  • Propiedad Puerto

Estos valores de propiedad se tomaron de la página Yandex.Help que se muestra en la siguiente captura de pantalla.

Pero esa información también se puede obtener de otros recursos. Para hacer esto, simplemente ingrese la consulta correspondiente en un motor de búsqueda, por ejemplo: "servidor smtp Yandex". ¿Dónde puede encontrar una gran cantidad de referencias sobre este tema?

De manera similar, los valores de configuración se pueden obtener de otros servidores SMTP. A continuación se muestra una captura de pantalla de la página de ayuda de Mail.ru, que muestra la configuración del servidor SMTP del servicio de correo Mail.ru.

Y así, en el caso de utilizar Mail.ru como servidor SMTP de terceros, se deben aplicar los siguientes valores de las propiedades de la clase PHPMailer:

  • Propiedad Anfitrión(pos.28) - Dirección del servidor de correo (smtp.mail.ru);
  • Propiedad SMTPSeguro(pos.32) - Protocolo de cifrado (ssl);
  • Propiedad Puerto(pos. 33) - Puerto del servidor SMTP (465).

Se debería aplicar un enfoque similar a otros servicios de correo electrónico.

2. En propiedad Nombre de usuario(pos. 30) es necesario indicar la dirección completa del buzón del dominio. En este caso, " [correo electrónico protegido]".

Sin embargo, si utiliza una cuenta que no sea una cuenta de correo de dominio para enviar cartas, sino una dirección relacionada directamente con el servicio de correo, por ejemplo " [correo electrónico protegido]", entonces el inicio de sesión debe ser sólo la parte de la dirección hasta el signo "@". En este caso, el inicio de sesión tendría el valor "comentarios".

3. PHPMailer proporciona una propiedad Depuración SMTP(pos. 50), que le permite mostrar diferentes niveles de errores en la pantalla del navegador. Esta característica simplifica enormemente la búsqueda de problemas al depurar un script.

Normalmente, en modo normal, con el valor establecido en 0, la salida de información de error detallada está deshabilitada. Pero si surgen problemas al enviar correo o durante la depuración, es posible utilizar otros valores para mostrar información más significativa sobre el error.

Para ver cómo se ve esto en la práctica, introduzcamos temporalmente algún error en la configuración. Por ejemplo, en la contraseña de correo del dominio (propiedad Contraseña, pos.31). Y también para mostrar información detallada sobre el error, configurado temporalmente en la propiedad Depuración SMTP(pos.50) valor 1. Luego, cuando todo esté depurado y verificado, desactivaremos el modo de depuración SMTP, reemplazando 1 por 0.

En la parte final del script, después de especificar todas las propiedades y métodos necesarios, se utiliza el método para enviar la carta. enviar()) (pos. 51). Y si se envía la carta, y el método. enviar() para objeto $correo devuelve verdadero, luego en el cuadro de diálogo del navegador a través de la variable $ alerta Se mostrará un mensaje sobre el envío exitoso del correo (pos. 52).

Si por alguna razón no se pudo enviar el correo y, en consecuencia, el método no pudo devolver verdadero, este estado irá acompañado del correspondiente mensaje de error (pos. 55).

Comprobando el envío de correo electrónico

Después de haber creado un script para enviar correo, naturalmente, debemos observar el resultado de nuestra "creatividad". ¿Hemos tenido todo en cuenta aquí y no hemos cometido ningún error?

Para hacer esto, intentemos, según lo previsto, enviar un mensaje del usuario al administrador del sitio desde el formulario de comentarios. A continuación se muestra una captura de pantalla del formulario de comentarios con los campos completados antes de enviarlo.

Y aquí está el resultado de enviar el formulario.

Donde del mensaje en el cuadro de diálogo del navegador se desprende que la carta no se puede enviar por un problema con la conexión SMTP.

Pero, desde ahora la propiedad Depuración SMTP(pos. 50) se le asigna el valor 1, luego podremos ver información detallada sobre el error ocurrido y averiguar el motivo de su aparición.

La siguiente captura de pantalla muestra que al intentar conectarse, se detectó un error de autenticación, es decir, el uso de un nombre de usuario o contraseña incorrectos.

Después de eliminar la discrepancia de contraseña (anteriormente se utilizó una contraseña incorrecta para poder verificar la salida de información adicional sobre el error), intentaremos enviar el correo nuevamente.

Esta vez todo pareció ir bien y recibimos un mensaje de que el correo se envió correctamente. Aparentemente, a excepción del error temporal ingresado deliberadamente en la contraseña de correo del dominio, no cometimos ningún otro error.

Pero para asegurarnos de que la carta fue realmente entregada al destinatario, ingresemos el correo con la dirección. [correo electrónico protegido] y mira el resultado.

Como puede ver, la carta de la dirección. [correo electrónico protegido], desde el cual enviamos un mensaje de correo electrónico con el nombre "Comentarios" llegó exitosamente al administrador del sitio. Al mismo tiempo, el cuerpo de la carta contiene todo el contenido que generamos en el script utilizando los datos recibidos del formulario de comentarios, a saber:

  • Nombre del remitente: Nikolay;
  • Dirección del remitente: [correo electrónico protegido];
  • Asunto del mensaje: Comprobando el envío de correo;
  • Contenido del mensaje: mensaje de prueba.

Ahora, después de comprobar con éxito el envío de correo, puede desactivar el modo de depuración SMTP asignando la propiedad Depuración SMTP(pos.50) valor 0.

Así, completamos la tarea de crear una herramienta para enviar correo vía SMTP con autorización utilizando un servidor de correo de terceros.

Por ejemplo, en el próximo artículo veremos cómo enviar correos electrónicos de confirmación para recuperar los datos de la cuenta de usuario registrado.

Archivos fuente del sitio

Los archivos fuente del sitio con las actualizaciones realizadas en este artículo se pueden descargar desde los materiales adicionales adjuntos:

  • archivos del directorio www
  • Tablas de bases de datos MySQL

En PHP es bastante popular utilizar scripts que automaticen el proceso de envío de cartas. En este artículo veremos un script simple que envía cartas a los destinatarios a través de SMTP ( Protocolo simple de transferencia de correo ). Sería demasiado fácil limitarnos sólo a esta funcionalidad; el script también admite archivos adjuntos, es decir, puedes adjuntar un archivo pdf, txt o doc en tu carta.

Configurar el script es bastante simple; todo lo que necesita es el nombre de usuario y la contraseña del remitente para el correo electrónico desde el cual se enviarán las cartas.

El script funciona con la clase km_smtp_class.php, lo bueno de la clase es que admite varios protocolos SSL y TLS que proporcionan una transferencia de datos segura.

Aquí está el guión en sí:

"smtp.mail.ru", "SMTP_port" => "25", "SMTP_email" => " [correo electrónico protegido]", "SMTP_pass" => "1111111", "SMTP_type" => "null"); // Correo electrónico del destinatario $Receiver = " [correo electrónico protegido]"; // Asunto del mensaje $Subject = "Enviando un correo electrónico desde PHP"; // Texto del mensaje (en HTML) $Text = "¡Hola!
Mensaje enviado desde el script Mowshon Sitio web: http://sitio"; // Adjunto en la carta - la dirección del archivo $Attachment = ""; /* $mail = new KM_Mailer(servidor, puerto, usuario, contraseña, tipo); */ /* El tipo puede ser: null, tls o ssl */ $mail = new KM_Mailer($SenderConfig["SMTP_server"], $SenderConfig["SMTP_port"], $SenderConfig["SMTP_email"], $SenderConfig["SMTP_pass"], $ SenderConfig[" SMTP_type"]); if($mail->isLogin) ( // Adjuntar un archivo if($Attachment) ($mail->addAttachment($Attachment);) // Agregar más destinatarios $mail->addRecipient( " [correo electrónico protegido]"); $correo->addRecipient(" [correo electrónico protegido]"); /* $correo->enviar(De, Para, Asunto, Texto, Asunto = opcional) */ $EnviarMail = $correo->enviar($SenderConfig["SMTP_email"], $Receptor, $Asunto, $Texto ); // Borrar la lista de destinatarios $mail->clearRecipients(); $mail->clearCC(); $mail->clearBCC(); $mail->clearAttachments(); ) else ( echo "Se produjo un error mientras conectándose al servidor SMTP"; )?>

La configuración del script se basa principalmente en la matriz $SenderConfig, aquí debemos especificar el SMTP:servidor, puerto, inicio de sesión y contraseña de correo electrónico. Describamos cada clave de matriz:

SMTP_server: dirección del servidor SMTP (dirección individual para diferentes correos electrónicos)

Correo mail.ru: Puerto smtp.mail.ru: 25, 587 y 465 (con cifrado SSL)

Correo Yandex: Puerto smtp.yandex.ru: 25, 587 465 (puerto SSL)

Correo excursionista: Puerto mail.rambler.ru: 25, 587 465 (puerto SSL)

Correo de yahoo: smtp.mail.yahoo.com Puerto SSL: 465

(Si necesitas la dirección de servidores smtp que no están en la lista, escribe en los comentarios)

SMTP_port: ya lo hemos descrito anteriormente para cada servidor SMTP.

SMTP_email: usuario sería más preciso, pero para mayor claridad escribí correo electrónico, indicamos la dirección de correo electrónico.

SMTP_pass: contraseña para el correo electrónico que se especificó como valor en la clave SMTP_email


Tipo_SMTP: NULL predeterminado. El protocolo mediante el cual se enviarán las cartas. Protocolos: SSL y TLS

Puede agregar archivos adjuntos a una carta simplemente especificando la dirección completa del archivo en la variable $Attachment (/var/patch/to/file/File.pdf)

Si tiene alguna pregunta, escríbala en los comentarios a continuación.

Correo PHP

Esta función se implementa por defecto como envío de correo electrónico. Esta funcionalidad no requiere un servidor de terceros para reenviar el correo electrónico. Para verificar la exactitud de esta función, simplemente cree un archivo test.php en la carpeta con el sitio y coloque el siguiente código allí:

donde en cambio "CORREO ELECTRÓNICORECIPIENTE" Ingrese el correo electrónico al que se debe enviar la carta.

Coloque este archivo en la raíz de su sitio.

Luego, ingrese www.SuDominio/test.php en la barra de direcciones. Si se recibe una carta en el correo electrónico especificado, entonces su hosting funciona correctamente con la función de enviar cartas " Correo PHP". Es posible que la carta haya terminado en spam, por lo que también es necesario comprobarla.

Si la carta llegó con una codificación incomprensible, cambie la línea: "Comprobando el envío de correo" en "Comprobando el envío de correo", "Tipo de contenido:text/html;charset=utf-8".

Y repite enviando la carta a través de la barra de direcciones de tu navegador.

Si tras las manipulaciones anteriores la carta de prueba no llega al destinatario final, deberás contactar con el soporte técnico de tu hosting.

Entre las desventajas de este método, cabe señalar que este método no funciona de forma consistente. Puede haber interrupciones en el envío de correos electrónicos por parte del hosting.

La principal desventaja de este método es que todas las cartas enviadas a los correos electrónicos de los clientes no serán reconocidas por los servicios de correo (gmail, mail.ru, yandex.ru), ya que fueron enviadas directamente desde su sitio web.

El servicio de correo Gmail muestra estas cartas con un signo de interrogación y la firma: "El sistema Gmail no pudo confirmar que esta carta fue enviada desde el dominio TuDominio. Esto puede ser spam".

Para evitar esta situación .

SMTP (Protocolo simple de transferencia de correo)

SMTP: protocolo de transferencia de correo. En total, para configurar la transmisión de correo utilizando este protocolo, necesita el propio servidor SMTP. La opción más común para utilizar el correo corporativo (dominio) yandex.ru como servidor SMTP es https://pdd.yandex.ru/.

Primero que nada es necesario cuenta (correo) yandex, en base a qué correos electrónicos se crearán para su dominio: “pedido@SuDominio” “info@SuDominio”... La cuenta principal no será visible en ninguna parte y se usará solo para crear correos electrónicos de dominio basados ​​en ella en el futuro.

Después de la autorización en su cuenta personal de Yandex, se crea un correo de dominio en el enlace https://pdd.yandex.ru/. Este es el correo electrónico del dominio que los usuarios verán en el campo "Remitente".

El campo "Remitente" es obligatorio al enviar correos electrónicos a través de SMTP. Usando SMTP para enviar cartas, una combinación de " Dominio" - "Correo electrónico", por lo que las cartas son reconocidas por los servicios de correo.


Entre las desventajas de este método, cabe destacar la imposibilidad de "cargar" un retrato de correo de dominio, ya que los propios servicios de correo aún no proporcionan esta funcionalidad.




Arriba