网站发送邮件的"艺术"(phpMailer)

发表于 php, 干货, 技术原理, 程序语言 2017-01-02 阅读数: 214

https://www.huanxiangke.com
网站上的“联系我”板块使用的是一个自动发送邮件的功能。之前使用的是PHP的MAIL函数,当时没有意识到vultr(我的服务器商)封掉了25端口。所以如果之前大家给我发了邮件,可能要重新发了哈,抱歉。

现在使用的是PHPMailer这个强大的类。配合SMTP服务器。而且它还能够发送附件。这里不需要太过于纠结SMTP是什么,我们只需要知道它是一种邮件传输协议,SMTP服务器其实就是发信的服务器,如果你是QQ邮箱,那么就是smtp.qq.com如果你不是QQ邮箱,也可以在那个邮箱的官方文档中找到。

PHPMailer:https://github.com/PHPMailer/PHPMailer

官方说明文档如下:

<?php

require 'PHPMailerAutoload.php';

$mail = new PHPMailer;

//$mail->SMTPDebug = 3;                               // Enable verbose debug output

$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 TLS encryption, `ssl` also accepted

$mail->Port = 587;                                    // TCP port to connect to

$mail->setFrom('from@example.com', '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->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';

}

这里实际上我所需要的参数只有几个,SMTP的参数:"Host","SMTPAuth","Username","Password","SMTPSecure","Port"自然是必须的,但是下面的参数实际上我只用到了几个:"SetFrom","AddAddress","isHTML","Subject","body".

首先先下载PHPMailer。解压后得到下图的这些文件。看起来很多,实际上我们只需要这三个文件。把这三个文件拖到你网页目录下面。

网站发送邮件 phpMailer

然后我们要设置SMTP服务器,就是发送邮件的账号。QQ邮箱在设置里面就可以设置:

网站发送邮件 phpMailer

记住账号就是你的用户名。密码就是开启服务时得到的授权码。

接下来就可以开始写代码了:

<?php

require 'PHPMailerAutoload.php';//包含之前存入目录的类

$mail = new PHPMailer;

$mail ->isSMTP();//表示使用的SMTP协议

Host就是SMTP服务器,我用的是QQ邮箱,所以是smtp.qq.com(其他邮箱要看官方文档):

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

要进行身份验证:

$mail->SMTPAuth = true;

其他的设置:

$mail->Username = '之前使用了SMTP的用户名(邮箱)';

$mail->Password = '之前得到的授权码';

$mail->SMTPSecure = 'ssl';//加密方式ssl

$mail->Port = 465; //QQ邮箱支持465或者587端口

邮件的设置:

$mail->setFrom('发件人邮箱(自然是你的账号)', '发件人名字');

$mail->AddAddress('发送到哪个邮箱');

$mail->isHTML(true); //邮件的格式是HTML

邮件的信息设置:

$mail->Subject =  "你的主题" //$_POST['subject']

$mail->Body    =  "主体内容"

//"信息:".$_POST['message'].'</b>'."   邮箱:".$_POST['email'].'</b>'."   姓名:".$_POST['name'].'</b>';

如果你是从网站里post过来的参数,就要用$_POST['名字']接受参数,如图中注释部分。

html的post举例:

<form method="post" action="1.php">

    <input name=”email“ type="email" id="email" placeholder="您的邮箱是..."  required>

</form>

    if(!$mail->send()) {

    echo 'Message could not be sent.';

    echo 'Mailer Error: ' . $mail->ErrorInfo;

    } else {

    ;//echo 'Message has been sent';

    ?><script>alert("发送成功");</script>

    <script>window.location = "/";</script>

<?php

}

?>

发送成功后弹窗(发送成功),不成功显示不成功的原因。弹窗效果:

最后这部分看起来复杂,其实还是比较简单的。我们可以把它分成两部分看,一个是php部分:

if(!$mail->send()) {

    echo 'Message could not be sent.';

    echo 'Mailer Error: ' . $mail->ErrorInfo;

    } else {

    ;//echo 'Message has been sent';

}

?>

一个是JS部分:

<script>alert("发送成功");</script>

<script>window.location = "/";</script>

alert就是弹出显示发送成功的窗口,如上图所示。window.location = "/";就是跳转回主页面,因为我使用了post和action,实际上它会跳转到action的这个php文件里执行php语句。然后我需要它回到主页,于是就使用这条js语句,它会自动跳转到双引号内的文件,由于是主页面,所以一个/就可以了。

然后在php文件里写JS和HTML代码,是需要跳出<?php 和 ?>的,所以那条语句才会显得很冗杂。

欢迎关注微信公众号:幻象客

幻象客 二维码

Add comment