有一套自研的企业站系统,后端采用了LUMEN做API接口,客户需要集成邮件转发模块,目前国内有邮件转发业务的云厂商有许多,阿里云的邮件转发业务是可以按量付费,1000封2元,也可以购买资源包,5万封90元但有6个月有效期,如果发信数量不多,直接按量付费就可以了。
飘易简单介绍下集成的流程。
阿里云支持三种发送邮件的方式:1、控制台发送邮件。2、API接口发送邮件。3、SMTP接口发送邮件。
集成到自研系统里,只能选API 或者 SMTP 接口,但是API接口目前是不支持发送附件的,因此pass掉,我们选择 SMTP 接口发送邮件。
前期准备:
1个可以添加解析记录的域名,比如 abc.com,我们要使用 email.abc.com 这样的二级域名来做发信域名(这里的 email 可自定义)。
1、阿里云账号开通“邮件推送产品”,选择立即购买购买邮件推送资源包(预付费)或申请开通直接开通按量付费(后付费)。
注意:阿里云实名认证用户才可以购买和开通邮件推送产品,请确保账号已完成实名认证。
阿里云的邮件转发:https://www.aliyun.com/product/directmail
2、发信区域
选择发信区域:目前有华东、新加坡、美国和德国四个集群。
如何选择发信区域:
1、前提:不同的地域决定了数据落地的地域。如果涉及境外客户,请先咨询您公司的法务,数据在哪个区域才合规。
2、如果您的发信程序部署在境内,建议您选择华东1区域。
3、如果您的发信程序部署在境外,且收信地址境外居多,建议您使用新加坡、美国和德国集群。
4、如果您的发信程序部署在境外,且收信地址境内居多:
a)如果您的发信程序使用SMTP发信,且部署在美国或者新加坡,建议您使用华东1区域,会自动通过美国或者新加坡加速节点路由到华东1节点。
b)其他情况,建议您使用新加坡区域。
1、邮件推送控制台 - 发信域名 - 添加域名(如email.abc.com)

2、添加后,获取域名的配置信息,每一个域名的配置信息可能不同,比如:

3、拿到这些配置信息后,到域名的DNS服务商处,按照要求把这5个解析记录添加上,然后回到阿里云后台进行验证即可。
注意,上面添加的解析记录,后续不能删除,如果删除了,邮件就无法发送。
1、阿里云控制台 - 发信地址 - 添加发信地址

按照提示填写,回信地址可以不填,因为我们不用控制台和API发信,我们使用SMTP发信。发信类型:触发邮件。
2、回到发信地址列表,设置刚才的发信邮箱的 SMTP密码。
1)长度为10~20位,且必须包含数字、大写字母、小写字母。
2)至少包含2位数字、2位大写字母和2位小写字母,并且数字和字母均不能只由单一字符重复组成。
3)不能与上一次设置密码相同。
这个 SMTP 密码要记下来,后面要用到的。
使用SMTP发送邮件(不用API发送,因为API不支持附件)
https://help.aliyun.com/zh/direct-mail/smtp-php
使用 PHP 通过 SMTP 协议发信
使用外部依赖phpmailer【支持附件】,通过github下载(PHPMailer.php,Exception.php,SMTP.php):https://github.com/PHPMailer/PHPMailer 。
PHPMailer.php修改中文编码:
public $CharSet = self::CHARSET_ISO88591;
修改为:
public $CharSet = self::CHARSET_UTF8;
怎么添加依赖:
1、使用标准的 Composer 安装 PHPMailer。【不采用,因为要修改PHPMailer源码】
2、手动引入 PHPMailer,通过 Composer 自定义路径【采用】
移动文件:将 PHPMailer 的 src 目录内容放入LUMEN的 app/Libs/PHPMailer。
修改 composer.json
"autoload": {
"psr-4": {
"App\\": "app/",
"PHPMailer\\PHPMailer\\": "app/Libs/PHPMailer/" 【这里添加】
}
}将所有 PSR-4 的映射转换成 classmap(即“类名 => 绝对路径”),查询速度最快:
composer dump-autoload -o
执行该命令后,以下文件会被重新生成或更新::
vendor/autoload.php 项目入口文件。它会初始化 Composer 的加载器并引入以下映射表。
vendor/composer/autoload_psr4.php 最关键的文件。它存储了命名空间与目录的数组映射(包含你新加的 PHPMailer)。
vendor/composer/autoload_static.php 为了性能优化,Composer 会将映射关系硬编码进这个静态类中,减少数组合并的开销。
vendor/composer/autoload_classmap.php 如果你使用了 -o (优化) 参数,PHPMailer 目录下所有的 .php 文件路径都会以“类名 => 绝对路径”的形式记录在这里。如果你使用了 classmap 配置,这里会记录所有类名到具体文件路径的直接映射。
vendor/composer/autoload_files.php 如果某些库需要强制 require 全局函数文件(如 Helper.php),会记录在这里。
实际只有3个文件变化:
autoload_psr4.php、autoload_static.php、autoload_classmap.php
控制器调用实例:
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
$mail = new PHPMailer(true);// 注意这里的 true 开启了异常抛出
try {
//Server settings
$mail->CharSet = 'UTF-8';
$mail->isSMTP();
$mail->Host = $config->host;//'ssl://smtpdm.aliyun.com'; //邮件推送服务器
$mail->Port = $config->port;//465; //端口
$mail->SMTPAuth = true;//授权
$mail->Username = $config->send_email;///发信地址
$mail->Password = $config->smtp_pwd; //SMTP 密码
//Recipients
if($config->send_nickname){
$mail->setFrom($config->send_email, $config->send_nickname); //显示发信地址,可设置代发。
}else{
$mail->setFrom($config->send_email); //显示发信地址,可设置代发。
}
//若需SMTP回信,回信地址要在这里设置!
if($config->reply_email && $config->reply_nickname){
$mail->addReplyTo($config->reply_email, $config->reply_nickname);
}else if($config->reply_email && empty($config->reply_nickname)){
$mail->addReplyTo($config->send_email);
}
// 可选:如果不设置,退信会回到 setFrom 设置的地址
if($config->return_email){
$mail->Sender = $config->return_email;// 退信地址
}
// 目标邮箱
foreach ($email_arr as $email) {
$mail->addAddress($email); //昵称可不填
}
// 附件
foreach ($attachments as $attachment) {
$mail->addAttachment($attachment);
}
//Content
$mail->isHTML(true);//HTML 格式
$mail->Subject = $title;// 邮件标题
$mail->Body = $content;// 邮件内容
if($altcontent){
$mail->AltBody = $altcontent;// 不支持HTML的邮件客户端时,传递的纯文本内容
}
$res = $mail->send();// true:表示邮件已成功提交到你配置的 SMTP 服务器
// 返回
return ['errcode' => 0, 'errmsg' => 'ok', 'data' => $res];
} catch (Exception $e) {
$err = "Mailer Error: {$mail->ErrorInfo}";
return ['errcode' => -1, 'errmsg' => $err];
}具体的集成需要根据系统的不同,可自定义。