使用PHPMailer通过SMTP发送电子邮件

14

我正在尝试使用PHPMailer发送SMTP邮件,但一直收到这个错误消息,请问如何摆脱它?
我正尝试通过SSL连接465端口。

SMTP -> FROM SERVER: 
SMTP -> FROM SERVER: 
SMTP -> ERROR: EHLO not accepted from server: 

Notice: fputs() [function.fputs]: send of 18 bytes failed with errno=32 Roura přerušena (SIGPIPE) in /home/www/amazonek.cz/subdomains/library/PHPMailer_v5.1/class.smtp.php on line 494
SMTP -> FROM SERVER: 
SMTP -> ERROR: HELO not accepted from server: 

Notice: fputs() [function.fputs]: send of 12 bytes failed with errno=32 Roura přerušena (SIGPIPE) in /home/www/amazonek.cz/subdomains/library/PHPMailer_v5.1/class.smtp.php on line 212
SMTP -> ERROR: AUTH not accepted from server: 
SMTP Error: Could not authenticate.

我的代码:

  require_once('../library/PHPMailer_v5.1/class.phpmailer.php');

        try{
            $mail = new PHPMailer(true);
            $mail->IsSMTP();
            $mail->SMTPAuth = true;
            $mail->Host = SMTP_SERVER;
            $mail->Port = SMTP_PORT;
            $mail->Username = SMTP_USERNAME;
            $mail->Password = SMTP_PASSWORD;
            $mail->SMTPDebug = 2;
            $mail->SetFrom(MAIL_ORDERS_ADDRESS, MAIL_ORDERS_NAME);
            $mail->Subject = 'AMAZONEK.cz - objednávka číslo '.$_SESSION['orderId'];
            $mail->MsgHTML('<b>Ahoj</b>');
            $mail->AddAddress($_SESSION['user']['email'], $_SESSION['user']['name'].' '.$_SESSION['user']['surname']);
            $mail->AddBCC(MAIL_ORDERS_ADDRESS, MAIL_ORDERS_NAME);

            if(!$mail->Send()) throw new Exception($mail->ErrorInfo);
        }
        catch(Exception $e){
            echo $e->getMessage();
        }

常量定义:

define('SMTP_SERVER', 'smtp.ebola.cz');
define('SMTP_PORT', 465);
define('SMTP_USERNAME', 'myEmail@myDomain.tld');
define('SMTP_PASSWORD', '***CENSORED***');

define('MAIL_ORDERS_ADDRESS', 'myEmail@myDomain.tld');
define('MAIL_ORDERS_NAME', 'My Name');
任何想法?
9个回答

29
据我所见,您的代码没有问题。您的错误是:
SMTP 错误:无法验证身份。
这意味着您发送的凭据被 SMTP 服务器拒绝。请确保主机、端口、用户名和密码正确。如果您想使用 STARTTLS,请尝试添加:
$mail->SMTPSecure = 'tls';
如果您想使用SMTPS(SSL),请尝试添加以下内容:
$mail->SMTPSecure = 'ssl';

请注意:

  • 一些SMTP服务器可能会禁止外部连接。
  • 有些SMTP服务器不支持SSL(或TLS)连接。

也许 这个示例 可以帮助你(GMail安全SMTP)。

[Source]


这实际上很有帮助,我没有意识到如果SMTP提供程序没有指定,我需要使用“ssl”前缀。谢谢。 - cypher
2
你也可以在主机名前加上协议(例如 $mail->Host = "tls://".SMTP_SERVER;),并使用 端口465 - Lucas Pottersky
示例链接已失效。 - ericek111
@ericek111,PHPMailer似乎已经放弃了他们的网站。使用存档页面更新链接。 - AlexV

4
尝试手动通过SMTP服务器发送电子邮件/使用交互式邮件客户端(例如Mozilla Thunderbird)发送电子邮件。从错误信息来看,似乎该服务器不接受您的凭据。该SMTP是在哪个端口上运行,还是采用SSL+SMTP?您似乎没有在发布的代码中使用安全连接,我不确定PHPMailer是否支持SSL+SMTP。
(通过谷歌搜索您的SMTP服务器主机名的第一个结果:http://podpora.ebola.cz/idx.php/0/006/article/Strucny-technicky-popis-nastaveni-sluzeb.html,似乎表明“SMTPs邮件发送:安全的SSL连接,端口:465”。)
看起来PHPMailer确实支持SSL;至少从这里可以看出。因此,您需要更改以下内容:
define('SMTP_SERVER', 'smtp.ebola.cz');

将其转化为:

define('SMTP_SERVER', 'ssl://smtp.ebola.cz');

1
是的,PHPMailer支持SSL(TLS)SMTP。 - AlexV

3

尝试使用25号端口而不是456号端口。

当我使用456号端口时,出现了相同的错误,将其更改为25号端口后问题得到解决。


2
这可能看起来像是一次尝试,但如果SMTP需要SSL,请确保PHP已经与OpenSSL编译好了。
使用phpinfo()来进行检查。
希望这能有所帮助!

1

是的,您需要正确安装OpenSSL。我的备用测试站点可以工作,但我的生产服务器却不能。区别在哪里?生产服务器没有在PHP配置中安装OpenSSL。


1
我遇到了类似的问题大约一个小时,直到我找出了问题所在。我的问题是,我使用了SSL而不是ssl。在代码中检查大小写敏感AlexV指导我找到了问题的源头。那个helo/ehlo -相关的东西似乎无关紧要。

1
SMTP -> 从服务器收到:
SMTP -> 从服务器收到:
SMTP -> 错误:服务器未接受EHLO:

这是尝试使用未使用SSL的客户端连接到SSL服务的典型情况。

SMTP错误:无法验证身份。

没有惊喜,因为未能启动SMTP对话,认证不是一个选项。

phpmailer不执行隐式SSL(也称为连接时的TLS,SMTPS)除非重写smtp.class.php以包括对其的支持,否则无法完成您的请求。

改用带有显式SSL(也称为TLS,STARTTLS)的端口587。


0

使用 one.com 作为 SMTP 端口 465 是无法工作的。在 phpmailer 中我可以使用以下配置:

$mail->Host = 'send.one.com';
$mail->SMTPAuth = true;
$mail->Username = "***";
$mail->Password = "******";
$mail->From = "***";
$mail->SMTPAutoTLS = false;
$mail->SMTPSecure = 'none';
$mail->Port = 25;

-1

使用 PHP 流套接字和 TLS/SSL SMTP STARTTLS 命令的简单 SMTP 客户端: https://github.com/breakermind/PhpMimeParser/blob/master/PhpSmtpSslSocketClient.php

可与 gmail.com 进行身份验证。

<?php
// Login email and password
$login = "your-email@cool.xx";
$pass = "123456";

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
stream_context_set_option($ctx, 'ssl', 'verify_peer_name', false);
try{
    // echo $socket = stream_socket_client('ssl://smtp.gmail.com:587', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
    echo $socket = stream_socket_client('tcp://smtp.gmail.com:587', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
    if (!$socket) {
        print "Failed to connect $err $errstr\n";
        return;
    }else{
        // Http
        // fwrite($socket, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
        // Smtp
        echo fread($socket,8192);
        echo fwrite($socket, "EHLO cool.xx\r\n");
        echo fread($socket,8192);

        // Start tls connection
        echo fwrite($socket, "STARTTLS\r\n");
        echo fread($socket,8192);

        echo stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);

        // Send ehlo
        echo fwrite($socket, "EHLO cool.xx\r\n");
        echo fread($socket,8192);

        // echo fwrite($socket, "MAIL FROM: <hello@cool.com>\r\n");
        // echo fread($socket,8192);

        echo fwrite($socket, "AUTH LOGIN\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, base64_encode($login)."\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, base64_encode($pass)."\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, "rcpt to: <to-email@boome.com>\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, "DATA\n");
        echo fread($socket,8192);

        echo fwrite($socket, "Date: ".time()."\r\nTo: <to-email@boome.com>\r\nFrom:<zour-email@cool.xx\r\nSubject:Hello from php socket tls\r\n.\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, "QUIT \n");
        echo fread($socket,8192);

        /* Turn off encryption for the rest */
        // stream_socket_enable_crypto($fp, false);

        fclose($socket);
    }
}catch(Exception $e){
    echo $e;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接