我的脚本会发送电子邮件以显示用户列表。我需要多线程,因为1个地址中的错误会导致所有应用程序崩溃。这是我的实施:
require 'thread'
<...>
lock = Mutex.new
lock.synchronize {
@model.certs.each{ |user|
@threads << Thread.new(user) { |data|
to = "#{data['name']} #{data['surname']} <#{data['email']}>"
subject = '<Subject>'
body = "<Body>"
view = View.new()
view.to = to
view.body = body
view.subject = subject
view.attachment = ''
view.sendMessage()
@model.sended(data['email'])
}
}
}
@threads.each { |t|
begin
t.join
rescue => err
$log.fatal(err)
end
}
view.sendMessage
包含:
require 'mail'
require 'net/smtp'
<...>
smtp = Net::SMTP.start(@mailserver)
mail = Mail.new()
mail.from = @from
mail.to = @to
mail.subject = @subject
mail.body = @body
if !@attachment.empty?
mail.add_file @attachment
end
mail.delivery_method :smtp_connection, {
:connection => smtp
}
mail.deliver
有时它会出现以下错误:
uninitialized constant Mail::Field::FromField (NameError)
/var/lib/gems/1.8/gems/mail-2.4.4/lib/mail/field.rb:189:in `new_field'
或
uninitialized constant Mail::CommonAddress::AddressList (NameError)
/var/lib/gems/1.8/gems/mail-2.4.4/lib/mail/fields/common/common_address.rb:9:in `parse'
我不知道如何修复它。添加互斥锁没有结果。
答案 0 :(得分:2)
要求在ruby中不是线程安全的。在开始创建线程之前,您应确保已经需要所需的一切。
此外,您的互斥锁目前没有做任何事情。虽然多线程可以很好地适合发送可能由网络延迟主导的电子邮件的活动,但我不会说错误处理是使用多线程的一个原因(如果它使任何事情变得更难)。
答案 1 :(得分:0)
@FrederickCheung关于线程中的require是正确的。另外,你真的需要线程吗?有什么问题:
emails.each do |mail|
begin
mail.deliver
rescue TheCorrectExceptionForInvalidEmails
puts "invalid e-mail: x"
method_to_remove_invalid_email_from_database
end
end
即使你让一个空块用于救援,在无效的电子邮件中,它也会跳转并继续执行。