您使用的是哪个版本的 ColdFusion?我很惊讶您没有遇到超时问题。从 ColdFusion 6 开始,我们一直将 HTML、TEXT 和电子邮件列表保存到单独的数据库中,然后对数据进行后台任务循环并以较小的批量发送。
您是否考虑过使用事务性电子邮件服务?我们最近从 Mandrill(因为他们将其滚动到 MailChimp)切换到 SparkPost(免费层 = 100,000 条消息/月)。这种类型的服务将为您提供最好的统计数据和退回/阅读/点击检测(使用 CFHTTP 发送 40k 条消息大约需要 2 秒。)您还可以为您正在发送的帐户使用“标签”,这样您就可以跟踪或为每个客户设置单独的帐户。(注意:如果您使用 SMTP API,请务必为每个 SMTP 客户设置唯一的 DNS CNAMES,否则 ColdFusion 可能会使用现有的经过身份验证的连接并使用错误的 SMTP 帐户发送消息。)
除了 SMTP 连接(一次一条消息)之外,还提供 REST API,它允许您生成和发布包含 HTML/TEXT 模板、电子邮件列表、替换参数、活动 ID、标签、可选标题等的单个 JSON 数据包。我更喜欢通过这些服务发送,因为它不会导致我的 IP 被列入黑名单或导致时间敏感消息的传递延迟。
这是各种交易电子邮件提供商的比较图表。
http://socialcompare.com/en/comparison/transactional-emailing-providers-mailjet-sendgrid-critsend
这是使用SparkPost的示例 REST API 调用。(我提供这个是因为几乎没有第三方服务提供 CFML 的代码示例。)
<cfscript>
APIKey = "abc123";
/* Generate Message Object */
messageObject = {
"campaign_id" = "Test1234",
"options" = {
"open_tracking" = Javacast("boolean", true),
"click_tracking" = Javacast("boolean", true)
},
"recipients" = [
{"address" = {"email" = "user1@email.com", "name"="User 1 Name"}, "substitution_data"= {"fullname"="Mr. User 1"}},
{"address" = {"email" = "user2@email.com", "name"="User 2 Name"}, "substitution_data"= {"fullname"="Ms. User 2"}},
],
"content" = {
"tags" = ["testing", "demo"],
"from" = {"email"="my@email.com", "name"="My Name"},
"subject" = "Oh hey {{fullname}} (#Request.DateTimeFormat(StartTime,'m/d/yyyy')#)",
"html" = "<b>Testing REST API {{fullname}}</b><br><br>Sending email using a transactional email service.",
"text" = "Testing REST API {{fullname}} - Sending email using a transactional email service.",
"headers" = {
"X-CUSTOM-HEADER" = "foo bar"
}
}
};
/* Recommend using JSONUtil for proper casting of boolean values */
JSONUtil = CreateObject("component","JSONUtil");
MessageJSON = JSONUtil.Serialize(var=messageObject, strictMapping=true);
</cfscript>
<cfhttp url="https://api.sparkpost.com/api/v1/transmission" method="post" result="httpResp" timeout="60" getasbinary="never">
<cfhttpparam type="header" name="Content-Type" value="application/json">
<cfhttpparam type="header" name="Authorization" value="#APIKey#">
<cfhttpparam type="body" value="#MessageJSON#">
</cfhttp>
<CFDUMP VAR="#httpResp#">