当我尝试将地址包含在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_addr
和cc_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包含单个字符串,它仍然无法正常工作。
这里还有一些我直接观察到的事情:
当我puts mail.to_s
到终端时,邮件标题似乎没问题(即我看到地址,包括CCs - 见下面的示例);
当用户回复收到的其中一封电子邮件时,所有地址都清楚地列在CC字段中,即使似乎没有人收到它们(至少我知道我没有);
其他非Ruby程序使用相同的SMTP服务器(由IT管理)来发送电子邮件,包括CC,并且没有问题;
程序正常运行(即没有出现警告或错误消息);
电子邮件地址有效,即使我一次收到一个此类地址的邮件递送通知失败(还没有再看到,似乎是IT方面的一次性问题)
尝试join
To:
字段中的to
个地址不起作用。 (源代码似乎将To:
字段限制为单个地址。)
我已经检查了其他参考/示例,但它们非常简单,专注于单个From:
,puts mail.to_s
等等。因为这似乎对我有用,所以&# 39;没有用。
以下是由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 ';'
下面的标题是使用
生成的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
中的人
关于我在这里可能缺少什么的想法?
我应该使用mailfactory
吗? (最近注意到一些回购w /他们最后一次提交8年前+ ...)
如果这已被弃用/废弃,它有什么替代品,我在哪里可以找到它+ docs / examples? (我没有为Net::SMTP
...)
我是否错误地使用mail
或错误地使用了某些内容?
我一直在浏览其他一些图书馆,我在另一篇SO帖子中看到Pony
和{{1}},但我不确定我是不是只是遇到同样的问题...
帮助表示赞赏。
我已经完成了其他SO问题,包括但不限于以下问题。我尝试了他们的一些建议,但他们似乎并不适合我。
答案 0 :(得分:0)
最好使用&#34; actionmailer&#34;或者&#34; mail&#34;宝石。两者都有很好的文档。
答案 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服务器。
昨天在生产中运行程序后,以前丢失的电子邮件开始按预期显示。