php发送邮件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php发送邮件相关的知识,希望对你有一定的参考价值。
背景:
由于网站登录是以邮箱号登录,加上让网站逼格高一点等等原因。必不可少的就是邮件验证环节,由此,标题应运而生。接下来说明发邮件过程中的坎坷。
故事开始:
本身用的是CI框架,其中自带了一个email的类。心想这下方便了,用起来!
<?php $this->load->library(‘email‘); $config = array(); $config[‘protocol‘] = ‘smtp‘; $config[‘smtp_host‘] = ‘smtp.qq.com‘; $config[‘smtp_user‘] = ‘30*****[email protected]‘; $config[‘smtp_pass‘] = ‘ieq*******da‘; $config[‘smtp_port‘] = ‘25‘; $config[‘charset‘] = ‘utf-8‘; $config[‘wordwrap‘] = TRUE; $config[‘mailtype‘] = ‘html‘; //$config[‘smtp_crypto‘] = ‘tls‘; $this->email->initialize($config); $this->email->from(‘30*****[email protected]‘,‘boom‘); $this->email->to(‘114*****[email protected]‘); $this->email->subject(‘TEST EMAIL‘); $this->email->message(‘这是来自zqiy的消息‘); ?>
以上是使用CI自带类email的代码。原本是直接使用QQ密码,试了好几次发现并不能认证成功,百度之后,才明白要开启POP3/SMTP才能使用,因此换了一个独立密码。本以为这样就没问题了?结果还是不行。又开始了一轮百度,找到了一篇关于SMTP认证的文章。于是我照着上面尝试了一下:
telnet smtp.qq.com 25 EHLO qq 250-smtp.qq.com 250-PIPELINING 250-SIZE 73400320 250-STARTTLS 250-AUTH LOGIN PLAIN 250-AUTH=LOGIN 250-MAILCOMPRESS 250 8BITMIME auth login 334 VXNlcm5hbWU6 我的账号(base64加密后的)
当我输入账号的时候他就会报一个错误:530 Error: A secure connection is requiered(such as ssl).这让我有点醉醉哒。说实话对这东西,不是特别懂。于是我又百度了一圈,看到qq邮件服务器有多种:
接收邮件服务器:pop.exmail.qq.com,使用SSL,端口号995
发送邮件服务器:smtp.exmail.qq.com,使用SSL,端口号465或587
于是修改了端口号。首先尝试465,发现它一输点东西就弹出来了,我有点蒙逼。我再搜一圈,发现没什么相关介绍。但是有写到:
465端口是SSL/TLS通讯协议的 内容一开始就被保护起来了 是看不到原文的。
587端口是STARTTLS协议的 属于TLS通讯协议 只是他是在STARTTLS命令执行后才对之后的原文进行保护的。
(以上内容参考http://blog.163.com/yang_jianli/blog/static/161990006201071913841594/)
于是尝试了587端口。果然,认证成功了。于是高高兴兴去修改了CI里边的参数
<?php $config[‘smtp_port‘] = 587; $config[‘smtp_crypto‘] = ‘tls‘; ?>
结果。。。。还是特么的不行,报错:stream_socket_enable_crypto(): this stream does not support SSL/crypto
然后看到如果采用ssl/tls加密服务需要把php.ini的拓展php_openssl.dll打开,好的,再试一次!呵呵,然并卵。不抱错了,还是显示无法认证。我想应该还是我对email类太不熟悉的缘故。(全是泪)
心碎的我又查了一查,发现用的多的还是163的服务器,而且phpmailer发邮件十分好用。默默地下好了,默默地申请了个163账号。说一句闲话,163不让用网页注册得下APP这真心有点流氓。
开启IMAP服务开启POP3服务开启SMTP服务。
好了,万事俱备,用起来!
<?php require_once(‘class.phpmailer.php‘); $mail = new PHPMailer(); $mail->IsSMTP(); $mail->CharSet=‘UTF-8‘; $mail->SMTPAuth = true; $mail->Port = 25; $mail->Host = ‘smtp.163.com‘; $mail->Username = ‘v****[email protected]‘; $mail->Password = ‘******‘; $mail->From = ‘v*****[email protected]‘; $mail->FromName = ‘v****k‘; $to = ‘30*****[email protected]‘; $mail->AddAddress($to); $mail->Subject = ‘用户激活‘; $mail->Body = "您已在我们网站注册,点击以下地址即可激活:<br><a href=‘#‘ target=‘_blank‘>#</a>"; $mail->IsHTML(true); if(!$mail->Send()) { echo "邮件发送失败. <p>"."错误原因: " . $mail->ErrorInfo; exit; ?>
于是乎,我在我的QQ邮箱的垃圾邮件里看到了我发送的邮件。一遍就奏效!一种蛋疼之感在心中升起。
总结:
虽然说最后用CI的mail类还是没能实现发送邮件,但是查略资料的时候,其实也了解了不少东西,比如,telnet方式对smtp的认证流程,不同端口号所用的协议是不同的,认证过程中所需要的账号口令数据是base64加密过的,第三方邮件发送和接收是需要开启pop3/smtp/imap等服务的。
结果或许不尽人意,但是尝试解决问题的过程,也是尤其重要的。
以上是关于php发送邮件的主要内容,如果未能解决你的问题,请参考以下文章