【问题标题】:coldfusion 11 spooler & cfmail threadingColdfusion 11 后台处理程序和 cfmail 线程
【发布时间】:2016-03-08 05:36:36
【问题描述】:

当前情况: 例如使用带有查询的 cfmail 标签。

<cfmail   
    query="qName"   
    to="#tomailvar#" 
    from="#frommailvar#>"
    subject="#subjectvar#"  
    type="html" 
    server="smtp.sendgrid.net" 
    timeout="360"  
    username="#myuservar#"  
    password="#mypwdvar#"  
>

如何在 cfmail 标记或当前代码中进行线程处理?

我有客户,他们在一段时间内一次性发送近 40k。 我为我的客户提供了多个帐户,有时他们同时有两个用户或三个用户发送 40k + 40k+ 封电子邮件。

有没有一种方法可以计算后台处理程序文件夹中的消息并用我的查询总数进行验证?

处理这么多电子邮件的正确方法是什么?

【问题讨论】:

    标签: multithreading coldfusion cfml coldfusion-11 cfmail


    【解决方案1】:

    您使用的是哪个版本的 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#">
    

    【讨论】:

    • 所以你说如果我使用 API 在我的情况下我使用 sendgrid 可以一次发送 40k 吗?
    • 使用 SendGrid 的“mail.send”端点,它们只允许“每个 API 请求最多 10,000 个收件人”。您必须执行 4 个以上的帖子才能发送单个电子邮件作业。他们还要求将收件人地址张贴在单独的表单字段中(呃,10,000 多个表单字段?)sendgrid.com/docs/API_Reference/Web_API/mail.html 他们似乎也不允许替换参数(即,你好 {name})。
    • 查看 SparkPost。他们目前对 100 万封电子邮件/月收取 199 美元的费用。 SendGrid 对 700,000 美元收取 399 美元(如果超过 700,000 美元,您需要与他们联系以了解费率。)您以更少的价格支付更多的费用,我认为您会更喜欢 SparkPost API。
    • 非常感谢.....让我看看 sparkpost... 有什么方法可以检查假脱机数量吗?
    • 祝你好运。根据我们的测试和 SMTP 服务器日志,假脱机邮件偶尔会永远不会建立任何要发送的连接,移动到“Undelivr”文件夹,但仍会在“mail.log”文件中列为“已发送”。您可以遍历所有电子邮件地址(和活动)并将其记录到数据库(或使用 CFLog)。我们一直在保存邮件 ID 和发送期间使用的电子邮件地址列表。 (由于使用 SparkPost,我们将整个 JSON 数据包记录为“发送回执”。这使得重新发送变得非常容易。)
    猜你喜欢
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 2014-08-07
    • 2012-11-09
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多