草庐IT

php - 发送时事通讯的最有效方式

coder 2024-04-18 原文

关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。












想改善这个问题吗?更新问题,以便堆栈溢出为 on-topic

6年前关闭。




Improve this question




今天,当我发送基本的电子邮件时,我使用了一个“Mail”类,它是一个使用 SwiftMailer 的自定义包装器,如下所示:

<?php
Mail::create('Message title')
        ->template('Template string or view path. Global variable "var" is "{var}". Current user is {username}.')
        ->tags(array('var' => 'value 1'))
        ->from('contact@mydomain.com')
        ->to('mail@example.com', array('username' => 'Boris'))
        ->transport(Mail::SMTP)
        ->send();

它适用于基本电子邮件,但由于多种原因不能用于发送时事通讯:
  • 无池管理
  • 无延迟发送
  • 无跟踪

  • 所以我想了一种方法来集中更复杂的电子邮件管理。我做了一个架构:



    我不希望远程服务器存储任何联系信息 ,只存储事件、收件人和统计信息,如下图:



    Recipient ”表的“ data ”字段用于存储自定义数据结构,当API被要求提供有关收件人的信息时,该数据结构将被发回。例如 :
    <?php
    $result = NewsletterAPI::getRecipientsViewReport($campaignRef);
    //
    // Will contain something like : 
    // Array
    // (
    //   [recipients] => Array
    //     (
    //       [0] => Array
    //         (
    //           [email] => toto@gmail.com
    //           [opened] => 3
    //           [last_open_date] => '2015-02-02 12:32:23', 
    //           [data] => Array
    //             (
    //               [id] => 123
    //             )
    //         )
    //       [1] => Array
    //         (
    //           [email] => tata@hotmail.com
    //           [opened] => 0
    //           [last_open_date] => null, 
    //           [data] => Array
    //            (
    //              [id] => 17
    //            )
    //        )
    //    )
    // )
    

    远程服务器除了发送电子邮件并获取有关它们的统计信息外,不关心其他任何事情。无论电子邮件地址背后是什么实体或如何管理用户。

    它只阻止用户访问不属于它的数据,并阻止非管理员用户访问管理 API 方法(如创建用户)。

    这种方式很容易集成到任何网站中,我只需要存储我想要发送邮件的帐户的 api key (例如在我的“ User ”实体中添加“ mailing_api_key ”字段)。

    所以我的问题

    首先,您如何看待这种架构?

    在现实世界的使用中,电子邮件的数量不应该非常大(每周几千),但我希望系统具有最低限度的稳健性。

    除此之外,我能想到的三个主要问题是:
  • 被列入黑名单,
  • 有糟糕的统计结果,因为我不知道除了使用跟踪图像以外的任何其他方法来跟踪 View ,而且很容易被阻止,
  • 从我读过的内容来看,检测反弹似乎非常复杂,而且我没有相关经验。

  • 因此,我进行了一些研究以找到可以处理此问题的专业服务,例如:
  • Mailchimp
  • Sendinblue
  • MPZMail
  • Campayn
  • FreshMail

  • 等等..但他们都想管理联系人和很多我不关心的事情。

    我只想要一个完全没有 UI 的服务 ,它做一些与我上面描述的接近的事情:
  • 动态帐户创建(仅适用于管理员帐户),
  • 每次都将电子邮件发送到自定义地址列表, 没有限制,也没有任何类型的预先创建的邮件列表 ,
  • 简单的获取方法:
  • 事件列表(执行请求的用户),
  • 事件统计,
  • 特定地址的统计信息,
  • 和.. 就是这样!

  • 非常感谢您已经阅读了所有内容,我希望找到解决方案。

    问候。

    最佳答案

    大多数(大)公司只使用像mailchimp这样的第三方API。只需订阅一些公司通讯并查看电子邮件标题。

    如果预算超过数百万的公司使用第三方通讯公司,这是有原因的。您将在垃圾邮件过滤器和您尚不知道的问题方面遇到很多麻烦……甚至不同国家/地区的法律也不同。 (例如:在德国,您必须在电子邮件中提供取消订阅链接)。

    那些第三方通讯公司提供了一个 api,您可以将其集成到 php 中。

    关于php - 发送时事通讯的最有效方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28876040/

    有关php - 发送时事通讯的最有效方式的更多相关文章

    1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

      我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

    2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    3. ruby - 如何进行排列以有效地定制输出 - 2

      这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

    4. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

      question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

    5. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

      rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

    6. ruby - 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么? - 2

      我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=

    7. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

      在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

    8. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

      是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

    9. ruby - 获取数组中的值并最小化某个类属性的最优雅的方法是什么? - 2

      假设我有以下类(class):classPersondefinitialize(name,age)@name=name@age=ageenddefget_agereturn@ageendend我有一组Person对象。是否有一种简洁的、类似于Ruby的方法来获取最小(或最大)年龄的人?如何根据它对它们进行排序? 最佳答案 这样做会:people_array.min_by(&:get_age)people_array.max_by(&:get_age)people_array.sort_by(&:get_age)

    10. ruby - 是否可以在不实际发送或读取数据的情况下查明 ruby​​ 套接字是否处于 ESTABLISHED 或 CLOSE_WAIT 状态? - 2

      s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成

    随机推荐