网站定时监控!phpmailer邮件发送失败提示SMTP Connect() failed解决方法

时间:14-06-20 栏目:PHP开发 作者:kyle 评论:3 点击: 17,993 次

 

最近公司网站后台运行了不少定时任务,为了防止 这些定时任务出现异常,加上了一个phpmailer的功能。

 

定时任务执行成功会发邮件提醒我。执行失败也会邮件提醒任务失败和相关的异常信息,方便及时针对错误进行快速处理。

 

大概的代码可以查phpmailer官方的文档,发邮件的功能,非常简单。

 

PHPMailer官方提供的使用php发送邮件的代码为:

<?php
require 'PHPMailerAutoload.php';

$mail = new PHPMailer;

$mail->isSMTP();                                      // Set mailer to use SMTP
$mail->Host = 'smtp1.example.com;smtp2.example.com';  // Specify main and backup SMTP servers
$mail->SMTPAuth = true;                               // Enable SMTP authentication
$mail->Username = 'user@example.com';                 // SMTP username
$mail->Password = 'secret';                           // SMTP password
$mail->SMTPSecure = 'tls';                            // Enable encryption, 'ssl' also accepted

$mail->From = 'from@example.com';
$mail->FromName = 'Mailer';
$mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
$mail->addAddress('ellen@example.com');               // Name is optional
$mail->addReplyTo('info@example.com', 'Information');
$mail->addCC('cc@example.com');
$mail->addBCC('bcc@example.com');

$mail->WordWrap = 50;                                 // Set word wrap to 50 characters
$mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name
$mail->isHTML(true);                                  // Set email format to HTML

$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent';
}

在使用的时候,要修改一下:

我使用的是QQ邮箱发送邮件,修改方法为

$mail->isSMTP();

$mail->CharSet = "utf-8"; //设置采用utf-8中文编码(内容不会乱码)

$mail->Host = "smtp.qq.com";

$mail->Port = 465;

$mail->SMTPSecure = 'ssl';

$mail->SMTPAuth = true;

然后写上帐号密码就可以发送邮件了。

 

遇到 的问题是本地正常发送邮件了,传到一台临时服务器出错了,传到线上正常的。为了找到原因。仔细做了检查。

提示信息为:SMTP Connect() failed。本地正常,临时服务器不正常,应该与代码无关,与PHP环境或者Apache环境有关系。

网上流传的解决方案是:

linux 下 用phpmailer类smtp发送邮件始终不成功,
开启DEBUG提示:ERROR: Failed to connect to server: (0)

SMTP Connect() failed

===============
在windows下测试是完全没有问题的,传到网上的linux的VPS或者虚拟主机发送邮件不行,开启debug后,出现的错误是这样的,我在windows下测试这个smtp服务器是可以连接的,到了Linux就不行呢?
网上有很多解决方案,第一是防火墙禁止端口的说法,但是否决,我本地有一台装linux用作本地测试用的服务器,我传到本地,同样不能发送,也是这样的错误。不过这里我关闭了selinux,iptables。都还是不行。证明应该不是端口的问题。
解决方案二:php的scoktes这个没开启。我用phpinfo查看了下,绝对的没问题,scoktes这个选项是 开启的。
方案三:用pfsockopen 函数替换 fsockopen函数 ,有的说替换以上的函数可以,但是测试后还是不行

CSDN上某人说解决过,但是又不留方法。如果是我,我肯定留下方案。

研究了很多终于知道了,原来是服务器的php.ini 禁用了fsockopen函数。
你可以打开php.ini。有两个地方可能禁用此函数:
1、 allow_url_fopen = On选项是否为ON,为OFF时函数将被禁用
2、查看 disable_functions = ..........后有没有 fsockopen。如果有去掉

 

检查之后发现并不是这个问题。

仔细思索才发现我们的SMTP使用的是SSL登陆到QQ的SMTP服务器。

打开测试PHP环境,发现并没有开启php_openssl模块,汗一个。

开启之后一切正常。。。

1

现在可以放心了,不管成功还是异常,都会收到邮件提醒!

自己在搭建PHP环境的时候,一些常用的模块还是必须要开启的。

比如php 5.3以上的mb-string、openssl、curl、mysql、mysqli、pdo_mysql等。

 

有些特别的情况下,可以自己监控一些特别的东西,定时发邮件,PHP来处理也是蛮方便的。

成都SEO小五嚎2句: 本文是(成都SEO小五)辛苦弄出来的,转载成都SEO小五原创的请保留链接: 网站定时监控!phpmailer邮件发送失败提示SMTP Connect() failed解决方法,3Q

网站定时监控!phpmailer邮件发送失败提示SMTP Connect() failed解决方法:目前有3 条留言,牛逼吧!

  1. 板凳
    歌词网:

    装了监控,网站打得开时却从来没有看过。

    2014-07-18 11:55 pm [回复]
  2. 沙发
    天真吴邪:

    博主你好,我的也是SMTP Connect() failed的错误,你说的那个测试PHP环境,怎么开启开启php_openssl模块呀?

    2014-07-31 9:51 am [回复]
    • kyle:

      一般是打开php.ini配置文件把前面的注释去掉就可以了。

      2014-08-15 6:00 pm [回复]

来给哥评论评论


------====== 小五公告 ======------
成都SEO小五,专注成都搜索引擎优化。
小五善长站内外优化,C#、PHP开发,中英文SEO,Google中英文和百度优化技术。欢迎群内交流。伸手党请绕路,求资源的请绕开,求问题解答的请进群内交流。开放了一个QQ交流群:160750032。加入验证时请标注任何SEO相交字眼。友情链接直接Q我,收录正常,内容大部份原创、SEO或者程序开发、网络营销、线上推广等相关行业即可。

常用工具

赞助广告

来看过哥的人