Я получил информацию о SMTP-сервере и учетные данные и хочу проверить, работают ли они.
Как я могу легко проверить SMTP-соединение в Linux с помощью командной строки?
Я знаю, что могу сделать это через telnet / openssl, но это кажется очень сложным.
Как проверить SMTP сервер?
Здесь пригодится инструмент 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 для получения дополнительной информации
Это можно проверить несколькими способами:
Я знаю, что могу сделать это через telnet / openssl, но это кажется очень сложным
Это довольно просто, вы можете просто погуглить SMTP Commands, и вы сможете использовать их без проблем. Поскольку вы сами ответили на свой вопрос, вы можете использовать SWAKS. Вот некоторые альтернативные варианты.
Каждая команда используется в обычной последовательности связи между двумя серверами по протоколу 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 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
Если ваш SMTP-сервер не имеет SSL/TLS, вы можете использовать telnet
. Telnet - самый простой инструмент для этого, но он не поддерживает SSL/TLS.
telnet mail.example.com 25
Если вы используете 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!';
}
(Взято из 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")
Для установки:
sudo apt install swaks
sudo yum install epel-release
, и sudo yum install swaks
или sudo dnf install swaks
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
.
Вы можете использовать Email Server Test от MXToolBox для некоторого тестирования, которое иногда может быть полезным, но вы не можете указать, что вы хотите сделать с его помощью. Поэтому лучше использовать вышеприведенные материалы.
mail
...