Wie kann ich einen SMTP-Server testen?

Wie kann ich einen SMTP-Server testen?

Ich habe SMTP-Serverinformationen und Anmeldeinformationen erhalten und möchte testen, ob sie funktionieren.

Wie kann ich unter Linux einfach über die Befehlszeile eine SMTP-Verbindung testen?

Ich weiß, dass ich dies über Telnet/OpenSSL tun kann, aber es scheint sehr kompliziert zu sein.

Wie überprüft man also einen SMTP-Server?

Antwort1

Das Tool swakskommt hier zum Einsatz

Unter Ubuntu ist es

apt install swaks

Anschließend können Sie den Befehl ausführen und sehen den SMTP-Dialog

$ 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.

Wie Sie hier sehen können, ist eine Authentifizierung erforderlich. Aus diesem Grund führen wir den Vorgang erneut aus mit

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

Weitere Informationen finden Sie auf der Manpage.

Antwort2

Ich weiß, dass ich dies über Telnet / OpenSSL tun kann, aber das scheint sehr kompliziert

Es ist ganz einfach, Sie können einfach googelnSMTP-Befehle, und Sie könnten sie ohne Probleme verwenden. Da Sie Ihre Frage selbst beantwortet haben, können Sie SWAKS verwenden. Hier sind einige alternative Optionen.


Dies sind einige SMTP-Befehle:

Jeder Befehl wird in einer normalen Kommunikationssequenz zwischen zwei Servern über das SMTP-Protokoll verwendet, um E-Mails zuzustellen.

Hallo
Es handelt sich um den ersten SMTP-Befehl: Er startet die Konversation zur Identifizierung des Absenderservers und wird im Allgemeinen von seinem Domänennamen gefolgt.

EHLO
Ein alternativer Befehl zum Starten der Konversation, der angibt, dass der Server das erweiterte SMTP-Protokoll verwendet.

MAIL VON
Mit diesem SMTP-Befehl beginnt die Operation: Der Absender gibt die Quell-E-Mail-Adresse in das Feld „Von“ ein und startet die eigentliche E-Mail-Übertragung.

RCPT ZU
Es identifiziert den Empfänger der E-Mail; gibt es mehrere, wird der Befehl einfach Adresse für Adresse wiederholt.

GRÖSSE
Dieser SMTP-Befehl informiert den Remote-Server über die geschätzte Größe (in Bytes) der angehängten E-Mail. Er kann auch verwendet werden, um die maximale Größe einer Nachricht anzugeben, die vom Server akzeptiert wird.

DATEN
Mit dem DATA-Befehl wird mit der Übertragung des E-Mail-Inhalts begonnen; im Allgemeinen folgt darauf ein vom Server ausgegebener Antwortcode 354, der die Berechtigung zum Starten der eigentlichen Übertragung erteilt.

VRFY
Dabei wird vom Server überprüft, ob die jeweilige E-Mail-Adresse oder der jeweilige Benutzername tatsächlich existiert.

DREHEN
Mit diesem Befehl können die Rollen zwischen Client und Server vertauscht werden, ohne dass eine neue Verbindung hergestellt werden muss.

AUTH
Mit dem AUTH-Befehl authentifiziert sich der Client gegenüber dem Server und gibt seinen Benutzernamen und sein Passwort an. Dies ist eine weitere Sicherheitsebene, um eine ordnungsgemäße Übertragung zu gewährleisten.

RSET
Es teilt dem Server mit, dass die laufende E-Mail-Übertragung beendet wird, obwohl die SMTP-Konversation nicht geschlossen wird (wie im Fall von QUIT).

EXPN
Dieser SMTP-Befehl fordert eine Bestätigung über die Identifizierung einer Mailingliste an.

HELFEN
Es handelt sich um die Anfrage eines Clients nach Informationen, die für die erfolgreiche Übertragung der E-Mail nützlich sein können.

AUFHÖREN
Es beendet die SMTP-Konversation.


OpenSSL, testssl.sh und GnuTLS

Sie könnenopenssl s_client, indem Sie einen Befehl wie den folgenden ausführen:

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

Sie können auch ein Tool namenstestssl.shzum Testen von SSL/TLS auf Ihrem SMTP-Server, selbstverständlich auch, wenn dieser lokal gehostet wird. Nachdem Sie es heruntergeladen haben, entpacken Sie es, gehen Sie in den Ordner testssl.sh und führen Sie Folgendes aus:

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

Sie können auch Folgendes verwenden, GnuTLSwenn Sie es installiert haben:

gnutls-cli mail.example.com -p 25

Telnet

Wenn Ihr SMTP-Server kein SSL/TLS unterstützt, können Sietelnet. Telnet ist hierfür das einfachste Tool, unterstützt jedoch kein SSL/TLS.

telnet mail.example.com 25

PHPMailer

Wenn Sie PHP verwenden, können SiePHPMailer:

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

Auch wenn dies keine Antwort auf Ihre Frage ist. Sie können DKIM sogar ganz einfach in PHPMailer einrichten:

<?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!';
}

Python

(Genommen vonhttps://www.tutorialspoint.com/python3/python_sending_email.htm, weil ich keine Links bereitstellen möchte, sondern das Ganze einfach hier gepostet habe, da auf der Seite jederzeit ein 404-Fehler auftreten kann.)

Python stellt smtplibein Modul bereit, das ein SMTP-Client-Sitzungsobjekt definiert, das zum Senden von E-Mails an jeden Internetcomputer mit einem SMTP- oder ESMTP-Listener-Daemon verwendet werden kann.

Hier ist eine einfache Syntax zum Erstellen eines SMTP-Objekts, das später zum Senden einer E-Mail verwendet werden kann -

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
Here is the detail of the parameters −
  • Gastgeber− Dies ist der Host, auf dem Ihr SMTP-Server läuft. Sie können die IP-Adresse des Hosts oder einen Domänennamen wie example.com angeben. Dies ist ein optionales Argument.

  • Hafen− Wenn Sie ein Hostargument angeben, müssen Sie einen Port angeben, an dem der SMTP-Server lauscht. Normalerweise ist dies Port 25.

  • lokaler_Hostname− Wenn Ihr SMTP-Server auf Ihrem lokalen Computer ausgeführt wird, können Sie die Option einfach „localhost“ angeben.

Ein SMTP-Objekt hat eine Instanzmethode namens sendmail, die normalerweise zum Versenden einer Nachricht verwendet wird. Sie benötigt drei Parameter:

  • Der Absender − Eine Zeichenfolge mit der Adresse des Absenders.

  • Die Empfänger – Eine Liste von Zeichenfolgen, eine für jeden Empfänger.

  • Die Nachricht – Eine Nachricht als Zeichenfolge, formatiert wie in den verschiedenen RFCs angegeben.

Beispiel

Hier ist eine einfache Möglichkeit, eine E-Mail mit einem Python-Skript zu senden. Probieren Sie es einmal aus −

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

Hier haben Sie eine einfache E-Mail in eine Nachricht eingefügt, wobei Sie drei Anführungszeichen verwendet und auf die korrekte Formatierung der Kopfzeilen geachtet haben. Eine E-Mail erfordert einen Von-, An- und Betreff-Header, der durch eine Leerzeile vom Hauptteil der E-Mail getrennt ist.

Zum Senden der E-Mail verwenden Sie smtpObj, um eine Verbindung zum SMTP-Server auf dem lokalen Computer herzustellen. Verwenden Sie dann die Methode sendmail zusammen mit der Nachricht, der Absenderadresse und der Zieladresse als Parameter (obwohl die Absender- und Empfängeradressen in der E-Mail selbst enthalten sind, werden sie nicht immer zum Weiterleiten der E-Mail verwendet).

Wenn Sie auf Ihrem lokalen Computer keinen SMTP-Server betreiben, können Sie den smtplib-Client verwenden, um mit einem Remote-SMTP-Server zu kommunizieren. Sofern Sie keinen Webmail-Dienst (wie Gmail oder Yahoo! Mail) verwenden, muss Ihr E-Mail-Anbieter Ihnen die Details zum Postausgangsserver bereitgestellt haben, die Sie ihm wie folgt mitteilen können:

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

Senden einer HTML-E-Mail mit Python Wenn Sie eine Textnachricht mit Python senden, wird der gesamte Inhalt als einfacher Text behandelt. Selbst wenn Sie HTML-Tags in eine Textnachricht einfügen, wird diese als einfacher Text angezeigt und HTML-Tags werden nicht gemäß der HTML-Syntax formatiert. Python bietet jedoch die Möglichkeit, eine HTML-Nachricht als tatsächliche HTML-Nachricht zu senden.

Beim Senden einer E-Mail-Nachricht können Sie eine MIME-Version, einen Inhaltstyp und den Zeichensatz angeben, um eine HTML-E-Mail zu senden.

Beispiel

Nachfolgend finden Sie ein Beispiel zum Senden des HTML-Inhalts als E-Mail. Probieren Sie es einmal aus −

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

Anhänge als E-Mail versenden Um eine E-Mail mit gemischtem Inhalt zu versenden, muss der Content-Type-Header auf multipart/mixed gesetzt werden. Anschließend können der Text und die Anhangsabschnitte in Grenzen angegeben werden.

Eine Grenze beginnt mit zwei Bindestrichen, gefolgt von einer eindeutigen Nummer, die nicht im Nachrichtenteil der E-Mail erscheinen darf. Eine letzte Grenze, die den letzten Abschnitt der E-Mail kennzeichnet, muss ebenfalls mit zwei Bindestrichen enden.

Die angehängten Dateien sollten pack("m")vor der Übertragung mit der Funktion zur Base64-Kodierung kodiert werden.

Beispiel Nachfolgend sehen Sie ein Beispiel, das eine Datei /tmp/test.txtals Anhang versendet. Probieren Sie es einmal aus −

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

So installieren Sie es:

  • Ubuntu:sudo apt install swaks
  • CentOS: Erstens: sudo yum install epel-release, und sudo yum install swaksodersudo dnf install swaks
  • Arch Linux:sudo pacman -S swaks

Anschließend können Sie den Befehl ausführen und sehen den SMTP-Dialog:

$ 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.

Wie Sie hier sehen können, ist eine Authentifizierung erforderlich. Aus diesem Grund führen wir den Vorgang erneut aus mit

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

Sie können AUTH PLAIN auch mithilfe von verwenden --auth PLAIN, abhängig von der Methode, die der Server unterstützt. Weitere Informationen finden Sie auf der Manpage mithilfe von man swaks.

MXToolBox

Sie können MXToolBox's verwendenE-Mail-Server-Testfür einige Tests kann das manchmal nützlich sein, aber Sie können nicht angeben, was Sie damit machen möchten. Sie verwenden also besser die oben genannten Dinge.

Oder verwenden Sie einfach den mailBefehl ...

Antwort3

Der Test kann auf verschiedene Arten durchgeführt werden:

  1. Wie bereits erwähnt, verwende ich die Python-Bibliothek.
  2. Verwenden Sie auch den Sendmail-Client, um den SMPT-Server zu testen.
  3. Sie können zum Durchführen von E-Mail-Vorgängen auch Postfix und Dovcot einrichten.

verwandte Informationen