.png)
Wenn ichPHPMailerUm E-Mails über Postfix zu senden, verwende ich die Standardkonfiguration mit diesen Änderungen:
# SMTP from other servers to yours
smtpd_tls_key_file = /etc/postfix/myletsencryptcert.key
smtpd_tls_cert_file = /etc/postfix/myletsencryptcert.crt
smtpd_tls_CAfile = /etc/postfix/myletsencryptcert.crt
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3
smtpd_tls_protocols=!SSLv2,!SSLv3
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_database =
btree:/var/lib/postfix/smtpd_tls_session_cache
Wenn ich diese Konfiguration verwende und ausführePHPMailer, es heißt, die Verbindung sei fehlgeschlagen, gleich nachdem ich den STARTTLS
Befehl ausgeführt habe. MeinePHPMailerconfig ist
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'localhost';
//$mail->SMTPAuth = true;
$mail->Username = '[email protected]';
//$mail->Password = 'passwordwhichissecretobviously';
$mail->SMTPSecure = 'tls';
$mail->Port = 25;
$mail->SMTPAutoTLS = false;
$mail->setFrom("[email protected]", "Some person");
$mail->addAddress("[email protected]");
$mail->isHTML(true);
$mail->Subject = "Web Development";
$mail->Body = "
Some random HTML message
";
$mail->AltBody = "some normal message without HTML";
$mail->XMailer = "0";
$mail->CharSet = 'UTF-8';
$mail->Encoding = 'base64';
$mail->DKIM_domain = 'example.com';
$mail->DKIM_private = '/right/path/to/dkimkey/which/works/properly/dkim.key';
$mail->DKIM_selector = 'default';
$mail->DKIM_passphrase = '';
$mail->DKIM_identity = $mail->From;
$mail->DKIM_copyHeaderFields = false;
Und selbst wenn ich Telnet verwende und es mache, erhalte ich nach dem Ausführen des STARTTLS-Befehls die Antwort.
Ich habe herausgefunden, dass ich damit die E-Mail mitPHPMailer:
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer_name' => false
)
);
Aber ich denke, das wäre ein Sicherheitsproblem. Wie kann ich das sonst zum Laufen bringen?
Antwort1
Die Peer-Namensüberprüfung funktioniert nur, wenn der Peer-Name bekannt ist.
Machen Sie es bekannt, indem Sie den Servernamen als konfigurieren Host
.
// this is a name not mentioned in the cert
$mail->Host = 'localhost';
// better: a full domain name
$mail->Host = 'mx8.mydomain.example';
Sie (sollten) ein Zertifikat für den Namen Ihres Mailservers haben – ein Vergleich dieses Namens im Zertifikat localhost
reicht nicht aus, um festzustellen, ob das Zertifikat angemessen ist. Jeder Mail-Client oder jedes Testtool, das Ihr Zertifikat überprüfen möchte, muss den Namen kennen, mit dem es verglichen werden soll.
Kleinigkeit:Ihr SMTPSecure-Wert enthält den Wert der Konstantenvariable (die Zeichenfolge "tls"
) – verwenden Sie den Namen ( PHPMailer::ENCRYPTION_STARTTLS
), da die Bedeutung des Werts selbst ohne einen Blick in die Dokumentation nicht erklärt wird.
UmTelnet: Mit einem einfachen Testtool wieTelnetist eine gute Wahl, um Probleme herauszufinden - aber Sie können es telnet
hier nicht verwenden - dieses Programm kennt (normalerweise) keine TLS-Verschlüsselung. Ich verwende gerne ein Dienstprogramm, das in enthalten istopensslstattdessen:
openssl s_client -connect hostname:25 -starttls smtp
(ja, es kann Ihnen die Verbindungsparameter sogar buchstabieren STARTTLS
und in einer einigermaßen menschenlesbaren Form anzeigen)