发送电子邮件phpmailer和javax.mail

前端之家收集整理的这篇文章主要介绍了发送电子邮件phpmailer和javax.mail前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个相似的代码部分,用 javaPHP编写.由于证书错误,PHP没有发送电子邮件
Connection Failed. Error #2: stream_socket_enable_crypto():
  Peer certificate CN=*.hosting.com' did not match
  expected CN=smtp.anotherhosting.com'

但java代码发送电子邮件没有任何问题,我无法理解为什么. (从任何地方我都看到问题 – how to skip ssl checks with 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 = 'username@anotherhosting.com';
        $mail->Password = 'password';
        $mail->SMTPSecure = 'tls';
        $mail->Port = 587;

        //Recipients
        $mail->setFrom('from@company.com');
        $mail->addAddress('myemail@company.com');
        $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 = "username@anotherhosting.com";
        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("from@company.com"));
            message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("myemail@company.com"));
            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客户端做的一切都很好.如果有人知道如何解决这个问题,请告诉我.

此外,当它试图调用stream_socket_enable_crypto时,PHP代码line 402失败.

这是日志文件
Java的:

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 "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:<from@company.com>
250 ok
RCPT TO:<myemail@company.com>
250 ok
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   myemail@company.com
DATA
354 go ahead
From: from@company.com
To: myemail@company.com
Message-ID: <1338668845.01537892151523.JavaMail.myemail@company.com>
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服务由https://www.networksolutions.com/提供

对.因此,您的Java代码存在一个允许中间人攻击成功的错误.在PHP中,通过完全按照TLS设计的方式,它成功地阻止了这一点.

发生了什么事情是ISP的防火墙上的TCP重定向,这对两个客户端都是不可见的.您可以禁用证书检查(如the troubleshooting guide中所述),但实际上您不应该这样做.要么显式连接到正确的名称(mailpod.hosting.com),要么使用不会篡改您的流量的托管服务提供商.

原文链接:/php/136229.html

猜你在找的PHP相关文章