云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

百度云_cad服务器_免费6个月

小七 141 0

四个动作邮件功能你应该知道

[从初创企业毕业到scaleup意味着必须不断改进应用程序以跟上客户的增长。在这个新生工程系列中,轨道刻度,我们将讨论我们用于扩大产品规模的一些技术。]Action Mailer是Rails附带的默认电子邮件库。它有大量的隐藏特性,但并没有像ActiveRecord或ActiveSupport这样的同类产品谈论或讨论太多。在本文中,作为轨道刻度系列文章中,我们将介绍其中的一些特性,并了解如何使用Action Mailer更好地缩放和调试电子邮件发送。拦截器根据Rails的官方文档,"拦截器允许你在邮件交给递送代理之前对其进行修改。侦听器类必须实现":delivery_email(message)"方法,该方法将在发送电子邮件之前调用。"这是一个非常强大的钩子,可以帮助您从mailer或notifier类中提取一些通用进程或规则。我们利用Freshservice中的拦截器来设置默认邮箱和我们的客户用来向收件人发送电子邮件的发件人地址。下面的代码片段演示了如何利用拦截器实现相同的目标:123456789101011121314151617181920212223242526272829类邮箱侦听器定义自我发送电子邮件(邮件)设置smtp设置(邮件)修复编码确保取消设置电子邮件配置结束私有定义self.set_smtp_设置(mail)smtp_settings=租户电子邮件配置&;smtp\U默认设置ActionMailer.smtp\u设置=smtp_设置mail.delivery_方法(:smtp,smtp_settings)结束def unset_email_config线程电流[:tenant_mail_config]=nil end def tenant_mail_config=(邮件配置)线程电流租户U邮件配置租户邮箱配置线程电流[:tenant_mail_config]结束endActionMailer::Base.register_拦截器(邮箱拦截程序)"set_smtp_settings"方法从线程检索当前租户配置的邮箱,并将其分配给邮件的"smtp_settings"属性。mail类在内部使用"smtp_settings"属性连接到邮箱以传递电子邮件此方法还负责设置产品功能和平台扩展所需的所有特定于产品的自定义标头。为了避免通过垃圾邮件滥用IP声誉和潜在的服务中断,根据当前租户的状态,我们还附加了邮件头,以确保在发送相应电子邮件时选择了正确的IP。"fix_encodings"方法顾名思义,可以修复由不受支持的用户输入数据引起的任何编码问题。观察员从Rails的官方文档中可以看到,"观察者可以在邮件发送后访问它。observer类必须实现":delivered_email(message)"方法,该方法将在电子邮件发送后调用。"与拦截器一样,observer提供可用于一般进程的钩子出于电子邮件调试的目的,我们希望打印一个带有默认ActionMailer日志的邮件id头,该日志打印"Sent email to#{recipients_list}"。此日志由ActionMailer的默认LogSubscriber打印。但是这个LogSubscriber没有访问mail对象的权限。因此,我们无法利用LogSubscriber来实现这一点然后我们决定使用观察者来实现这一目标。我们还必须重写默认的LogSubscriber的deliver方法,以避免重复的"sentedemail to#{recipients_list}"日志消息。123456789101121314151617181920模块MailObserver def自传电子邮件(mail)logger=ActionMailer::基本记录程序    logger.tagged(mail.message_标识)做记录器信息do recipients=数组(邮寄至).join(',')"已将邮件发送到#{recipients}"结束logger.debug{ 邮件编码}endendActionMailer::Base.register_观察者(MailObserver)模块MailLogSubscriber def deliver(事件)#无操作端邮件器::LogSubscriber.prepend(邮箱订阅服务器)我们还可以记录邮件对象中的其他邮件头,以便进行分析或记录。或者,也可以通过订阅传递动作\u-mailer'来自Action Mailer的事件。是否交货根据Rails的官方文档,performdeliveries决定"当对邮件消息调用deliver方法时,是否实际执行了传递。默认情况下是这样,但可以关闭此选项以帮助功能测试。如果此值为false,则即使delivery_方法为:test,也不会填充deliveries数组此选项对于测试环境或CI管道非常有用,以避免占用电子邮件服务提供商提供的电子邮件配额。在开发模式下也可以利用这一点,以避免在开发或测试功能时用过多的电子邮件向邮箱发送垃圾邮件。默认情况下,邮件内容在STDOUT上打印出来。您甚至可以使用tmp目录中的线程变量或文件来配置它。另一个动态设置为false的用例是根据发送电子邮件的租户或电子邮件的内容来避免发送垃圾邮件。下面是如何使用上面定义的拦截器方法执行此操作:12345678910类邮箱侦听器定义自我发送电子邮件(邮件)设置"smtp"设置(邮件)修复编码mail.perform_传送= Rails.env.生产?|| 文件是否存在?("#{轨道.根}/tmp/发送_电子邮件.txt")确保取消设置电子邮件配置EndedActionMailer::Base.register_拦截器(邮箱拦截程序)在邮件级别设置此选项可确保其他电子邮件不受影响。这也可以通过ActionMailer回调来实现回拨–更好地控制您的电子邮件在rails4.0中,ActionMailer被引入了ActiveSupport回调钩子,类似于ActionController。根据changelog:允许在类似ActionController::Base的mailer中定义回调。您可以配置默认设置、邮件头、附件、传送设置或使用"前过滤器"、"后过滤器"等更改传递。Justin S.Leitgeb这是对框架的一个很好的补充,因为它允许很大的可能性。前面几节讨论的一些项目可以通过回调轻松实现。Freshservice是一个基于云的SaaS产品,其核心实现了多租户架构。作为一款产品,我们为能够轻松注册并从第一天开始就开始工作而感到自豪。但是,这种轻松带来了处理过多垃圾邮件的痛苦。多租户建筑成为这里的受害者,因为一条坏鱼可以使整个池塘变脏。为了确保我们的客户不会受到垃圾邮件注册的影响,我们在系统中有几个不同级别的垃圾邮件过滤器和拦截器。例如,在注册时,我们根据历史模式和数据对租户进行垃圾邮件查找,并为其设置垃圾邮件分数。根据分数,某些功能或频道的访问被阻止。电子邮件是主要渠道之一,我们希望维护我们的电子邮件声誉,并避免从Freshservice发送的电子邮件被标记为垃圾邮件。这实际上意味着我们必须阻止垃圾邮件租户从应用程序发送电子邮件。虽然不为这些租户排队是一个简单的方法,但要确保每次我们排队发送电子邮件的后台工作都能遵循这些检查,变得异常困难。我们错过了几次,那是我们想增加另一层保护-一个在行动邮件级别最简单的解决方案是从拦截器或通过基本"ApplicationMailer"中定义的"before_action"将"perform_deliveries"设置为false,如下所示:12345678类ApplicationMailer{租户.current.spam?}专用定义阻止垃圾邮件帐户message.perform_传递=假结束但我们仍在处理邮件模板和整个工作只是为了不发送邮件。我们不满意,想要更好的。就在那时,我们发现了一块鲜为人知的秘密宝石。我们遇到了这样的设置,即before\u action回调中的"response_body"会立即中止邮件处理。12345678类ApplicationMailer{租户.current.spam?}专用定义阻止垃圾邮件帐户self.response_body="中止!"结束语 Rails预装了大量功能强大的框架。我们不断地改进我们的代码库,反过来我们的产品也在利用Rails所提供的一切来更好地服务于我们的客户。相关岗位使用定制中间件的Sidekiq队列管理Ruby中字符串插值的优化