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 remitenteCon 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¿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 pruebaAlgunos 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é
- Funciona con Yandex, Rambler, Mail (gmail no pudo ganar)
- Borrar código. Para configurarlo basta con cambiar unas líneas
- 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).