Salesforce的Add Campaign Member

// 更新 2018-10-12
该Issue已经被解决。

// 最下有更新 2018-05-08

最近发现了一个好玩的现象。
作为Salesforce Marketing核心功能之一,标准功能Campaign的出镜率非常高。

这次的问题就出在向Campaign添加Campaign Member上。

除了使用DataLoader与Data Import Wizard等数据导入工具以外,Salesforce在标准画面上提供了三个添加Campaign Member的渠道。
第一种为最为常见的方式,通过Campaign详细画面下方Campaign Member关联列表上的Manage Members按钮进行添加。

第二种方式,通过Contact/Lead的ListView画面上的Add to Campaign按钮。

第三种方式,通过Report上的Add to Campaign按钮。

不过以上三种方式,只支持向单个Campaign添加Members。

问题是这样的,
假如我有一个Campaign叫做TestCampaign,有500个Contact叫做TestContact000~Test499。
如果没有任何意外发生,三种方式的行为是一致的,结果均是成功将500条Contact做成了Campaign Member。

接下来我们做实验。
首先,在Contact上添加一个Text字段,叫testValidation__c。
然后在Campaign Member上添加一个Validation Rule,拦截条件为Contact.testValidation__c等于“E”。
之后将TestContact000的testValidation__c设置为”E”。

分别使用三种方式,将TestContact001~500添加到TestCampaign。

结果,行为出现了偏差。
对于第二种和第三种方式,

由于有一条“错误”数据,导致整个导入Campaign Member动作失败。

而最常见的第一种方式,却出现了不同的结果。

首先,错误信息与其他两种方式一致,并且没有进行画面跳转。


但是,如果我们进入Existing Members画面,就会赫然发现,里面居然进去了99条。

观察数据编号,发现进去的数据为TestContact001到TestContact099。就是说,除了“错误”的TestContact000,前100条的剩余数据都成功做成,100条以后的全都被放弃了。

这样的话,我猜想Add Member功能的机制是这样的———————选完数据,开始执行之后,后台会将数据按顺序分为100条一个批次,加入某个批次出现了错误数据,则其余数据插入,处理终止。

为了证实这个猜想,我又实验了将TestContact101设定为“错误”数据的情况,果然如我所料,进入了199条数据,为TestContact000~TestContact100及TestContact102~TestContact199。

对于同样一个功能,不同入口却出现了不同的行为模式与处理方式,实在是无法理解。
关于100条一个批次的问题,我猜应该是一个Salesforce的历史遗留问题,因为曾经Trigger虽然最多一起处理200条数据,但曾经后台还是按100一批处理的,导致有一些代码写法会莫名的只对前100条生效。

也许,又是一个Bug。

// 2018-05-08 Update

SFDC承认了这是一个Bug。Agent还贴心的提了一个Known Issue。
https://success.salesforce.com/issues_view?id=a1p3A000000nXgTQAU
遇到相同问题的同学请mark一发。

关于example.com

每当刷完Sandbox,Salesforce为了防止从Sandbox发出的邮件使用户混肴,
所以将所有User的邮箱的@替换为=,然后加上@example.com
比如,User A的邮箱为[email protected],则变换为[email protected]

如果向这种邮箱发出邮件,邮件会发到哪去呢?

有同学说了,这个邮箱肯定不存在的,所以谁也收不到。
这可未必。如果了解SMTP服务器的话,就知道有种catch all账号,可以收到所有发往此邮件服务器的邮件,无论收件地址是否存在。
所以用公司邮箱乱发东西的同学们注意了,千万别用公司邮箱乱说话呦。

所以我们就来看看这个example.com
首先用浏览器访问,还真的能直接访问,白白的背景上,正中间方方正正的写着

Example Domain

This domain is established to be used for illustrative examples in documents. You may use this domain in examples without prior coordination or asking for permission.

More information…

大概意思是说,这个域名就是给你在文档里做说明示例用的。随便用,不用经过我同意。
呦!谁这么大方?

顺手Whois了一下这个example.com
注册商是RESERVED-Internet Assigned Numbers Authority

这个Internet Assigned Numbers Authority是哪路神仙?
原来是大名鼎鼎的IANA(互联网号码分配局)。
什么?没听过,那么ICANN总听过吧,
Internet Corporation for Assigned Names and Numbers,互联网名称与数字地址分配机构。
如果购买域名的话,每年都要向ICANN交管理费的。
这个IANA就是ICANN的下属机构。
这就是说,这个域名居然还是官方所有的。

随后,点了一下页面上的More information…
了解到了整个事情的始末。

原来根据RFC2606
一级域名
.test
.example
.invalid
.localhost
二级域名
example.com
example.net
example.org
都为特殊目的所保留。

RFC6761则规定了具体的做法。

// 小插曲,很Interesting的是,RFC2606的作者是IBM雇员 Donald E. Eastlake 3rd与Aliza R. Panitz, 而RFC6761的作者为Apple Inc.的雇员Stuart Cheshire与Apple Inc.的雇员Marc Krochmal

网页中明确的说明了Certain domains are set aside, and nominally registered to “IANA”, for specific policy or technical purposes.
甚至提供了IDN的保留域名。

就像好莱坞电影里以555区号开头的电话一样,互联网也保留了这种安全域名用来举例子。

根据RFC6761中的提到的,

IANA currently maintains a web server providing a web page explaining the purpose of example domains.

所以只有http请求才会被受理以展示那个说明页面。
你的邮件无法找到example.com的MX记录,
虽然可以落到A记录,顺利的拿到IP,但IANA并没有建立监听25端口的SMTP服务,
所以,邮件发送会失败。

Salesforce关于Update Records with Inactive Owners权限

// 老鸟直接去下面看重点

Salesforce作为平台,无论是Standard Object还是Custome Object,都提供了默认的系统字段。
这些字段普通用户无法直接更新与编辑,只有系统才可以修改,以此作为审计信息,保证数据的可靠性。

但是,由于并不是每个使用Salesforce的组织都刚刚步入信息化。
所以,从Legacy System迁移到我们全球最先进的CRM系统——Salesforce的时候,必然会涉及到数据迁移。
有的同学说了,数据迁移简单啊,把数据从原来的系统抽出来,然后插入到Salesforce里。
我们知道,如果直接导出,再插入的后果是导致创建日期等一众字段都会变成数据导入那天。
那么,如果有功能是基于创建先后顺序的时候该怎么办,五年前的数据将会比昨天创建的数据更靠前。

为了应对这种情况,Salesforce提供了Set Audit Fields upon Record Creation与Update Records with Inactive Owners两个权限。
开启的方法为:
1. Setup -> Build -> Customize -> User Interface -> Enable “Set Audit Fields upon Record Creation” and “Update Records with Inactive Owners” User Permissions 勾选
2. 创建一个PermissionSet将Set Audit Fields upon Record Creation与Update Records with Inactive Owners分别勾选。将此PermissionSet分配给需要的User。
3. 在Custom Profile里将Set Audit Fields upon Record Creation与Update Records with Inactive Owners分别勾选。
这里需要注意的是,System Admin是标准Profile,所以只能使用PermissionSet。

Set Audit Fields upon Record Creation顾名思义,就是在Insert数据的时候,可以设定Audit Fields。一次操作成型,不能再Update。
继续阅读“Salesforce关于Update Records with Inactive Owners权限”