最近公司网站后台运行了不少定时任务,为了防止 这些定时任务出现异常,加上了一个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模块,汗一个。 开启之后一切正常。。。 现在可以放心了,不管成功还是异常,都会收到邮件提醒! 自己在搭建PHP环境的时候,一些常用的模块还是必须要开启的。 比如php 5.3以上的mb-string、openssl、curl、mysql、mysqli、pdo_mysql等。 有些特别的情况下,可以自己监控一些特别的东西,定时发邮件,PHP来处理也是蛮方便的。