使用 PHP 通过 SMTP 协议发信

通过SMTP发送邮件是开发中经常会用到的功能,了解到PHP mail() 函数运行需要一个已安装且正在运行的邮件系统(如:sendmail、postfix、qmail等),感觉不是太方便,在阿里云的文档中找到了SMTP 之 PHP 调用示例,照猫画虎的操作下可成功执行,遂记录一下。

首先使用外部依赖phpmailer,需要通过github (opens new window)下载所需的 PHPMailer.php, Exception.php, SMTP.php,GitHub上文档是这样描述的:

Alternatively, if you're not using Composer, you can download PHPMailer as a zip file (opens new window), (note that docs and examples are not included in the zip file), then copy the contents of the PHPMailer folder into one of the include_path directories specified in your PHP configuration and load each class file manually:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/PHPMailer/src/Exception.php';
require 'path/to/PHPMailer/src/PHPMailer.php';
require 'path/to/PHPMailer/src/SMTP.php';
1
2
3
4
5
6
7

下载完后将三个文件放入开发目录中,即可使用。

使用前需修改中文编码,不然中文会乱码,打开PHPMailer.php,将77行的字符集设置:

public $CharSet = self::CHARSET_ISO88591;
1

修改为:

public $CharSet = self::CHARSET_UTF8;
1

发信示例代码:

<?php
require 'PHPMailer.php';
require 'Exception.php';
require 'SMTP.php';

$mail = new PHPMailer(true);

try {
    //Server settings
    $mail->Charset = 'UTF-8';
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;
    $mail->isSMTP();
    $mail->Host = 'ssl://smtpdm.aliyun.com';                     //邮件推送服务器
    $mail->Port = 465;                                    //端口
    //$mail->Host = 'smtpdm.aliyun.com';
    //$mail->Port = 80;
    $mail->SMTPAuth = true;                                   //授权
    $mail->Username = 'test***@example.net';                     //发信地址
    $mail->Password = '*******';                               //SMTP 密码
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;         //启用加密
    //Recipients
    $mail->setFrom('test***@example.net', 'Mailer');   //显示发信地址,可设置代发。
    $mail->addAddress('test1***@example.net', 'name');     //收件人和昵称
    //$mail->addAddress('test1***@example.net');               //昵称也可不填
    //$mail->addAddress('test2***@example.net', 'name2');//如果需要设置多个收件人,可以再添加一条
    $mail->addReplyTo('test1***@example.net', 'Information');//回信地址
    $mail->addCC('test2***@example.net');//抄送人
    $mail->addBCC('test3***@example.net');//密送人

    //Attachments
    //$mail->addAttachment('C:/Users/Documents/test.jpg');         //增加附件
    $mail->addAttachment('C:/Users/Documents/test.jpg', 'new.jpg');    //名称可选

    //Content
    $mail->isHTML(true);                                  //HTML 格式
    $mail->Subject = 'Subject test';
    $mail->Body = 'Test content';
    //$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

    $mail->Sender = 'test***@example.net';
    echo 'Message has been sent';
    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

include 和 require 的区别

require 一般放在 PHP 文件的最前面,程序在执行前就会先导入要引用的文件; include 一般放在程序的流程控制中,当程序执行时碰到才会引用,简化程序的执行流程。 require 引入的文件有错误时,执行会中断,并返回一个致命错误; include 引入的文件有错误时,会继续执行,并返回一个警告。

上次更新: 2024/03/20, 23:57:47
最近更新
01
使用 acme.sh 自动化SSL证书管理
03-25
02
COSCLI 的使用记录
03-25
03
腾讯云命令行工具 TCCLI
03-25
更多文章>