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

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

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

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

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

-1
задан 9 January 2021 в 17:04
3 ответа

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

На Ubuntu это

apt install swaks

Затем вы можете выполнить команду и увидите SMTP диалог

$ swaks --to foo@example.com --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:<foo@example.com>
<** 530 Authentication required
 -> QUIT
<-  221 kundenserver.de Service closing transmission channel
=== Connection closed with remote host.

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

$ swaks --to foo@example.com --server smtp.ionos.de:587 --auth LOGIN
Username: foo
Password: bar

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

4
ответ дан 24 April 2021 в 02:59

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

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

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

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


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

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

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

EHLO
Альтернативная команда для начала разговора, подразумевающая, что сервер использует протокол Extended SMTP.

MAIL FROM
С помощью этой SMTP-команды начинаются операции: отправитель указывает адрес электронной почты источника в поле "From" и фактически начинает передачу электронной почты.

RCPT TO
Здесь указывается получатель письма; если их несколько, команда просто повторяется адрес за адресом.

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

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

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

TURN
Эта команда используется для переключения ролей между клиентом и сервером без необходимости запуска нового соединения.

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

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

EXPN
Эта команда SMTP запрашивает подтверждение об идентификации списка рассылки.

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

QUIT
Это завершает SMTP разговор.


OpenSSL, testssl.sh и GnuTLS

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

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

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

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

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

gnutls-cli mail.example.com -p 25

Telnet

Если ваш 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   = 'user@example.com';                     // 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('from@example.com', 'Mailer');
    $mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
    $mail->addAddress('ellen@example.com');               // Name is optional
    $mail->addReplyTo('info@example.com', 'Information');
    $mail->addCC('cc@example.com');
    $mail->addBCC('bcc@example.com');

    // 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('from@example.com', 'First Last');
$mail->addAddress('whoto@example.com', '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!';
}

Python

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

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

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

import smtplib

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

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

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

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

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

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

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

Пример

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

#!/usr/bin/python3

import smtplib

sender = 'from@fromdomain.com'
receivers = ['to@todomain.com']

message = """From: From Person <from@fromdomain.com>
To: To Person <to@todomain.com>
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 вместе с сообщением, адресом from и адресом назначения в качестве параметров (хотя адреса from и to находятся в самом письме, они не всегда используются для маршрутизации почты).

Если на вашей локальной машине не запущен 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 <from@fromdomain.com>
To: To Person <to@todomain.com>
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 = 'me@fromdomain.net'
reciever = 'admin@example.com'

marker = "AUNIQUEMARKER"

body ="""
This is a test email to send an attachement.
"""
# Define the main headers.
part1 = """From: From Person <me@fromdomain.net>
To: To Person <admin@example.com>
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:

Для установки:

  • Ubuntu: sudo apt install swaks
  • CentOS: Сначала: sudo yum install epel-release, и sudo yum install swaks или sudo dnf install swaks
  • Arch Linux: sudo pacman -S swaks

Затем вы можете выполнить команду и увидите диалог SMTP:

$ swaks --to foo@example.com --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:<foo@example.com>
<** 530 Authentication required
 -> QUIT
<-  221 example.com Service closing transmission channel
=== Connection closed with remote host.

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

$ swaks --to someone@example.com --server mail.example.com:587 --auth LOGIN
Username: yourusername
Password: yourpassword

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

MXToolBox

Вы можете использовать Email Server Test от MXToolBox для некоторого тестирования, которое иногда может быть полезным, но вы не можете указать, что вы хотите сделать с его помощью. Поэтому лучше использовать вышеприведенные материалы.

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

3
ответ дан 24 April 2021 в 02:59

Теги

Похожие вопросы