服务器无法SMTP发送邮件

PHPmailer+smtp发送邮件,在本地测试没有问题,上传服务器却出错了,报错如下。

"The following From address failed: admin@shuku.com : Called Mail() without being connected"

起初我以为是PHP缺少扩展插件,或者是pfsockopen与fsockopen函数没有启用,结果却不是。

我用的是阿里云服务器,阿里云默认是禁用25端口的,而邮件发送恰恰用到25端口。

25端口好像是可以申诉的,但好像挺麻烦,所以没有尝试。

解决办法也很是简单,只需要修改一下代码即可

function send_email($to, $code){
    $subject = '邮箱验证码';
    $body = "<h5>尊敬的网友:</h5><p>您的验证码为:".$code."</p>";
    $config = Config('mailer');
    import('phpmailer.phpmailer',EXTEND_PATH,'.php');
    //vendor('PHPMailer.class#phpmailer'); //从PHPMailer目录导class.phpmailer.php类文件
    $mail             = new \phpmailer\PHPMailer(); //PHPMailer对象
    $mail->CharSet    = 'UTF-8'; //设定邮件编码,默认ISO-8859-1,如果发中文此项必须设置,否则乱码
    $mail->IsSMTP();  // 设定使用SMTP服务
    $mail->SMTPDebug  = 0;                     // 关闭SMTP调试功能
    // 1 = errors and messages
    // 2 = messages only
    $mail->SMTPAuth   = true;                  // 启用 SMTP 验证功能
    $mail->SMTPSecure = '';                 // 使用安全协议
    $mail->Host       = $config['SMTP_HOST'];  // SMTP 服务器
    $mail->Port       = $config['SMTP_PORT'];  // SMTP服务器的端口号
    $mail->Username   = $config['SMTP_USER'];  // SMTP服务器用户名
    $mail->Password   = $config['SMTP_PASS'];  // SMTP服务器密码
    $mail->SetFrom($config['FROM_EMAIL'], $config['FROM_NAME']);
    $replyEmail       = $config['REPLY_EMAIL']?$config['REPLY_EMAIL']:$config['FROM_EMAIL'];
    $replyName        = $config['REPLY_NAME']?$config['REPLY_NAME']:$config['FROM_NAME'];
    $mail->AddReplyTo($replyEmail, $replyName);
    $mail->Subject    = $subject;
    $mail->MsgHTML($body);
    $mail->AddAddress($to);

    return $mail->Send() ? true : $mail->ErrorInfo;
}

上述代码便是phpmailer主要代码

只需要修改其中两行代码即可

$mail->SMTPSecure = 'ssl';  
$mail->Port       = 465;

保存测试,可以发送邮件。

似乎不只是阿里云,腾讯云,华为云,都默认禁用了25端口,如果遇到相似问题,大家可以照上述方法实验一下。