У меня есть две аналогичные части кода, написанные на Java и PHP. PHP не отправил письмо из-за ошибки сертификата —
Connection failed. Error #2: stream_socket_enable_crypto():
Peer certificate CN=*.hosting.com' did not match
expected CN=smtp.anotherhosting.com'
Но Java-код отправляет электронные письма без проблем, и я не могу понять, почему. (отовсюду вижу вопросы — как пропустить проверки SSL с Java?
Вот код:
PHP:
<?php
require './PHPMailer.php';
require './SMTP.php';
use PHPMailer\PHPMailer\PHPMailer;
$mail = new PHPMailer(true);
try {
$mail->SMTPDebug = 4;
$mail->isSMTP();
$mail->Host = 'smtp.anotherhosting.com';
$mail->SMTPAuth = true;
$mail->Username = '[email protected]';
$mail->Password = 'password';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
//Recipients
$mail->setFrom('[email protected]');
$mail->addAddress('[email protected]');
$mail->isHTML(true);
$mail->Subject = 'Here is the subject12';
$mail->Body = 'This is the HTML message bo22dy <b>in bold!</b>';
$mail->send();
echo 'Message has been sent';
} catch (Exception $e) {
echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
}
try {
$mail->smtpClose();
} catch (Exception $e) {
echo $e->getTraceAsString();
}
и Java:
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class Main {
public static void main(String[] args) {
final String username = "[email protected]";
final String password = "password";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.anotherhosting.com");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
session.setDebug(true);
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("[email protected]"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("[email protected]"));
message.setSubject("Testing Subject");
message.setText("Dear Mail Crawler,"+ "\n\n No spam to my email, please!");
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
}
Моя задача — реализовать функцию отправки электронной почты с помощью php-кода. С моей текущей точки зрения, это не удалось из-за перенаправления smtp с одного хоста на другой. Скорее всего, phpmailer получил host1, получает перенаправление на host2, получает сертификат от host2 и сравнивает этот сертификат с host1. В то же время, Java-клиент все делает хорошо. Если кто-нибудь знает, как решить эту проблему, пожалуйста, дайте мне знать.
Кроме того, php код не работает на линия 402 когда попробую позвонить stream_socket_enable_crypto.
Вот файлы журнала:
Джава:
DEBUG: setDebug: JavaMail version 1.4ea
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.anotherhosting.com", port 587, isSSL false
220 mailpod.hosting.com ESMTP
DEBUG SMTP: connected to host "smtp.anotherhosting.com", port: 587
EHLO degr [most probably my computer name]
250-mailpod.hosting.com
250-STARTTLS
250-PIPELINING
250-8BITMIME
250-SIZE 65000000
250 AUTH LOGIN PLAIN CRAM-MD5
DEBUG SMTP: Found extension "STARTTLS", arg ""DEBUG SMTP: Found extension "PIPELINING", arg ""DEBUG SMTP: Found extension "8BITMIME", arg ""DEBUG SMTP: Found extension "SIZE", arg "65000000"DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN CRAM-MD5"STARTTLS
220 ready for tls
EHLO degr
250-mailpod.hosting.com
250-PIPELINING
250-8BITMIME
250-SIZE 65000000
250 AUTH LOGIN PLAIN CRAM-MD5
DEBUG SMTP: Found extension "PIPELINING", arg ""DEBUG SMTP: Found extension "8BITMIME", arg ""DEBUG SMTP: Found extension "SIZE", arg "65000000"DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN CRAM-MD5"DEBUG SMTP: Attempt to authenticate
AUTH LOGIN
334 [auth hash here]
[auth hash here]
334 [auth hash here]
[auth hash here]
235 ok, go ahead (#2.0.0)
DEBUG SMTP: use8bit false
MAIL FROM:<[email protected]>
250 ok
RCPT TO:<[email protected]>
250 ok
DEBUG SMTP: Verified Addresses
DEBUG SMTP: [email protected]
DATA
354 go ahead
From: [email protected]
To: [email protected]
Message-ID: <[email protected]>
Subject: Testing Subject
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Dear Mail Crawler,
No spam to my email, please!
.
250 ok 1537892155 qp 173024
QUIT
221 mailpod.hosting.com
Done
PHP:
2018-09-25 16:26:35 Connection: opening to smtp.anotherhosting.com:587, timeout=300, options=array()
2018-09-25 16:26:35 Connection: opened
2018-09-25 16:26:35 SMTP INBOUND: "220 mailpod.hosting.com ESMTP"2018-09-25 16:26:35 SERVER -> CLIENT: 220 mailpod.hosting.com ESMTP
2018-09-25 16:26:37 CLIENT -> SERVER: EHLO localhost
2018-09-25 16:26:38 SMTP INBOUND: "250-mailpod.hosting.com"2018-09-25 16:26:38 SMTP INBOUND: "250-STARTTLS"2018-09-25 16:26:38 SMTP INBOUND: "250-PIPELINING"2018-09-25 16:26:38 SMTP INBOUND: "250-8BITMIME"2018-09-25 16:26:38 SMTP INBOUND: "250-SIZE 65000000"2018-09-25 16:26:38 SMTP INBOUND: "250 AUTH LOGIN PLAIN CRAM-MD5"2018-09-25 16:26:38 SERVER -> CLIENT: 250-mailpod.hosting.com250-STARTTLS250-PIPELINING250-8BITMIME250-SIZE 65000000250 AUTH LOGIN PLAIN CRAM-MD5
2018-09-25 16:26:38 CLIENT -> SERVER: STARTTLS
2018-09-25 16:26:38 SMTP INBOUND: "220 ready for tls"2018-09-25 16:26:38 SERVER -> CLIENT: 220 ready for tls
2018-09-25 16:26:38 Connection failed. Error #2: stream_socket_enable_crypto(): Peer certificate CN=*.hosting.com' did not match expected CN=smtp.anotherhosting.com' [C:\project\SMTP.php line 402]
SMTP Error: Could not connect to SMTP host.
2018-09-25 16:26:39 CLIENT -> SERVER: QUIT
2018-09-25 16:26:39
2018-09-25 16:26:39
2018-09-25 16:26:39
2018-09-25 16:26:39 Connection: closed
SMTP Error: Could not connect to SMTP host.
Message could not be sent. Mailer Error: SMTP Error: Could not connect to SMTP host.
PS Smpt сервис, предоставляемый https://www.networksolutions.com/
Правильно. Таким образом, в вашем Java-коде есть ошибка, позволяющая успешно атаковать по принципу «человек посередине». В PHP это успешно предотвращается, делая именно то, для чего предназначен TLS.
Происходит перенаправление TCP на брандмауэре вашего интернет-провайдера, которое невидимо для обоих клиентов. Вы можете отключить проверки сертификатов (как описано в руководство по устранению неполадок), но вы действительно не должны. Либо подключитесь явно к правильному имени (mailpod.hosting.com
), или используйте хостинг-провайдера, который не вмешивается в ваш трафик.
Это может быть временный решение для вас.
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
Вы можете разрешить небезопасные соединения через SMTPOptions
свойство, появившееся в PHPMailer 5.2.10 (это можно сделать с помощью
наследование класса SMTP в более ранних версиях), хотя это не
Рекомендуется, поскольку это побеждает большую часть смысла использования безопасного
транспорт вообще.
Подробнее о SMTPOptions
Вот Wiki