由实时 Salesforce 数据驱动的互动邮件

Salesforce 对服务器到服务器的集成使用签名的 JWT 进行认证,而不是密码,也不是会悄悄过期的刷新令牌。MailInApp 的 API 数据源原生支持这套流程:用一个连接应用(Connected App)的证书和私钥登录,运行一次 SOQL 查询,再把返回的行直接绑定到一个 KPI 计分卡或图表模块——每次发送都是由真实、当下的数字组成的管道摘要,而不是粘贴进邮件里的一张截图。

主题

Your pipeline this week

Salesforce 对服务器到服务器的集成使用签名的 JWT 进行认证,而不是密码——MailInApp 的 API 数据源原生支持这套流程。只需连接一次,一个 KPI 计分卡或图表模块就能直接绑定到实时的 Opportunity、Account 或 Contact 行,不需要照看刷新令牌,也不需要在每次发送前重新导出 CSV。

大多数「每周管道」邮件都是一份报表的截图,一旦有人粘贴进去就已经过时。把图表模块直接绑定到一个由 Salesforce 支撑的数据源,意味着模块自己的数字来自一次真实的 SOQL 查询——而一次定期发送每次都会重新运行这个查询,所以周一的摘要真正反映的是周一的管道情况。

连接是如何工作的

MailInApp

用你连接应用(Connected App)的私钥签署一个 JWT

Salesforce 令牌端点

验证签名,返回一个访问令牌

Salesforce REST API

运行你的 SOQL 查询,以 Bearer 令牌认证

你的邮件

KPI 计分卡与图表模块实时绑定到这些行

每一步都在每次发送时于服务器端完成。密码从不会被发送,也没有刷新令牌——过期的令牌通过签署一个新的断言来替换。

这正是 Salesforce 自己为其服务器到服务器集成所记录的同一套 JWT Bearer 流程,接入的是 MailInApp 现有的 OAuth2 认证模式(用于 API 数据源),而不是一个专门为 Salesforce 定制的集成。

只需设置一次连接应用

在 Salesforce Setup 中,创建一个连接应用,启用 OAuth settings,并在Use digital signatures 下上传一个自签名证书——证书交给 Salesforce,配套的 RSA 私钥交给 MailInApp。将Permitted Users 设置为Admin approved users are pre-authorized,正是这一项设置让这次交换变成非交互式的:不存在需要一个脚本去点击的同意页面。记下该连接应用的Consumer Key以及你所在组织的My Domain URL——两者都会用到 MailInApp 中的这次连接里。

把它指向一次 SOQL 查询

数据源的端点是一个 REST 查询 URL,而查询字符串本身就是你得到的实际数据:

SELECT Name, Amount, StageName, CloseDate FROM Opportunity WHERE IsClosed = false

把数据路径设置为 records——Salesforce 会把查询结果包裹在一个 records 数组里。像 Owner.Email 这样的关系字段会以嵌套形式返回,并被 MailInApp 的行解析器丢弃,所以请保持查询是扁平的;如果之后需要一个所有者标识符用于筛选或合并,请改选 OwnerId。

直接绑定模块,而不是合并标签

从工作室的数据面板把这个连接添加到项目里,角色选择collection——与重复模块使用的是同一种绑定。从那里开始,KPI 计分卡、柱状图、折线图和饼图模块都可以在各自的检查器里直接绑定到它:

  • 一个 KPI 计分卡设置为 Amount 并采用求和聚合,就会变成一个实时的「未结总管道金额」数字。
  • 一个按 StageName 分组、以 Amount 为系列(同样是求和聚合)的柱状图,就会变成一张按阶段划分的管道分布图。

这两个模块都不需要手动输入一个合并标签——绑定本身完成了这项工作,而且随着交易变更阶段或成交,两者都会一直保持正确。

按定时发送计划发送它

一次每周一次的定期发送,每次触发时都会重新运行这条 SOQL 查询,并根据 Salesforce 的当前行数据重新渲染这两个模块——同样的摘要结构,每周一都是新的数字,不需要任何人手动重建它。一个指向每条 Opportunity 自己的 Salesforce URL 的按钮模块,能让任何读到摘要的人一键打开某个吸引了他们注意的数字背后的记录。

快速上手

为 JWT Bearer 流程创建一个带证书的 Salesforce 连接应用,在 MailInApp 的数据源标签页中,用你的 Consumer Key、集成用户名和私钥连接它,把端点指向一次以 records 为数据路径的 SOQL 查询,然后从工作室的数据面板把一个 KPI 计分卡和一个柱状图绑定到它上。完整的逐字段设置说明,请见 Salesforce 集成指南。

典型的构建与发送流程

  1. 1

    为服务器到服务器访问创建一个 Salesforce 连接应用

    启用 OAuth settings,上传一个自签名数字证书,打开 JWT Bearer Flow,并将 Permitted Users 设置为 "Admin approved users are pre-authorized",这样就不需要任何人工点击一个授权页面。

  2. 2

    把 Salesforce 连接为一个 API 数据源

    在 MailInApp 的数据源标签页中选择 OAuth2 JWT Bearer,然后粘贴令牌 URL、连接应用的 Consumer Key 作为签发者、集成用户的用户名作为主体、登录主机作为受众,以及配套的私钥。

  3. 3

    把端点指向一次 SOQL 查询

    端点就是你所在组织的 REST 查询 URL,数据路径是 "records"——像 SELECT Name, Amount, StageName, CloseDate FROM Opportunity WHERE IsClosed = false 这样的查询,每次拉取都会返回实时的管道行数据。

  4. 4

    把 KPI 与图表模块直接绑定到它上

    从工作室的数据面板为该数据源添加一个 collection 角色的绑定,然后把 KPI 计分卡的数值字段(Amount 的求和)和柱状图的 Group by(StageName)绑定到它上——不需要手动输入任何合并标签。

  5. 5

    按定期发送计划发送它

    每周一次的定期发送会重新运行该查询,并每次都根据 Salesforce 的当前行数据重新渲染这两个模块,所以周一的摘要总能反映周一的管道情况。

常见问题

访问令牌需要手动续期吗?

不需要——每当缓存的令牌快要过期,或者某次调用返回未授权时,MailInApp 都会自动签发一个新的 JWT 断言,并将其兑换为新的访问令牌。这套流程里没有需要照看的刷新令牌;过期的令牌只是被自动铸造出的一个新令牌所替换。

我的 Salesforce 密码会经过 MailInApp 吗?

不会——JWT Bearer 流程使用一个针对证书验证的签名断言进行认证,绝不会经过用户名/密码交换。MailInApp 存储的唯一秘密,是那对证书中私钥的那一半,保存后会在此后的每一次响应中被遮蔽。

每位销售代表能只看到自己的商机吗?

只有当 SOQL 查询返回一个可供筛选的扁平字段时才行——像 Owner.Email 这样的关系字段会以嵌套对象的形式返回并被丢弃,因为 MailInApp 的行解析器不会扁平化嵌套值。请改选一个扁平的标识符,例如 OwnerId,再让一个已绑定的图表模块针对你受众自己联系人行上的匹配字段进行筛选(图表的「绑定到数据」筛选条件可以引用收件人的合并标签),从而按收件人对同一个共享查询进行切分。

我需要哪个版本的 Salesforce?

任何启用了 REST API 访问权限的版本都可以——Enterprise、Unlimited、Performance 和 Developer Edition 都已内置;Professional 和 Essentials 需要额外的 API 附加组件。集成用户自己的个人资料也需要开启 API Enabled。

这套方案能对接沙盒环境而不是生产环境吗?

可以——把令牌 URL 的主机和受众值都设置为 https://test.salesforce.com,并把端点指向沙盒自己的 My Domain URL,而不是生产环境的。

在工作室中构建它

从免费套餐开始——每个套餐都包含全部互动模块和完整的降级引擎。