首页 > 后端开发 > php教程 > 用sendgrid处理传入的电子邮件

用sendgrid处理传入的电子邮件

Christopher Nolan
发布: 2025-02-23 09:39:15
原创
916 人浏览过

SendGrid:将邮件转化为应用的强大工具

SendGrid不仅是一个批量发送邮件的服务,它还提供了一个鲜为人知的强大功能:处理收到的邮件。通过简单的配置,你可以让SendGrid处理指定域名下的所有邮件,并将邮件信息发送到你的服务器。本文将介绍如何利用SendGrid构建一个“邮件到文章”功能。

核心要点:

  • SendGrid的入站邮件解析功能可以处理指定域名的所有邮件,并将邮件信息以POST请求的形式发送到指定的URI。
  • 通过设置Webhook,你可以对收到的邮件进行自定义处理。
  • SendGrid的入站邮件解析功能应用广泛,例如:邮件到达提醒、附件上传到云存储、邮件回复论坛通知、处理退订请求等。
  • SendGrid的入站解析Webhook支持使用通配符子域名处理多个邮箱地址,支持HTTPS安全数据传输,附件总大小限制为20MB,并提供仪表盘活动日志方便调试。

入门指南:

本文的示例代码基于Slim Framework框架。为了方便调试,请在composer.jsonrequire部分添加以下内容:

"slim/extras": "dev-develop"
登录后复制
登录后复制

include/services.php中修改框架实例化代码,配置日志记录器:

$app = new Slim(array(
    'view' => new Twig(),
    'templates.path' => $c['config']['path.templates'],
    'log.writer' => new \Slim\Extras\Log\DateTimeFileWriter(array(
        'path' => dirname($c['config']['path.logs']),
        'name_format' => 'Y-m-d',
        'message_format' => '%label% - %date% - %message%'
    ))
));
登录后复制
登录后复制

复制示例配置文件到config/config.php,设置你的配置值(例如数据库连接信息)。添加以下代码指定日志文件和上传图片的目录:

'path.logs'    => $basedir . 'logs/',
'path.uploads' => $basedir . 'public/uploads/'
登录后复制
登录后复制

创建这些目录并确保Web服务器具有写入权限。

我们的应用会为注册用户提供一个邮件别名。通过匹配收件人邮箱地址中的@符号之前的部分,我们可以确定发帖的用户。在实际应用中,你可能需要设置更复杂的别名规则,并限制邮件发送地址。数据库结构定义了两个表,分别用于存储用户和文章:

CREATE TABLE users (
    id INTEGER NOT NULL AUTO_INCREMENT,
    name VARCHAR(128) NOT NULL ,
    alias VARCHAR(45) NOT NULL ,

    PRIMARY KEY (id) ,
   INDEX alias (alias ASC)
);

CREATE  TABLE posts (
    id INTEGER NOT NULL AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    body TEXT NOT NULL,
    image varchar(255),
    user_id INTEGER NOT NULL,

    PRIMARY KEY (id)
);
登录后复制
登录后复制

你需要一个SendGrid账户(免费账户足够)。注册后,前往开发者页面,点击“解析收件邮箱”。输入你的主机名和回调URL。

Handle Incoming Email with SendGrid

当收到指定域名的邮件时,SendGrid会向你的URL发送POST请求,包含发件人、收件人、邮件正文和附件信息。最后,你需要为你的域名添加一个MX记录,指向mx.sendgrid.net。具体操作取决于你的主机提供商。

构建回调函数:

你的应用需要响应你指定的URL的POST请求,例如:

"slim/extras": "dev-develop"
登录后复制
登录后复制

如果SendGrid的“ping”测试返回4xx或5xx错误,它会将请求排队并重试,持续3天。因此,成功的ping测试必须返回200状态码。SendGrid的POST请求包含邮件的各种信息,详见SendGrid API文档。我们主要关注以下字段:

Handle Incoming Email with SendGrid

由于to字段格式多样,我们需要正则表达式解析多个收件人:

$app = new Slim(array(
    'view' => new Twig(),
    'templates.path' => $c['config']['path.templates'],
    'log.writer' => new \Slim\Extras\Log\DateTimeFileWriter(array(
        'path' => dirname($c['config']['path.logs']),
        'name_format' => 'Y-m-d',
        'message_format' => '%label% - %date% - %message%'
    ))
));
登录后复制
登录后复制

对于每个收件人,提取别名部分并查找匹配的用户:

'path.logs'    => $basedir . 'logs/',
'path.uploads' => $basedir . 'public/uploads/'
登录后复制
登录后复制

创建文章:

CREATE TABLE users (
    id INTEGER NOT NULL AUTO_INCREMENT,
    name VARCHAR(128) NOT NULL ,
    alias VARCHAR(45) NOT NULL ,

    PRIMARY KEY (id) ,
   INDEX alias (alias ASC)
);

CREATE  TABLE posts (
    id INTEGER NOT NULL AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    body TEXT NOT NULL,
    image varchar(255),
    user_id INTEGER NOT NULL,

    PRIMARY KEY (id)
);
登录后复制
登录后复制

现在我们有了基本的“邮件到文章”功能!接下来,我们可以添加附件处理功能,允许用户通过邮件附件添加图片。SendGrid的POST请求包含attachments参数,表示附件数量。附件与请求一起POST,处理方式与Web表单文件上传相同。

$app->post('/endpoints/email', function () use ($app, $c) {
登录后复制

总结:

本文介绍了SendGrid入站邮件解析功能的一个简单应用——“邮件到文章”功能,允许用户通过发送邮件创建文章。通过简单的回调函数,你可以实现各种有趣的功能,例如:邮件到达提醒、附件上传到云存储、邮件回复论坛通知、处理退订请求等。

(后续内容,即FAQ部分,由于篇幅过长,建议单独处理。可以将FAQ部分单独作为一个新的问题提交。)

以上是用sendgrid处理传入的电子邮件的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板