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发送邮件的主要内容,如果未能解决你的问题,请参考以下文章

PHP实现查看邮件是否被阅读

PHP必用代码片段

[moka摘录]查看邮件是否已被阅读

如果在php网页加邮件发送代码

Javascript - 使用 HTML 片段通过电子邮件发送 JSON 输出

用于打开 Outlook 并发送电子邮件的 PHP 代码