飘易博客(作者:Flymorn)
订阅《飘易博客》RSS,第一时间查看最新文章!
飘易首页 | 留言本 | 关于我 | 订阅Feed

阿里云SMTP邮件服务如何集成到系统?

Author:飘易 Source:飘易
Category:网络技术 PostTime:2026/3/19 11:31:46
正 文:

有一套自研的企业站系统,后端采用了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 集成到系统

使用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];
}

具体的集成需要根据系统的不同,可自定义。

作者:飘易
来源:飘易
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
上一篇:浏览器多标签场景:多账号同时登录网站系统如何防止串号?
下一篇:合伙企业如何自己做好零申报?不要遗漏税种!
0条评论 “阿里云SMTP邮件服务如何集成到系统?”
No Comment .
发表评论
名称(*必填)
邮件(选填)
网站(选填)

记住我,下次回复时不用重新输入个人信息
目 录
飘易搜索
最新文章
相关文章
随机文章
© 2007-2030 飘易博客 Www.Piaoyi.Org 版权所有 Sitemap