Como posso testar um servidor SMTP?

Como posso testar um servidor SMTP?

Recebi informações e credenciais do servidor SMTP e quero testar se funcionam.

Como posso testar facilmente uma conexão SMTP no Linux usando a linha de comando?

Eu sei que posso fazer isso via telnet/openssl mas isso parece muito complicado.

Então, como verificar um servidor SMTP?

Responder1

A ferramenta swaksé útil aqui

No Ubuntu é

apt install swaks

Então você pode executar o comando e verá a caixa 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 você pode ver aqui, ele precisa de autenticação, é por isso que executamos novamente com

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

Verifique a página de manual para obter mais informações

Responder2

Eu sei que posso fazer isso via telnet/openssl mas isso parece muito complicado

É muito fácil, basta pesquisar no GoogleComandos SMTP, e você pode usá-los sem problemas. Como você respondeu à sua própria pergunta, você pode usar o SWAKS. Aqui estão algumas opções alternativas.


Estes são alguns comandos SMTP:

Cada comando é utilizado em uma sequência normal de comunicação entre dois servidores através do protocolo SMTP, para entrega de emails.

OLÁ
É o primeiro comando SMTP: inicia a conversa identificando o servidor remetente e geralmente é seguido pelo seu nome de domínio.

EHLO
Um comando alternativo para iniciar a conversa, subjacente ao fato de o servidor estar utilizando o protocolo SMTP estendido.

MAIL DE
Com este comando SMTP as operações começam: o remetente indica o endereço de e-mail de origem no campo “De” e realmente inicia a transferência do e-mail.

RCPT PARA
Identifica o destinatário do email; se houver mais de um, o comando é simplesmente repetido endereço por endereço.

TAMANHO
Este comando SMTP informa ao servidor remoto sobre o tamanho estimado (em termos de bytes) do email anexado. Também pode ser usado para informar o tamanho máximo de uma mensagem a ser aceita pelo servidor.

DADOS
Com o comando DATA o conteúdo do email começa a ser transferido; geralmente é seguido por um código de resposta 354 fornecido pelo servidor, dando permissão para iniciar a transmissão real.

VRFY
O servidor é solicitado a verificar se um determinado endereço de e-mail ou nome de usuário realmente existe.

VEZ
Este comando é utilizado para inverter funções entre o cliente e o servidor, sem a necessidade de executar uma nova conexão.

AUTORIDADE
Com o comando AUTH, o cliente se autentica no servidor, informando seu nome de usuário e senha. É mais uma camada de segurança para garantir uma transmissão adequada.

RESET
Comunica ao servidor que a transmissão de e-mail em andamento será encerrada, embora a conversa SMTP não seja encerrada (como no caso de QUIT).

EXPN
Este comando SMTP pede a confirmação da identificação de uma lista de discussão.

AJUDA
É uma solicitação do cliente de algumas informações que podem ser úteis para o sucesso da transferência do email.

DESISTIR
Isso encerra a conversa SMTP.


OpenSSL, testessl.sh e GnuTLS

Você pode usaropenssl s_client, executando um comando como:

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

Você também pode usar uma ferramenta chamadatestessl.shpara testar SSL/TLS em seu servidor SMTP, obviamente, mesmo que esteja hospedado localmente. Depois de baixá-lo, extraia-o e entre na pasta testessl.sh e execute:

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

Você também pode usar GnuTLSse tiver instalado:

gnutls-cli mail.example.com -p 25

Telnet

Se o seu servidor SMTP não tiver SSL/TLS, você pode usartelnet. Telnet é a ferramenta mais básica para isso, mas não oferece suporte a SSL/TLS.

telnet mail.example.com 25

PHPMailer

Se você usa PHP, você pode 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}";
}

Mesmo que isso não seja uma resposta à sua pergunta. Você pode até configurar o DKIM facilmente no 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ão

(Tirado dehttps://www.tutorialspoint.com/python3/python_sending_email.htm, porque não quero fornecer links, apenas postei tudo aqui porque essa página pode receber um erro 404 a qualquer momento.)

Python fornece smtplibmódulo, que define um objeto de sessão de cliente SMTP que pode ser usado para enviar e-mails para qualquer máquina da Internet com um daemon de ouvinte SMTP ou ESMTP.

Aqui está uma sintaxe simples para criar um objeto SMTP, que pode ser usado posteriormente para enviar um e-mail -

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
Here is the detail of the parameters −
  • hospedar− Este é o host que executa seu servidor SMTP. Você pode especificar o endereço IP do host ou um nome de domínio como exemplo.com. Este é um argumento opcional.

  • porta− Se você estiver fornecendo um argumento de host, será necessário especificar uma porta onde o servidor SMTP está escutando. Normalmente esta porta seria 25.

  • nome_host_local− Se o seu servidor SMTP estiver em execução na sua máquina local, você poderá especificar apenas a opção localhost.

Um objeto SMTP possui um método de instância chamado sendmail, que normalmente é usado para realizar o trabalho de envio de uma mensagem. São necessários três parâmetros -

  • The sender - Uma string com o endereço do remetente.

  • The receivers - Uma lista de strings, uma para cada destinatário.

  • The message - Uma mensagem como uma string formatada conforme especificado nos vários RFCs.

Exemplo

Aqui está uma maneira simples de enviar um e-mail usando script Python. Experimente uma 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"

Aqui você colocou um e-mail básico na mensagem, usando aspas triplas, tomando cuidado para formatar os cabeçalhos corretamente. Um e-mail requer um cabeçalho De, Para e Assunto, separados do corpo do e-mail por uma linha em branco.

Para enviar o e-mail você usa smtpObj para se conectar ao servidor SMTP na máquina local. Em seguida, use o método sendmail junto com a mensagem, o endereço de e o endereço de destino como parâmetros (mesmo que os endereços de e para estejam dentro do próprio e-mail, eles nem sempre são usados ​​para rotear o e-mail).

Se você não estiver executando um servidor SMTP em sua máquina local, poderá usar o cliente smtplib para se comunicar com um servidor SMTP remoto. A menos que você esteja usando um serviço de webmail (como Gmail ou Yahoo! Mail), seu provedor de e-mail deve ter fornecido os detalhes do servidor de e-mail de saída que você pode fornecer, como segue -

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

Enviando um e-mail HTML usando Python Quando você envia uma mensagem de texto usando Python, todo o conteúdo é tratado como texto simples. Mesmo se você incluir tags HTML em uma mensagem de texto, ela será exibida como texto simples e as tags HTML não serão formatadas de acordo com a sintaxe HTML. No entanto, Python oferece uma opção para enviar uma mensagem HTML como uma mensagem HTML real.

Ao enviar uma mensagem de e-mail, você pode especificar a versão Mime, o tipo de conteúdo e o conjunto de caracteres para enviar um e-mail em HTML.

Exemplo

A seguir está um exemplo para enviar o conteúdo HTML por e-mail. Experimente uma 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"

Enviando anexos como e-mail Para enviar um e-mail com conteúdo misto, é necessário definir o cabeçalho Content-type como multipart/mixed. Em seguida, o texto e as seções de anexo podem ser especificados dentro dos limites.

Um limite é iniciado com dois hífens seguidos por um número exclusivo, que não pode aparecer na parte da mensagem do e-mail. Um limite final indicando a seção final do e-mail também deve terminar com dois hífens.

Os arquivos anexados devem ser codificados com a pack("m")função de codificação base 64 antes da transmissão.

Exemplo A seguir está um exemplo que envia um arquivo /tmp/test.txtcomo anexo. Experimente uma 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")

SWAKS:

Para instalá-lo:

  • Ubuntu:sudo apt install swaks
  • CentOS: Primeiro: sudo yum install epel-releasee sudo yum install swaksousudo dnf install swaks
  • Arco Linux:sudo pacman -S swaks

Então você pode executar o comando e verá a caixa 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 você pode ver aqui, ele precisa de autenticação, é por isso que executamos novamente com

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

Você também pode usar AUTH PLAIN usando --auth PLAIN, dependendo do método suportado pelo servidor. Verifique a página de manual para obter mais informações usando man swaks.

MXToolBox

Você pode usar o MXToolBoxTeste de servidor de e-mailpara alguns testes que podem ser úteis às vezes, mas você não pode especificar o que deseja fazer com eles. Então, é melhor usar o material acima.

Ou, basta usar o mailcomando ...

Responder3

Pode ser testado de várias maneiras:

  1. Usando a biblioteca python como já mencionado.
  2. Use o cliente sendmail para testar o servidor smpt também.
  3. Além disso, você pode configurar o postfix e o dovcot para realizar operações de correio.

informação relacionada