首页 > 解决方案 > Sendgrid 解析不起作用,json 始终为空

问题描述

我正在尝试解析发送到域的电子邮件,然后通过 sendgrid 入站解析 webhook 将其转储到数据库。为此,我参考https://sendgrid.com/docs/for-developers/parsing-email/setting-up-the-inbound-parse-webhook/link

到目前为止我做了什么:

1)在域中创建一个mx记录:

email.domainname.com.   14400   IN  MX  Priority: 10
                                        Destination: mx.sendgrid.net

2)Sendgrid:设置->入站解析->添加主机和url。它要求我先验证域。所以,我按照它的要求做了

//subdomain - domain
email domainname.com
//checked default whitelabel and automated security is on

然后成功验证了域。3)最后,添加主机和目标网址

//subdomain - domain
empty domainname.com
//destination url
http://www.domainname.com/jin/parse.json
//checked both options (check for spam and post raw data)

现在,每当我向它发送电子邮件时,info@domainname.com它都不会在parse.json文件中写入任何数据。我在正确的方向吗?到目前为止,我假设数据将被写入该 parse.json 文件。或者我是否需要在某个地方的 php 中编写额外的代码来捕捉它?请让我知道我错过了什么。任何有用的链接或任何方向来使它工作。

更新:

看起来我开始接收到所需目的地的发布数据,但不知道如何解析此电子邮件部分:


"email":"Received: by mx0129p1mdw1.sendgrid.net with SMTP id eHtBZW56Gk Sat, 16 Feb 2019 06:33:24 +0000 (UTC)\nReceived: from mail-ed1-f48.google.com (mail-ed1-f48.google.com [209.85.208.48]) by mx0129p1mdw1.sendgrid.net (Postfix) with ESMTPS id 9791F8664E2 for <email@domain.com>; Sat, 16 Feb 2019 06:33:24 +0000 (UTC)\nReceived: by mail-ed1-f48.google.com with SMTP id h58so9639427edb.5 for <email@domain.com>; Fri, 15 Feb 2019 22:33:24 -0800 (PST)\nDKIM-Signature: v=1; a=rsa-sha256; c=relaxed\/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=u7geNXNTSgSScusvNgz8ieJB7\/U4yjCfRB1gcO3nu4w=; b=XBkSHrHfxFUxG2oLm1btnV1ReETBlzSB5+qsRsEDRXjyCnG37jKWyguEnzvfy4BFqr pBpINHNBItlxBsrOb2YMEWfFo9pXGpUJIGUsGG6NbXiNARItV96EpmFL34e51myWm39O DyOX0Dsk9sYJxwXthELcm9ey91rZvOHUpb\/hi74Fo7O\/IPZiSvBnlpT+ekBqy3wPguuq 7GipFYWQpym\/4YPsFeJjDHI0LfwJHrKTz7gQxi93e7saRPS4bpJmoG73CrpHuckZDIYc hZcQy2i\/ZJRP7RB\/iwgVWN8lKr66vY8od6YuN1LgXzRKCKEva6+KRDmnefZeXoXuq0Q3 fcaQ==\nX-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed\/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=u7geNXNTSgSScusvNgz8ieJB7\/U4yjCfRB1gcO3nu4w=; b=H1rtTSirT9cm5PUZbn+dTbvkzA7bTighuUk6TMB3YAJEzRmU0UdopwaadGeEDnYfFM eJEt4HQ2R0RFwsqIbuV4wH2mKI2+tgjnVt4IxabyjGZFqO+F\/AG0LO8jKENQ6YfUhFdU j2JtlAR0C8eviUslAJsd6qcQh7U0VL3ZHDgCjiwDywAn56iinIEcAXEmwvp0Eae4EPET 1chJgpa2mZvmr4XQLGOPzcQkiF8sU3V3GtDQ34iT8HXx0eW1fg4VknSJV6X7uCqD9v33 VWDUyKGkRhbPZFwOmcEN9x0y94i2C8i+AZySQpTWdFHk46GxChpTjo9v7ndvpC4bi+Iy lteg==\nX-Gm-Message-State: AHQUAubsqSNqLHwm0GRRSzhRktzsmb5g2r3Ych6v15dNuFGIX7KkqvjN 5MDlXdyoY119vrCRn95FmmT6mVHp+ZJCV9R1rHotvA==\nX-Google-Smtp-Source: AHgI3IY2AJhyYFw7IzYhufYBq6sv3ckH36J1fox71nzUqqSmqmDOEUJrD6qUTWUSCOk9QxT3FyhGClTjzBmHWLNS21E=\nX-Received: by 2002:a50:98c5:: with SMTP id j63mr10306468edb.273.1550298803271; Fri, 15 Feb 2019 22:33:23 -0800 (PST)\nMIME-Version: 1.0\nFrom: Jon Doe <sender@gmail.com>\nDate: Sat, 16 Feb 2019 12:18:10 +0545\nMessage-ID: <CACX9xt=O4jQDJ8AWcUVxLti=gwFipaYV9NV7hpGQOkZx6FfYjQ@mail.gmail.com>\nSubject: Test Header\nTo: email@domain.com\nContent-Type: multipart\/alternative; boundary=\"00000000000076fcf90581fd11c8\"\n\n--00000000000076fcf90581fd11c8\nContent-Type: text\/plain; charset=\"UTF-8\"\n\nTest Message\n\n--00000000000076fcf90581fd11c8\nContent-Type: text\/html; charset=\"UTF-8\"\n\n<div dir=\"ltr\">Test Message<\/div>\n\n--00000000000076fcf90581fd11c8--\n",

标签: phpemailparsingsendgrid

解决方案


我最近(过去几个月)设置了我们自己的入站解析,需要处理的重要注意事项是正确的 MX 设置:

在设置您的 MX 记录时,它是指定您的电子邮件将使用的域名。如果您希望收到来自 info@domainname.com 的电子邮件,那么您的 MX 记录需要显示为 domainname.com(而不是 mail.domainname.com)。

注意 - 您的 MX 记录的其余部分显示正确。

您可以使用过去一直被证明很有帮助的 Web Api 测试工具来测试帖子是否正常工作:https ://requestbin.fullcontact.com/ 。

当你使用这个工具时(它会为你提供你自己独特的 URL 来发帖),看看你是否可以在帖子的正文中传递一个基本的字符串。如果该工具显示您的帖子以及您传递的字符串,那么您知道您的帖子正在运行。这是我诊断帖子失败的第一步。一旦这个工作正常,您就可以看到所有的发布数据(包括标题、参数和发布的数据),然后弄清楚如何让其余的工作变得相对简单。让我们知道这是怎么回事。

编辑(2/16/19): 关于如何验证您的 Web API 是否正在接收 Inbound Parse 帖子以及它是否能够解析数据的建议方法:

第一个建议:

  1. 创建将接收 Inbound Parse 帖子的 Web API PHP 页面(例如 myPhpPageToReceiveInboundParse.php。)

  2. 为入站解析主机向 SendGrid 提供您的 Web API URL。根据上面的示例,您的 Web API URL 将是:https://yourDomain.com/myPhpPageToReceiveInboundParse.php

  3. 注意:为了使这个示例尽可能简单,不要检查 SendGrid 入站解析“附加选项”(例如,不要检查“检查传入电子邮件是否有垃圾邮件”或“发布原始的完整 MIME 消息”)。

  4. 为您新创建的 Web API 页面复制/粘贴此代码:

    $url = 'http://requestbin.fullcontact.com/xxxxxxxx';
    $myvars = 'myvar1=' . $to . '&myvar2=' . $from. '&myvar3=' . $subject . '&myvar4=' . $body;
    
    $ch = curl_init( $url );
    curl_setopt( $ch, CURLOPT_POST, 1);
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $myvars);
    
    $response = curl_exec( $ch );
    
  5. 注意:在上面的代码中,你需要用你自己的唯一标识符(在“xxxxxxxx”中)替换你的requestbin URL:$url =' http : //requestbin.fullcontact.com/xxxxxxxx '; (例如http://requestbin.fullcontact.com/123a4b56,假设您的唯一标识符是“123a4b56”)。

  6. 给自己发一封电子邮件。请记住使用您在 SendGrid 中设置入站解析时选择的“接收域”发送它。(例如 test@yourDomain.com)。

  7. 检查您的 requestbin 帖子(例如http://requestbin.fullcontact.com/123a4b56?inspect

结果:您应该在 requestbin 中的 FORM/POST PARAMETERS 下看到 $myvars 字段。

如果您看到这一点,您就知道您的 Web API 页面正在接收来自 SendGrid 的入站解析帖子,并且您能够解析来自 SendGrid 的数据。

第二个建议: 查看 SendGrid 文档中建议的 PHP 代码: https ://sendgrid.com/docs/for-developers/tracking-events/php-code-example/ 。这将有助于指导您为 Web API 页面编写的代码。

====== 编辑结束(2/16/19)

看看这是否能解决问题,如果没有,请提供与您正在设置 Web api 相关的其他设置信息。否则,您应该开始看到正在接收的数据。祝你好运。


推荐阅读