.png)
Quando eu usoPHPMailerpara enviar e-mail através do Postfix, eu uso a configuração padrão com estas modificações:
# 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
Quando eu uso esta configuração e executoPHPMailer, diz que a conexão falhou, logo após fazer o STARTTLS
comando. MeuPHPMailerconfiguração é
$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 mesmo se eu usar telnet e fizer isso, recebo depois de executar o comando STARTTLS.
Descobri que usar isso me permite enviar o e-mail comPHPMailer:
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer_name' => false
)
);
Mas acho que isso seria uma questão de segurança. De que outra forma posso fazer isso funcionar?
Responder1
A verificação do nome do peer só funciona se o nome do peer for conhecido.
Torne-o conhecido configurando o nome do 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';
Você (deveria) ter um certificado para o nome do seu servidor de e-mail - comparar esse nome no certificado localhost
não é suficiente para determinar se o certificado é apropriado. Qualquer cliente de e-mail ou ferramenta de teste que queira verificar seu certificado precisa saber o nome com o qual deve ser comparado.
Escolha detalhada:Seu valor SMTPSecure contém o valor da variável const (a string "tls"
) - use o nome ( PHPMailer::ENCRYPTION_STARTTLS
) porque o valor em si não explica o que significa sem consultar a documentação.
Sobretelnet: Usando uma ferramenta de teste simples comotelneté uma boa opção para descobrir problemas - mas você não pode usar telnet
aqui - este programa (normalmente) não tem conhecimento da criptografia TLS. Eu gosto de usar um utilitário incluído comabresslem vez de:
openssl s_client -connect hostname:25 -starttls smtp
(sim, pode até ser explicado STARTTLS
para você e exibir os parâmetros de conexão de uma forma legível por humanos)