【问题标题】:Send Mailchimp newsletter to List via PHP通过 PHP 将 Mailchimp 通讯发送到列表
【发布时间】:2015-09-29 06:48:16
【问题描述】:

有没有办法将自行设计的 HTML 和 CSS 电子邮件从 .php 页面发送到 Mailchimp 列表?我想使用我自己的时事通讯模板将时事通讯功能集成到管理面板并从那里发送。

我不想每次发送电子邮件时都必须登录 Mailchimp,尤其是因为模板每次都相同。

【问题讨论】:

  • 您可能有兴趣在此处使用Mandrill。从MailChimp API Documentation,他们提供了一种使用他们的电子邮件地址提取the list of members 的方法,这样您就可以通过 Mandrill 发送电子邮件。
  • @Whymarrh,我一直在寻找 Mandrill 相当的白人,但找不到我想要制作的方法,这就是我发布问题的原因。
  • @Alin 如果用户已经订阅,您是否收到了再次发送欢迎电子邮件的答案。
  • 虽然不确定如何通过自定义代码完成此操作,但通过drupal.org/project/mailchimp 模块,我们可以访问自定义模板并将时事通讯发送到使用该模板的列表。因此,如果您可以深入挖掘该模块,您可能会找到方法。
  • 你读过这个吗:kb.mailchimp.com/templates/basic-and-themes/… 我知道这不是一个完整的答案,但这是你可以处理自定义模板的方式(你甚至可以制作几个),然后你的工作被削减了一半。现在您所要做的就是找出您的网站管理区域发送实际电子邮件所需的 API 内容。您可以调用所需的适当模板以及要发送到的广告系列。

标签: php email mailchimp


【解决方案1】:

如果您不想将模板上传到 Mailchimp 并通过点击他们的 API 发送活动,Mandrill(如上面 cmets 中提到的 @Whymarrh)可能是一个不错的选择。

虽然它适用于事务性电子邮件(欢迎邮件、密码恢复等),但您一次最多可以通过 SMTP 发送给 1000 个用户。此外,您可以在集成部分将您的 Mailchimp 帐户连接到您的 Mandrill 帐户,以跟踪收件人活动。

我的建议是安装 Mandrill PHP API 客户端,将您的模板上传到 Mandrill,为您的用户列表点击 Mailchimp API,然后将其输入您通过管理面板触发的 Mandrill send-template call。 (发送大量电子邮件的专业提示:Mandrill sending to multiple people as separate message via the REST API)。

【讨论】:

    【解决方案2】:

    是的,你可以。 MailChimp 的详细信息和示例可通过登录其控制面板获得。使用他们的表单字段,为您自己的表单设置样式。

    <form action='http://xxxx.xxxxlist-manage.com/subscribe' method='post'>
        <p><input type="email" value="" name="EMAIL" class="required email" id="mce-EMAIL" placeholder="enter email address"></p>
        <p><input type="submit" value="Sign Up" name="subscribe" id="mc-embedded-subscribe" class="btn"></p>
        <input type='hidden' name='u' value='xxxxxxx'>
        <input type='hidden' name='id' value='xxxxxxx'>
    </form>
    

    【讨论】:

    • 我想你没有正确理解我的意思,我已经有订阅表格了!我需要一种向订阅者列表发送电子邮件(实际时事通讯)的方法!
    【解决方案3】:

    您的问题分为两部分:

    1. 如何从 MailChimp 中获取我的电子邮件列表?
    2. 如何向任意电子邮件地址发送电子邮件?

    第一个块在这里是最重要的。第二块有 ton 种可能的答案,应该很容易完成。


    从 MailChimp 获取列表

    MailChimp 提供了一个至关重要的 API。目前,他们正在开发 v3.0,但 v2.0 仍被标记为“当前”,因此我们将依赖该版本的 API。要使用 API,MailChimp recommends a few third-party packages。对于这个例子,我使用的是 mailchimp-api,它可以使用 composer 安装:

    $ composer require drewm/mailchimp-api
    

    要向 MailChimp 验证您自己,您将需要一个 API 密钥MailChimp provides full instructions 获取 API 密钥,但简短的版本是这样的:

    1. 单击您的个人资料名称以展开帐户面板,然后选择 帐户。

    2. 点击 Extras 下拉菜单并选择 API 密钥。

    3. 复制现有的 API 密钥或单击“创建密钥”按钮。

    4. 描述性地命名您的密钥,以便您知道哪个应用程序使用它 键。

    接下来,您需要 list id 用于您要从中获取电子邮件的列表。再次,MailChimp provides the best documentation 为此。我的列表 id 是一个包含字母和数字的 10 个字符的字符串。

    最后,我们编写 PHP:

    $apiKey = /*Your API key*/;
    $listId = /*Your List ID*/;
    
    $MailChimp = new \Drewm\MailChimp($apiKey);
    $args = array(
        'id' => $listId,
    );
    
    $result = $MailChimp->call('lists/members', $args);
    
    //Check for any errors first, if none have occured, build the email list.
    if(isset($result['status']) && $result['status'] == 'error'){
        throw new Exception('call to Mailchimp API has failed.');
    } else {
        $emails = array();
        //Build an array of emails for users that are currently subscribed. 
        foreach($result['data'] as $recipient){
            if($recipient['status'] == 'subscribed' && !empty($recipient['email'])){
                $emails[] = $recipient['email'];
            }
        }
    }
    

    $MailChimp-&gt;call('lists/members', $args) 返回一个非常庞大的 JSON 响应,其中包含 很多 有趣的信息。如果您通过 MailChimp 中的合并设置存储个性化信息,它们将在此 JSON 响应中可用。但是,为了使这个示例尽可能简单,我只检查了用户是否订阅并存储了他们的电子邮件地址。

    在此块的末尾,$emails 现在将所有电子邮件地址存储在您的列表中。由于这每次都会调用 API,因此在 MailChimp 上取消订阅您的邮件列表的任何人也将在此处被删除。

    在此阶段可能会出现问题。如果您有一个很大的列表(我只测试了 4 个),您可能会遇到内存问题,即 PHP 试图构建一个巨大的 $emails 数组。如果你遇到这个问题,你应该把阅读邮件分成小块,然后像这样发送邮件。


    使用 PHP 发送批量电子邮件

    其他人建议使用 Mandrill 发送批量电子邮件。这是个坏主意。 Mandrill 是 MailChimp 的姊妹服务,旨在发送 transactional email - MailChimp 用于批量电子邮件(如时事通讯)。

    使用 PHP 发送电子邮件的方法有很多,我选择使用 Sendgrid 作为我的 SMTP 提供程序并使用 SwiftMailer 连接到它。其他替代方法是使用 PHP 的 mail() function 或其他库,如 PHPMailer

    您可以使用 Composer 安装 SwiftMailer:

    $ composer require swiftmailer/swiftmailer @stable
    

    我在this question 中详细介绍了 SwiftMailer 和 SMTP 服务(尽管上下文略有不同)。但是这个例子会做它需要做的。

    $sendgridUser = /*SendGridUsername*/;
    $sendgridPassword = /*SendGridPassword*/;
    
    $subject = "Thank you for using MailChimp Lists!";
    $fromAddress = "HPierce@example.com";
    $fromName = "Hayden Pierce";
    $body = file_get_contents(/*path to content (body.html)*/);
    $transport = Swift_SmtpTransport::newInstance('smtp.sendgrid.net', 587, 'tls')
      ->setUsername($sendgridUser)
      ->setPassword($sendgridPassword)
      ;
    
    foreach($emails as $email){
        $mailer = Swift_Mailer::newInstance($transport);
    
        $message = Swift_Message::newInstance()
          ->setSubject($subject)
          ->setFrom(array($fromAddress => $fromName))
          ->setTo($email)
          ->setBody($body);
    
        $mailer->send($message);
        exit();
    }
    

    为简单起见,我从静态 HTML 文件中读取了整个正文。您可以考虑使用Twig 之类的模板引擎,以便更好地使用模板实现它。


    所有这些代码放在一起看起来像这样:

    //Loading in composer dependencies
    require "vendor/autoload.php";
    
    //Provided by Mailchimp account settings
    $apiKey = /*MailChimp API keys*/;
    $listId = /*MailChimp List id*/;
    
    $sendgridUser = /*SendGridUser*/;
    $sendgridPassword = /*SendGridPassword*/;
    
    $subject = /*The subject line of your email*/;
    $fromAddress = /*The email address for your FROM line*/;
    $fromName = /*The name in your FROM line*/;
    $body = file_get_contents(/*path to your html content*/);
    
    $MailChimp = new \Drewm\MailChimp($apiKey);
    $args = array(
        'id' => $listId,
    );
    
    $result = $MailChimp->call('lists/members', $args);
    
    //Check for any errors first, if none have occurred, build the email list.
    if(isset($result['status']) && $result['status'] == 'error'){
        throw new Exception('call to Mailchimp API has failed.');
    } else {
        $emails = array();
        //Build an array of emails for users that are currently subscribed. 
        foreach($result['data'] as $recipient){
            if($recipient['status'] == 'subscribed' && !empty($recipient['email'])){
                $emails[] = $recipient['email'];
            }
        }
    }
    
    //Setup for sending emails to an arbitrary list of emails using Sendgrid.
    $transport = Swift_SmtpTransport::newInstance('smtp.sendgrid.net', 587, 'tls')
      ->setUsername($sendgridUser)
      ->setPassword($sendgridPassword)
      ;
    
    foreach($emails as $email){
        //Send emails to each user.
        $mailer = Swift_Mailer::newInstance($transport);
    
        $message = Swift_Message::newInstance()
          ->setSubject($subject)
          ->setFrom(array($fromAddress => $fromName))
          ->setTo($email)
          ->setBody($body);
    
        $mailer->send($message);
    }
    

    【讨论】:

    • 这里的整体信息非常有用。
    【解决方案4】:

    MailChimp API 的 v2.0(已弃用)具有 Campaign CreationCampaign Send 方法。这些不是最容易使用的方法,但当前的 API (v3.0) 还没有,所以这是您的最佳选择。

    【讨论】:

    • 我明白了...grr,好的,今晚会试一试...也发布代码,我们会看看它是否有效:) 祝您有美好的一天,感谢您的提示。
    【解决方案5】:

    使用自定义 HTML 创建广告系列

    使用活动/创建 api 端点:https://apidocs.mailchimp.com/api/2.0/campaigns/create.php

    PHP 包装器在这里:https://bitbucket.org/mailchimp/mailchimp-api-php

    似乎 Mailchimp_Campaigns::create 是您可以使用的功能。密切注意 $content 参数(原始/粘贴 HTML 内容的 html 字符串)

    创建广告系列后,您将获得它的 ID。

    发送创建的广告系列

    使用函数 Mailchimp_Campaigns::send 和之前创建的活动的 ID

    【讨论】:

      猜你喜欢
      • 2012-02-25
      • 1970-01-01
      • 2018-08-23
      • 2014-03-04
      • 2015-12-18
      • 1970-01-01
      • 2012-06-16
      • 2018-07-11
      • 2013-03-01
      相关资源
      最近更新 更多