.png)
cuando usoPHPMailerPara enviar correo a través de Postfix, uso la configuración predeterminada con estas modificaciones:
# 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
Cuando uso esta configuración y ejecutoPHPMailer, dice que la conexión falló, justo después de realizar el STARTTLS
comando. MiPHPMailerla configuración es
$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;
E incluso si uso telnet y lo hago, lo obtengo después de ejecutar el comando STARTTLS.
Descubrí que usar esto me permite enviar el correo conPHPMailer:
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer_name' => false
)
);
Pero creo que eso sería un problema de seguridad. ¿De qué otra manera puedo hacer que esto funcione?
Respuesta1
La verificación del nombre del par solo funciona si se conoce el nombre del par.
Hazlo saber configurando el nombre del servidor como Host
.
// this is a name not mentioned in the cert
$mail->Host = 'localhost';
// better: a full domain name
$mail->Host = 'mx8.mydomain.example';
Usted (debería) tener un certificado para el nombre de su servidor de correo; comparar ese nombre en el certificado localhost
no es suficiente para determinar que el certificado es apropiado. Cualquier cliente de correo o herramienta de prueba que quiera verificar su certificado necesita saber el nombre con el que debe compararse.
Quisquilloso:Su valor SMTPSecure contiene el valor de la variable constante (la cadena "tls"
); use el nombre ( PHPMailer::ENCRYPTION_STARTTLS
) porque el valor en sí no explica lo que significa sin consultar la documentación.
Acerca deTelnet: Usando una herramienta de prueba simple comoTelnetes una buena opción para resolver problemas, pero no puede usarlo telnet
aquí; este programa (normalmente) no reconoce el cifrado TLS. Me gusta usar una utilidad incluida conabreslen cambio:
openssl s_client -connect hostname:25 -starttls smtp
(sí, incluso puede deletrearlo STARTTLS
y mostrar los parámetros de conexión de una manera algo legible para humanos)