| phpmailer使用gmail账号发送邮件 | |
| 作者:成功就要付出 日期:2008-7-17 14:12:00 |
| 授权方式:署名,非商业用途,保持一致,转载时请务必以超链接(http://www.fwolf.com/blog/post/155)的形式标明文章原始出处和作者信息及本声明。
phpmailer(现在的版本是1.73)是一个很好用的工具,可以很方便的使用php语言发送邮件,支持smtp及验证,我们一直都用它。 但是,由于gmail的smtp采用了ssl连接: Outgoing Mail (SMTP) Server - requires TLS: smtp.gmail.com (use authentication)
Use Authentication: Yes Use STARTTLS: Yes (some clients call this SSL) Port: 465 or 587 使用phpmailer就无法正常连接gmail的发信服务器了,并且这个问题一直没有得到phpmailer的官方解决,不过在sf.net上面的讨论里倒是找到了一点资料,采用下面这种方法就可以连接gmail了。 修改class.smtp.php,第101行,把 $this->smtp_conn = fsockopen($host, # the host of the server
改成 $this->smtp_conn = fsockopen(’ssl://’ . $host, # the host of the server
这样就可以了,就是指定使用ssl协议连接主机,当然php的openssl模块必须打开: extension=php_openssl.dll
但是这样就不能使用非ssl的主机了,我也不像在include目录下面放两份phpmailer,于是,又琢磨出了一种更好的方式: 打开class.phpmailer.php,在大概543行附近,函数SmtpConnect()中,找到: $this->smtp->do_debug = $this->SMTPDebug;
$hosts = explode(”;”, $this->Host); $index = 0; $connection = ($this->smtp->Connected()); // Retry while there is no connection 这一段的部分功能就是,如果你输入的主机名中带有端口号,自动的识别出来,设想虽好,但就是这部分让我们无法直接在调用的时候使用ssl格式的主机名,因为“ssl://xxx”的形式会被误认为是主机:端口号的形式,另外端口号一般都比较固定,我们手工设置好了,也不必一定要和主机一起赋值,所以在上面的代码后面添加: //Modify by Fwolf @ 2006-4-14, to enable ssl mail connection
$host = $this->Host; $port = $this->Port; 就可以了,使用正常smtp主机的时候,用法不变,使用gmail的时候,使用ssl://smtp.gmail.com作为主机名就可以了,唯一稍微麻烦一些的就是端口需要手工指定——其实也不麻烦。 按照上面的配置更改后,使用gmail账号发送邮件时还会有一条警告信息: Warning: fgets(): SSL: fatal protocol error in H:\php_includes\phpmailer_ssl\cla
ss.smtp.php on line 1024 这各警告信息在php的帮助里面有,好像是在使用ssl连接的时候,读文件读到文件尾的时候出现的问题,需要手工屏蔽,或者人为控制读的长度,我们用最简单的方式禁止警告信息显示就可以了,找到class.smtp.php的1024行,在fgets($this->smtp_conn,515)函数前面加上个@就可以了。 下面是一个完整的使用phpmailer发送邮件的函数: function send_mail($to_address, $to_name ,$subject, $body, $attach = ”)
{ //使用phpmailer发送邮件 require_once(”phpmailer/class.phpmailer.php”); $mail = new PHPMailer(); $mail->IsSMTP(); // set mailer to use SMTP $mail->CharSet = ‘utf-8′; $mail->Encoding = ‘base64′; $mail->From = ‘fwolf.mailagent@gmail.com’; $mail->FromName = ‘Fwolf’; //$mail->Sender = ‘fwolf.mailagent@gmail.com’; //$mail->ConfirmReadingTo = ‘fwolf.mailagent@gmail.com’; //回执? $mail->Host = ’ssl://smtp.gmail.com’; $mail->>ddAddress($to_address, $to_name); if(!$mail->Send()) update @ 2006-11-3感谢RainChen提供的fgets出错提示的更好解决办法(位置大概在class.smtp.php的1024行): fgets($this->smtp_conn,515)
改为: !feof($this->smtp_conn) && $str = fgets($this->smtp_conn,515)
这样的代码就规范多了,极力不提倡使用@来屏蔽错误信息。 |
- 上一篇:access数据库规格问题
- 下一篇:顶级域名
发表评论:
1.请遵守《中国互联网行业自律条款》及中华人民共和国其他各项有关法律法规。
2.严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
3.用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
4.本站管理员有权保留或删除评论内容。
评论内容只代表网友个人观点,与本网站立场无关。