【问题标题】:To minimize memory usage, should I choose Pony's :sendmail or :smtp mode?为了尽量减少内存使用,我应该选择 Pony 的 :sendmail 还是 :smtp 模式?
【发布时间】:2012-01-20 18:11:50
【问题描述】:

我正在使用Pony gem 发送电子邮件。假设我有两种选择,使用 :smtp 或 :sendmail 是否有内存优势?

选项 1:smtp

这里,Ruby 直接连接到 SMTP 服务器。

Pony.mail(
  :to => 'you@example.com',
  :via => :smtp,
  :via_options => {
    :address        => 'smtp.yourserver.com',
    :port           => '25',
    :user_name      => 'user',
    :password       => 'password',
    :authentication => :plain, # :plain, :login, :cram_md5, no auth by default
    :domain         => "localhost.localdomain" # the HELO domain provided by the client to the server
  })

选项 2:发送邮件

这里生成了本地的sendmail 二进制文件。

Pony.mail(
  :to => 'you@example.com',
  :via => :sendmail,
  :via_options => {
    :location  => '/path/to/sendmail',
    :arguments => '-t'
  })

特别是,我担心在附加文件之前将文件的全部内容加载到内存中 - 但这似乎在两种模式下都是必要的

Pony.mail([...], :attachments => {"foo.zip" => File.read("path/to/foo.zip")})

这类似于Sendmail vs SMTP,但这些答案并未涵盖我的问题。

【问题讨论】:

    标签: ruby pony


    【解决方案1】:

    我维护 Pony gem。

    您通过电子邮件发送的文件有多大?我认为传输方法之间的内存使用不会有太大差异。

    如果你必须发送大文件,我会使用不同的传输方式,我一般不会通过 smtp 发送大文件。

    您也可以尝试直接使用邮件库:

    https://github.com/mikel/mail

    它可能会为大文件提供更好的性能。

    如果这不起作用,您可能不得不求助于调用 uuencode 并将输出通过管道传输到邮件(即 uuencode file.dat | mail foo@bar.com)

    【讨论】:

    • 我知道这是一个老话题了,但我希望你能回答这个问题——Pony 是否在每封电子邮件发送后关闭 SMTP 连接(使用 :smtp 方法时)?我想在每天午夜发送大约 50,000 封电子邮件的 cron 作业中使用它,并且我想确保我们正在利用我们可以获得的每一项性能提升。
    【解决方案2】:

    首先,Pony 默认使用 sendmail,所以我猜测直到您知道您需要 smtp(只有在没有 sendmail 的机器上才会出现这种情况,这也由 pony 本身决定),我会选择默认值。

    另一方面:由于您担心系统负载,我还建议发送邮件。这是因为您的 ruby​​/rails 应用程序会将系统负载(附件)发送到 sendmail,这可能会解决内存负载过多的问题,比 ruby​​ 运行 smtp 本身更快。

    但老实说,我不认为这两个版本的内存负载差异太大,因为两者都直接接收附件。既然您在谈论电子邮件,我不认为您在谈论数百兆字节的文件,对吧?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-22
      • 2018-04-15
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多