Как протестировать SMTP-сервер?

Как протестировать SMTP-сервер?

Я получил информацию и учетные данные SMTP-сервера и хочу проверить, работают ли они.

Как можно легко проверить SMTP-соединение в Linux с помощью командной строки?

Я знаю, что это можно сделать через telnet/openssl, но это кажется очень сложным.

Так как же проверить SMTP-сервер?

решение1

Инструмент swaksздесь пригодится

В Ubuntu это

apt install swaks

Затем вы можете запустить команду и увидеть диалоговое окно 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.

Как вы видите, здесь требуется аутентификация, поэтому мы повторяем запуск с

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

Для получения дополнительной информации посетите страницу руководства.

решение2

Я знаю, что это можно сделать через telnet / openssl, но это кажется очень сложным.

Это довольно просто, вы можете просто загуглитьSMTP-команды, и вы могли бы использовать их без проблем. Поскольку вы ответили на свой вопрос, вы можете использовать SWAKS. Вот несколько альтернативных вариантов.


Вот некоторые команды SMTP:

Каждая команда используется в обычной последовательности связи между двумя серверами по протоколу SMTP для доставки электронных писем.

ХЕЛО
Это первая команда SMTP: она начинает диалог, идентифицируя сервер-отправитель, и обычно сопровождается его доменным именем.

ЭХЛО
Альтернативная команда для начала диалога, указывающая на то, что сервер использует расширенный протокол SMTP.

ПОЧТА ОТ
С помощью этой SMTP-команды начинаются операции: отправитель указывает исходный адрес электронной почты в поле «От» и фактически начинает передачу электронной почты.

RCPT ДО
Он идентифицирует получателя электронного письма; если их несколько, команда просто повторяется адрес за адресом.

РАЗМЕР
Эта команда SMTP информирует удаленный сервер о предполагаемом размере (в байтах) прикрепленного письма. Ее также можно использовать для сообщения максимального размера сообщения, которое может быть принято сервером.

ДАННЫЕ
С помощью команды DATA начинается передача содержимого электронного письма; за ней обычно следует ответный код 354, предоставляемый сервером, который дает разрешение на начало фактической передачи.

ВРФИ
Серверу предлагается проверить, существует ли на самом деле определенный адрес электронной почты или имя пользователя.

ПОВЕРНУТЬ
Эта команда используется для инвертирования ролей между клиентом и сервером без необходимости запуска нового соединения.

АУТЕНТ
С помощью команды AUTH клиент аутентифицирует себя на сервере, предоставляя свое имя пользователя и пароль. Это еще один уровень безопасности, гарантирующий правильную передачу.

РСЕТ
Он сообщает серверу, что текущая передача электронной почты будет прекращена, хотя SMTP-диалог не будет закрыт (как в случае QUIT).

ЭКСПН
Эта SMTP-команда запрашивает подтверждение идентификации списка рассылки.

ПОМОЩЬ
Это запрос клиента на предоставление некоторой информации, которая может быть полезна для успешной передачи электронной почты.

ПОКИДАТЬ
Это завершает SMTP-диалог.


OpenSSL, testssl.sh и GnuTLS

Вы можете использоватьopenssl s_client, выполнив команду типа:

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

Вы также можете использовать инструмент под названиемтестыsl.shдля тестирования SSL/TLS на вашем SMTP-сервере, очевидно, даже если он размещен локально. После загрузки извлеките его, перейдите в папку testssl.sh и запустите:

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

Вы также можете использовать, GnuTLSесли он у вас установлен:

gnutls-cli mail.example.com -p 25

Телнет

Если ваш SMTP-сервер не имеет SSL/TLS, вы можете использоватьtelnet. Telnet — самый простой инструмент для этого, но он не поддерживает SSL/TLS.

telnet mail.example.com 25

PHPMailer

Если вы используете PHP, вы можете использоватьPHPMailer:

<?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}";
}

Хотя это и не ответ на ваш вопрос. Вы даже можете легко настроить DKIM в 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!';
}

Питон

(Взято изhttps://www.tutorialspoint.com/python3/python_sending_email.htm(Так как я не хочу давать ссылки, вместо этого я просто разместил все здесь, поскольку на этой странице в любой момент может возникнуть ошибка 404.)

Python предоставляет smtplibмодуль, который определяет объект сеанса клиента SMTP, который можно использовать для отправки писем на любую интернет-машину с демоном прослушивателя SMTP или ESMTP.

Вот простой синтаксис для создания одного объекта SMTP, который впоследствии можно использовать для отправки электронной почты:

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
Here is the detail of the parameters −
  • хозяин− Это хост, на котором запущен ваш SMTP-сервер. Вы можете указать IP-адрес хоста или доменное имя, например example.com. Это необязательный аргумент.

  • порт− Если вы предоставляете аргумент хоста, то вам нужно указать порт, на котором SMTP-сервер слушает. Обычно этот порт будет 25.

  • local_hostname− Если ваш SMTP-сервер работает на локальном компьютере, то вы можете указать только параметр localhost.

Объект SMTP имеет метод экземпляра, называемый sendmail, который обычно используется для выполнения работы по отправке сообщения. Он принимает три параметра −

  • Отправитель — строка с адресом отправителя.

  • Получатели — список строк, по одной для каждого получателя.

  • Сообщение — сообщение в виде строки, отформатированной так, как указано в различных RFC.

Пример

Вот простой способ отправить одно электронное письмо с помощью скрипта Python. Попробуйте один раз −

#!/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"

Здесь вы поместили базовое электронное письмо в сообщение, используя тройные кавычки, заботясь о правильном форматировании заголовков. Электронное письмо требует заголовков From, To и Subject, отделенных от тела электронного письма пустой строкой.

Для отправки почты вы используете smtpObj для подключения к SMTP-серверу на локальной машине. Затем используйте метод sendmail вместе с сообщением, адресом отправителя и адресом получателя в качестве параметров (хотя адреса отправителя и получателя находятся в самом письме, они не всегда используются для маршрутизации почты).

Если вы не используете SMTP-сервер на локальной машине, вы можете использовать smtplib-клиент для связи с удаленным SMTP-сервером. Если вы не используете службу веб-почты (например, gmail или Yahoo! Mail), ваш поставщик электронной почты должен был предоставить вам данные исходящего почтового сервера, которые вы можете предоставить им, как указано ниже −

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

Отправка HTML-письма с помощью Python Когда вы отправляете текстовое сообщение с помощью Python, все содержимое обрабатывается как простой текст. Даже если вы включите HTML-теги в текстовое сообщение, оно будет отображаться как простой текст, а HTML-теги не будут отформатированы в соответствии с синтаксисом HTML. Однако Python предоставляет возможность отправлять HTML-сообщение как фактическое HTML-сообщение.

При отправке сообщения электронной почты вы можете указать версию MIME, тип содержимого и набор символов для отправки HTML-письма.

Пример

Ниже приведен пример отправки HTML-контента по электронной почте. Попробуйте один раз −

#!/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"

Отправка вложений в виде электронного письма Для отправки электронного письма со смешанным содержимым необходимо установить заголовок Content-type на multipart/mixed. Затем текст и разделы вложений можно указать в границах.

Граница начинается с двух дефисов, за которыми следует уникальный номер, который не может появляться в части сообщения электронной почты. Конечная граница, обозначающая конечный раздел электронной почты, также должна заканчиваться двумя дефисами.

Прикрепленные файлы pack("m")перед передачей должны быть закодированы с помощью функции кодирования base 64.

Пример Ниже приведен пример, который отправляет файл /tmp/test.txtкак вложение. Попробуйте один раз −

#!/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")

СВАКС:

Чтобы установить его:

  • Убунту:sudo apt install swaks
  • CentOS: Первый: sudo yum install epel-release, и sudo yum install swaksилиsudo dnf install swaks
  • Арч Линукс:sudo pacman -S swaks

Затем вы можете выполнить команду и увидеть диалоговое окно 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.

Как вы видите, здесь требуется аутентификация, поэтому мы повторяем запуск с

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

Вы также можете использовать AUTH PLAIN с помощью --auth PLAIN, в зависимости от метода, поддерживаемого сервером. Проверьте страницу man для получения дополнительной информации с помощью man swaks.

MXToolBox

Вы можете использовать MXToolBoxТест почтового серверадля некоторого тестирования, которое иногда может быть полезным, но вы не можете указать, что вы хотите с ним сделать. Так что вам лучше использовать вышеперечисленное.

Или просто используйте mailкоманду...

решение3

Его можно проверить несколькими способами:

  1. Используем библиотеку Python, как уже упоминалось.
  2. Используйте также клиент sendmail для тестирования сервера smpt.
  3. Также вы можете настроить postfix и dovcot для выполнения почтовых операций.

Связанный контент