问题发送电子邮件至谷歌的SMTP服务器(有自己的PHP脚本)(Problems sending an

2019-10-17 08:46发布

我写了一个小PHP脚本连接到SMTP服务器和发送电子邮件。 特别是连接到网上搜寻SMTP服务器。 显然,从下面的东西所示SMTPD集出错。

[data2] => 501 5.5.2 Cannot Decode response o47sm22737144eem.11

我做了一个错误在我的电子邮件正文,即。 误格式化? 下面是PHP脚本:

// SMTP settings
define( 'SMTP_SERVER', "ssl://smtp.gmail.com" );
define( 'SMTP_PORT', '465' );
define( 'SMTP_USER', 'XXX@gmail.com' ); // my gmail account
define( 'SMTP_PWD', 'XXX' ); // my gmail password


class Mail
{
    public static function send( $smtpServer, $smtpPort, $smtpUser, $smtpPwd,
        $from, $to, $subject, $message )
    {
        // Establish connection to SMTP server
        $smtpConn = fsockopen( $smtpServer, $smtpPort );
        $smtpLog['connect'] = fgets( $smtpConn );

        // In case of success start SMTP communication
        if ( $smtpConn !== false )
        {
            // Say hello to SMTP
            fputs( $smtpConn, 'EHLO ' . $_SERVER['SERVER_ADDR'] . NL );
            $smtpLog['hello'] = fgets( $smtpConn );

            // Require authentication
            fputs( $smtpConn, 'AUTH LOGIN' . NL );
            $smtpLog['auth'] = fgets( $smtpConn );

            // Send username
            fputs( $smtpConn, base64_encode( $smtpUser ) . NL );
            $smtpLog['user'] = fgets( $smtpConn );

            // Send password
            fputs( $smtpConn, base64_encode( $smtpPwd ) . NL );
            $smtpLog['pwd'] = fgets( $smtpConn );

            // Send email from
            fputs( $smtpConn, "MAIL FROM: <$from>" . NL );
            $smtpLog['from'] = fgets( $smtpConn );

            // Send email to
            fputs( $smtpConn, "RCPT TO: <$to>". NL );
            $smtpLog['to'] = fgets( $smtpConn );

            // Send "the email"
            fputs( $smtpConn, 'DATA' . NL );
            $smtpLog['data1'] =  fgets( $smtpConn );

            fputs( $smtpConn,
                "To: <$to>\r\nFrom: <$from>\r\nSubject: $subject\r\n$message\r\n.\r\n" );
            $smtpLog['data2'] =  fgets( $smtpConn );

            fputs( $smtpConn, 'QUIT' . NL );
            $smtpLog['quit'] =  fgets( $smtpConn );

            fclose( $smtpConn );
        }

        return $smtpLog;
    }
}


$log = Mail::send( SMTP_SERVER, SMTP_PORT, SMTP_USER, SMTP_PWD,
   'XXX@gmail.com', 'XXX@yahoo.com', 'Subject', 'Message' );

print_r( $log );

并全面响应日志从谷歌的SMTP服务器:

[connect] => 220 mx.google.com ESMTP o47sm22737144eem.11
[hello] => 250-mx.google.com at your service, [XX.XX.XX.XX]
[auth] => 250-SIZE 35882577
[user] => 250-8BITMIME
[pwd] => 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
[from] => 250 ENHANCEDSTATUSCODES
[to] => 334 XXX
[data1] => 334 XXX
[data2] => 501 5.5.2 Cannot Decode response o47sm22737144eem.11
[quit] => 530-5.5.1 Authentication Required. Learn more at

Answer 1:

男人,你读一行回复,其中有多个行。

MULTILINE答复

250-LINE #1 // lines that have - after ### continue on the next
250-LINE #2 // lines that have - after ### continue on the next
250 LINE #3 // last line has space after ###

SINGLELINE回复

220 LINE #1 // one reply with code 220
250 LINE #2 // another reply with code 250
// no ### code is followed by - as that means: not the last line!

你的命令不同步。 因此,解决这样的:

if($smtpLog['hello'] = fgets( $smtpConn )){
    // handle multiline reply
    while($smtpLog['hello']{4} !== ' '){
        $smtpLog['hello'] .= PHP_EOL.fgets( $smtpConn );
    }
}

这适用于你每一个回应,但在你的情况下,在EHLO命令断裂同步。



Answer 2:

尽量用好和测试的PHP类PHPMailer的 ,这是很酷的事情



文章来源: Problems sending an email to google's SMTP server (with own php script)
标签: php email smtp