¿Cómo puedo probar un servidor SMTP?

¿Cómo puedo probar un servidor SMTP?

Recibí información y credenciales del servidor SMTP y quiero probar si funcionan.

¿Cómo puedo probar fácilmente una conexión SMTP en Linux usando la línea de comando?

Sé que puedo hacer esto a través de telnet/openssl pero parece muy complicado.

Entonces, ¿cómo comprobar un servidor SMTP?

Respuesta1

La herramienta swakses útil aquí.

En Ubuntu es

apt install swaks

Luego puede ejecutar el comando y verá el cuadro de diálogo SMTP.

$ swaks --to [email protected] --server smtp.ionos.de:587
=== Trying smtp.ionos.de:587...
=== Connected to smtp.ionos.de.
<-  220 kundenserver.de (mreue106) Nemesis ESMTP Service ready
 -> EHLO lafto
<-  250-kundenserver.de Hello example [<IP redacted>]
<-  250-8BITMIME
<-  250-AUTH LOGIN PLAIN
<-  250-SIZE 140000000
<-  250 STARTTLS
 -> MAIL FROM:<[email protected]>
<** 530 Authentication required
 -> QUIT
<-  221 kundenserver.de Service closing transmission channel
=== Connection closed with remote host.

Como puede ver aquí, necesita autenticación, es por eso que volvemos a ejecutar con

$ swaks --to [email protected] --server smtp.ionos.de:587 --auth LOGIN
Username: foo
Password: bar

Consulte la página de manual para obtener más información.

Respuesta2

Sé que puedo hacer esto a través de telnet/openssl pero parece muy complicado

Es bastante fácil, solo puedes buscar en Google.Comandos SMTP, y podrías usarlos sin problemas. Como ha respondido su propia pregunta, puede utilizar SWAKS. Aquí hay algunas opciones alternativas.


Estos son algunos comandos SMTP:

Cada comando se utiliza en una secuencia de comunicación normal entre dos servidores a través del protocolo SMTP, para poder entregar correos electrónicos.

HOLA
Es el primer comando SMTP: inicia la conversación identificando el servidor remitente y generalmente va seguido de su nombre de dominio.

EHLO
Un comando alternativo para iniciar la conversación, subyacente a que el servidor está utilizando el protocolo SMTP extendido.

CORREO DE
Con este comando SMTP comienzan las operaciones: el remitente indica la dirección de correo electrónico de origen en el campo "De" y realmente inicia la transferencia de correo electrónico.

RCPT A
Identifica al destinatario del correo electrónico; si hay más de uno, el comando simplemente se repite dirección por dirección.

TAMAÑO
Este comando SMTP informa al servidor remoto sobre el tamaño estimado (en términos de bytes) del correo electrónico adjunto. También se puede utilizar para informar el tamaño máximo de un mensaje que puede aceptar el servidor.

DATOS
Con el comando DATOS se comienza a transferir el contenido del correo electrónico; Generalmente va seguido de un código de respuesta 354 proporcionado por el servidor, que da permiso para iniciar la transmisión real.

VRFY
Se solicita al servidor que verifique si una dirección de correo electrónico o un nombre de usuario en particular realmente existe.

DOBLAR
Este comando se utiliza para invertir roles entre el cliente y el servidor, sin necesidad de ejecutar una nueva conexión.

AUTORIZACIÓN
Con el comando AUTH, el cliente se autentica en el servidor, proporcionando su nombre de usuario y contraseña. Es una capa más de seguridad para garantizar una correcta transmisión.

RSET
Comunica al servidor que la transmisión de correo electrónico en curso finalizará, aunque la conversación SMTP no se cerrará (como en el caso de SALIR).

EXPN
Este comando SMTP solicita confirmación sobre la identificación de una lista de correo.

AYUDA
Es la solicitud de un cliente de cierta información que puede ser útil para una transferencia exitosa del correo electrónico.

ABANDONAR
Termina la conversación SMTP.


OpenSSL, testssl.sh y GnuTLS

Puedes usaropenssl s_client, ejecutando un comando como:

openssl s_client -starttls smtp -connect mail.example.com:587

También puedes utilizar una herramienta llamadapruebassl.shpara probar SSL/TLS en su servidor SMTP, obviamente incluso si está alojado localmente. Una vez que lo hayas descargado, extráelo, ingresa a la carpeta testssl.sh y ejecuta:

./testssl.sh -t smtp mail.example.com:25

También puedes usar GnuTLSsi lo tienes instalado:

gnutls-cli mail.example.com -p 25

Telnet

Si su servidor SMTP no tiene SSL/TLS, puede utilizartelnet. Telnet es la herramienta más básica para esto, pero no es compatible con SSL/TLS.

telnet mail.example.com 25

PHPMailer

Si usas PHP, puedes usarPHPMailer:

<?php
// Import PHPMailer classes into the global namespace
// These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

// Load Composer's autoloader
require 'vendor/autoload.php';

// Instantiation and passing `true` enables exceptions
$mail = new PHPMailer(true);

try {
    //Server settings
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;                      // Enable verbose debug output
    $mail->isSMTP();                                            // Send using SMTP
    $mail->Host       = 'smtp.example.com';                    // Set the SMTP server to send through
    $mail->SMTPAuth   = true;                                   // Enable SMTP authentication
    $mail->Username   = '[email protected]';                     // SMTP username
    $mail->Password   = 'secret';                               // SMTP password
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;         // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged
    $mail->Port       = 587;                                    // TCP port to connect to, use 465 for `PHPMailer::ENCRYPTION_SMTPS` above

    //Recipients
    $mail->setFrom('[email protected]', 'Mailer');
    $mail->addAddress('[email protected]', 'Joe User');     // Add a recipient
    $mail->addAddress('[email protected]');               // Name is optional
    $mail->addReplyTo('[email protected]', 'Information');
    $mail->addCC('[email protected]');
    $mail->addBCC('[email protected]');

    // Attachments
    $mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
    $mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name

    // 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();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}

Aunque esta no es una respuesta a tu pregunta. Incluso puedes configurar DKIM con facilidad en PHPMailer:

<?php

/**
 * This example shows sending a DKIM-signed message with PHPMailer.
 * More info about DKIM can be found here: http://www.dkim.org/info/dkim-faq.html
 * There's more to using DKIM than just this code - check out this article:
 * @see https://yomotherboard.com/how-to-setup-email-server-dkim-keys/
 * See also the DKIM_gen_keys example code in the examples folder,
 * which shows how to make a key pair from PHP.
 */

//Import the PHPMailer class into the global namespace
use PHPMailer\PHPMailer\PHPMailer;

require '../vendor/autoload.php';

//Usual setup
$mail = new PHPMailer();
$mail->setFrom('[email protected]', 'First Last');
$mail->addAddress('[email protected]', 'John Doe');
$mail->Subject = 'PHPMailer mail() test';
$mail->msgHTML(file_get_contents('contents.html'), __DIR__);

//This should be the same as the domain of your From address
$mail->DKIM_domain = 'example.com';
//See the DKIM_gen_keys.phps script for making a key pair -
//here we assume you've already done that.
//Path to your private key:
$mail->DKIM_private = 'dkim_private.pem';
//Set this to your own selector
$mail->DKIM_selector = 'phpmailer';
//Put your private key's passphrase in here if it has one
$mail->DKIM_passphrase = '';
//The identity you're signing as - usually your From address
$mail->DKIM_identity = $mail->From;
//Suppress listing signed header fields in signature, defaults to true for debugging purpose
$mail->DKIM_copyHeaderFields = false;
//Optionally you can add extra headers for signing to meet special requirements
$mail->DKIM_extraHeaders = ['List-Unsubscribe', 'List-Help'];

//When you send, the DKIM settings will be used to sign the message
if (!$mail->send()) {
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message sent!';
}

Pitón

(Tomado dehttps://www.tutorialspoint.com/python3/python_sending_email.htm, porque no quiero proporcionar enlaces, sino que publiqué todo aquí porque esa página podría recibir un error 404 en cualquier momento).

Python proporciona smtplibun módulo que define un objeto de sesión de cliente SMTP que se puede utilizar para enviar correos electrónicos a cualquier máquina de Internet con un demonio de escucha SMTP o ESMTP.

Aquí hay una sintaxis simple para crear un objeto SMTP, que luego se puede usar para enviar un correo electrónico:

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
Here is the detail of the parameters −
  • anfitrión− Este es el host que ejecuta su servidor SMTP. Puede especificar la dirección IP del host o un nombre de dominio como ejemplo.com. Este es un argumento opcional.

  • puerto− Si proporciona el argumento de host, debe especificar un puerto donde escucha el servidor SMTP. Normalmente este puerto sería el 25.

  • nombre_host_local− Si su servidor SMTP se está ejecutando en su máquina local, puede especificar solo la opción localhost.

Un objeto SMTP tiene un método de instancia llamado sendmail, que normalmente se utiliza para realizar el trabajo de enviar un mensaje por correo. Se necesitan tres parámetros:

  • El remitente : una cadena con la dirección del remitente.

  • Los receptores: una lista de cadenas, una para cada destinatario.

  • El mensaje: un mensaje como una cadena con el formato especificado en los distintos RFC.

Ejemplo

A continuación se muestra una forma sencilla de enviar un correo electrónico utilizando el script Python. Pruébalo una vez.

#!/usr/bin/python3

import smtplib

sender = '[email protected]'
receivers = ['[email protected]']

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: SMTP e-mail test

This is a test e-mail message.
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

Aquí, ha colocado un mensaje de correo electrónico básico, utilizando comillas triples, teniendo cuidado de formatear los encabezados correctamente. Un correo electrónico requiere un encabezado De, Para y Asunto, separados del cuerpo del correo electrónico con una línea en blanco.

Para enviar el correo, utilice smtpObj para conectarse al servidor SMTP en la máquina local. Luego use el método sendmail junto con el mensaje, la dirección de origen y la dirección de destino como parámetros (aunque las direcciones de origen y destino están dentro del propio correo electrónico, no siempre se utilizan para enrutar el correo).

Si no está ejecutando un servidor SMTP en su máquina local, puede usar el cliente smtplib para comunicarse con un servidor SMTP remoto. A menos que esté utilizando un servicio de correo web (como Gmail o Yahoo! Mail), su proveedor de correo electrónico debe haberle proporcionado los detalles del servidor de correo saliente que puede proporcionarles, de la siguiente manera:

mail = smtplib.SMTP('smtp.gmail.com', 587)

Envío de un correo electrónico HTML usando Python Cuando envía un mensaje de texto usando Python, todo el contenido se trata como texto simple. Incluso si incluye etiquetas HTML en un mensaje de texto, se mostrará como texto simple y las etiquetas HTML no tendrán formato según la sintaxis HTML. Sin embargo, Python ofrece una opción para enviar un mensaje HTML como mensaje HTML real.

Al enviar un mensaje de correo electrónico, puede especificar una versión Mime, el tipo de contenido y el juego de caracteres para enviar un correo electrónico HTML.

Ejemplo

A continuación se muestra un ejemplo para enviar el contenido HTML como correo electrónico. Pruébalo una vez.

#!/usr/bin/python3

import smtplib

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test

This is an e-mail message to be sent in HTML format

<b>This is HTML message.</b>
<h1>This is headline.</h1>
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

Envío de archivos adjuntos como correo electrónico Para enviar un correo electrónico con contenido mixto es necesario configurar el encabezado Tipo de contenido en multiparte/mixto. Luego, el texto y las secciones adjuntas se pueden especificar dentro de los límites.

Un límite comienza con dos guiones seguidos de un número único, que no puede aparecer en la parte del mensaje del correo electrónico. Un límite final que denota la sección final del correo electrónico también debe terminar con dos guiones.

Los archivos adjuntos deben codificarse con la pack("m")función para tener codificación base 64 antes de la transmisión.

Ejemplo A continuación se muestra un ejemplo que envía un archivo /tmp/test.txtcomo archivo adjunto. Pruébalo una vez.

#!/usr/bin/python3

import smtplib
import base64

filename = "/tmp/test.txt"

# Read a file and encode it into base64 format
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent)  # base64

sender = '[email protected]'
reciever = '[email protected]'

marker = "AUNIQUEMARKER"

body ="""
This is a test email to send an attachement.
"""
# Define the main headers.
part1 = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)

# Define the message action
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit

%s
--%s
""" % (body,marker)

# Define the attachment section
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s

%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, reciever, message)
   print "Successfully sent email"
except Exception:
   print ("Error: unable to send email")

SWAK:

Para instalarlo:

  • Ubuntu:sudo apt install swaks
  • CentOS: Primero: sudo yum install epel-releasey sudo yum install swaksosudo dnf install swaks
  • Arco Linux:sudo pacman -S swaks

Luego puede ejecutar el comando y verá el cuadro de diálogo SMTP:

$ swaks --to [email protected] --server smtp.example.com:587
=== Trying smtp.example.com:587...
=== Connected to smtp.example.com.
<-  220 example.com (something) Foo ESMTP Service ready
 -> EHLO somenamehere
<-  250-example.com Hello example [<IP redacted>]
<-  250-8BITMIME
<-  250-AUTH LOGIN PLAIN
<-  250-SIZE 140000000
<-  250 STARTTLS
 -> MAIL FROM:<[email protected]>
<** 530 Authentication required
 -> QUIT
<-  221 example.com Service closing transmission channel
=== Connection closed with remote host.

Como puede ver aquí, necesita autenticación, es por eso que volvemos a ejecutar con

$ swaks --to [email protected] --server mail.example.com:587 --auth LOGIN
Username: yourusername
Password: yourpassword

También puede utilizar AUTH PLAIN mediante --auth PLAIN, según el método que admita el servidor. Consulte la página de manual para obtener más información utilizando man swaks.

MXToolBox

Puedes usar MXToolBoxPrueba del servidor de correo electrónicopara algunas pruebas que pueden ser útiles a veces, pero no puedes especificar qué quieres hacer con ellas. Entonces, es mejor que uses lo anterior.

O simplemente use el mailcomando...

Respuesta3

Se puede probar de varias formas:

  1. Usando la biblioteca Python como ya se mencionó.
  2. Utilice también el cliente sendmail para probar el servidor smpt.
  3. También puede configurar postfix y dovcot para realizar operaciones de correo.

información relacionada