Ruby:Cc地址失踪的电子邮件

时间:2016-02-18 17:00:59

标签: ruby email smtp

问题摘要

当我尝试将地址包含在CC字段中时,我遇到了Ruby mailfactory gem(或Net::SMTP)的问题。我不确定我可能错误地使用了哪两个。

两个测试/生产系统都具有mailfactory的相同版本,但Ruby安装的版本不同。我正在使用mailfactory (1.4.0)。测试系统有ruby 2.1.2p95 (2014-05-08) [x86_64-linux-gnu],生产系统有ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]

当前代码

这是我在电子邮件发送功能中的代码:

mail = MailFactory.new

to_addr   = 'to@domain.com'
cc_addr   = ['cc1@domain.com', 'cc2@domain.com']
#
# ...ommitted for brevity...
#
mail.to       = to_addr
mail.cc       = cc_addr.join ';'
mail.from     = 'from@domain.com'
mail.subject  = "Subject here"
mail.text     = "Some text here"
mail.html     = "Some HTML text here"

Net::SMTP.start('smtp-host@domain.com', 25) do |smtp|
  smtp.send_message(mail.to_s, mail.from.to_s, to_addr)
end

上面的代码有效,但只是部分代码。当我运行测试(并且只有有时)时,CC列表中的那些人似乎收到了电子邮件,但是当代码在生产中运行时, CC列表中没有人似乎收到副本。 (我碰巧在CC列表中,我从来没有得到任何一个。)

我尝试过一些不同的事情,包括将to_addrcc_addr加入到单个字符串中,如下所示:

cc_addr << to_addr
Net::SMTP.start('smtp-host@domain.com', 25) do |smtp|
  smtp.send_message(mail.to_s, mail.from.to_s, cc_addr.join(';'))
end

这也不起作用。

我还尝试使用mailfactory&#39; add_header方法:

mail.add_header('To', to_addr)
mail.add_header('Cc', cc_addr.join(';'))
mail.add_header('From', "from@domain.com")
# etc...

这也行不通。 CC列表中的地址无法获取消息(即使在过去工作的测试环境中也是如此)。实际上,即使CC包含单个字符串,它仍然无法正常工作。

其他观察

这里还有一些我直接观察到的事情:

  1. 当我puts mail.to_s到终端时,邮件标题似乎没问题(即我看到地址,包括CCs - 见下面的示例);

  2. 当用户回复收到的其中一封电子邮件时,所有地址都清楚地列在CC字段中,即使似乎没有人收到它们(至少我知道我没有);

  3. 其他非Ruby程序使用相同的SMTP服务器(由IT管理)来发送电子邮件,包括CC,并且没有问题;

  4. 程序正常运行(即没有出现警告或错误消息);

  5. 电子邮件地址有效,即使我一次收到一个此类地址的邮件递送通知失败(还没有再看到,似乎是IT方面的一次性问题)

  6. 尝试join To:字段中的to个地址不起作用。 (源代码似乎将To:字段限制为单个地址。)

  7. 我已经检查了其他参考/示例,但它们非常简单,专注于单个From:puts mail.to_s等等。因为这似乎对我有用,所以&# 39;没有用。

    标题样本1

    以下是由mail.add_header('To:', 'to@domain.com') mail.add_header('From:', 'from@domain.com') mail.add_header('Cc:', 'cc1@domain.com') 生成的实际电子邮件标头,其中包含地址和域名,原因显而易见。

    下面的标题是使用

    生成的
    To: to@domain.com
    From: from@domain.com
    Cc: cc1@domain.com
    Cc: cc2@domain.com
    Reply-to: from@domain.com
    Subject: The subject
    Message-ID: <1455811642.9742095.1000.11119260@domain.com>
    Date: Thu, 18 Feb 2016 08:07:22 -0800
    MIME-Version: 1.0
    Content-Type: multipart/alternative;boundary="----=_NextPart_APX_H3L1_qoWN58XIkVGr5SL_"
    

    ......等等。输出是:

    mail.to = 'to@domain.com'
    mail.cc = cc_addr.join ';'
    

    标题样本2

    下面的标题是使用

    生成的
    to: to@domain.com
    cc: cc1@domain.com;cc2@domain.com
    from: from@domain.com
    subject: =?utf-8?Q?The_subject?=
    Message-ID: <1455812736.522942.1000.7983900@domain.com>
    Date: Thu, 18 Feb 2016 08:25:36 -0800
    MIME-Version: 1.0
    Content-Type: multipart/alternative;boundary="----=_NextPart_hTUHy..uLF3qVgnLqYEaQKd21"
    

    ......等等。他们制作了:

    To:

    标题中的不同外壳似乎没有区别。在这两种情况下,只有Cc:字段中列出的地址才会收到邮件。那些在mailfactory中的人

    问题

    1. 关于我在这里可能缺少什么的想法?

    2. 我应该使用mailfactory吗? (最近注意到一些回购w /他们最后一次提交8年前+ ...)

    3. 如果这已被弃用/废弃,它有什么替代品,我在哪里可以找到它+ docs / examples? (我没有为Net::SMTP ...)

    4. 找到有意义的文档
    5. 我是否错误地使用mail或错误地使用了某些内容?

    6. 我一直在浏览其他一些图书馆,我在另一篇SO帖子中看到Pony和{{1}},但我不确定我是不是只是遇到同样的问题...

      帮助表示赞赏。

      其他参考资料

      我已经完成了其他SO问题,包括但不限于以下问题。我尝试了他们的一些建议,但他们似乎并不适合我。

      1. Ruby Net::SMTP - Send email with bcc: recipients

      2. Email subject not correctly assigned with Ruby net/smtp

2 个答案:

答案 0 :(得分:0)

最好使用&#34; actionmailer&#34;或者&#34; mail&#34;宝石。两者都有很好的文档。

https://github.com/rails/rails/tree/master/actionmailer

https://github.com/mikel/mail

答案 1 :(得分:0)

我最后放弃使用mailfactory代替尝试mail,但我遇到了文档中没有涉及的问题。基于doc的示例如下:

Mail.defaults do
  delivery_method :smtp, address: 'smtp.domain.com', port: 25
end

Net::SMTPServerBusy例外而失败:

/usr/lib/ruby/2.1.0/net/smtp.rb:957:in `check_response': 450 4.7.1 <localhost.localdomain>: Helo command rejected: Service temporarily unavailable (Net::SMTPServerBusy)

出于某种原因,它坚持使用 localhost 而不是address键指定的指定服务器。这看起来像是mail (2.6.3)给我的一个错误......虽然我可能会遗漏一些东西。

相反,我必须添加:domain => 'domain.com'对以解决问题,如下所示:

options = {
  :address => 'smtp.domain.com',
  :port    => 25,
  :domain  => 'domain.com'  # <<-- required
}

Mail.defaults do
  delivery_method :smtp, options
end

This this SO post有助于搞清楚这一点。

EDIT-1:虽然这在测试环境中有效,但生产环境仍然存在问题。完全解决后,我会更新这篇文章。

EDIT-2:事实证明,SMTP服务器导致Net::SMTPFatalError异常,错误消息为Relay access denied。我不确定为什么会这样,但它似乎是IT部门如何配置服务器的副作用。

相反,要解决Net::SMTPFatalError我必须使用已配置为允许将电子邮件转发到内部地址的其他内部SMTP服务器。

昨天在生产中运行程序后,以前丢失的电子邮件开始按预期显示。