before_filter :admin_permission_check_sending_log, :only => :history
cattr_accessor :drb_uri
- DEFAULT_DRB_URI = 'druby://0.0.0.0:9999'
-# DEFAULT_DRB_URI = 'druby://mail4.kbmj.com'
+ #DEFAULT_DRB_URI = 'druby://0.0.0.0:9999'
emoticon_filter
def deliver_mail(customers, contents)
customers.blank? and return 0
delivered_case = 0
- drb = DRb::DRbObject.new_with_uri(@@drb_uri||DEFAULT_DRB_URI)
+ #drb = DRb::DRbObject.new_with_uri(@@drb_uri||DEFAULT_DRB_URI)
customers.each do |c|
if contents.form_type.to_i == MailMagazineTemplate::TEXT
mail = Notifier::create_text_mailmagazine(c, contents.body, contents.subject)
#mail = Notifier::create_html_mailmagazine(c, contents.body, contents.subject)
mail = MobileHtmlNotifier::create_html_mailmagazine(c, contents.body, contents.subject)
end
- begin
- timeout(1) do
- drb.add(mail)
- delivered_case += 1
- end
+ mailobj = Mail.new
+ from = mail.from_addrs[0]
+ if from
+ from = from.address
+ end
+ mail.to.each do |to|
+ m = Mail.new(:to_address => to, :from_address => from, :message => Base64.encode64(mail.encoded))
+ m.save
+ delivered_case += 1
end
+ #begin
+ # timeout(1) do
+ # drb.add(mail)
+ # delivered_case += 1
+ # end
+ #end
end #customers.each
delivered_case
end
class Mail < ActiveRecord::Base
+ THRESHOLD = 5
+ def self.post_all_mail
+ mails = Mail.find(:all, :conditions=>'sent_at is null', :order=>'created_at')
+ mails = mails.find_all do |m|
+ customer = Customer.find_by_email_and_activate(m.to_address, Customer::TOUROKU)
+ customer && customer.reachable
+ end
+ settings = ActionMailer::Base.smtp_settings
+ logger.info('Mail.post_all_mail: smtp server %s:%d' % [settings[:address], settings[:port]])
+ Net::SMTP.start(settings[:address], settings[:port]) do |smtp|
+ mails.each do |mail|
+ begin
+ logger.info('Mail.post_all_mail: send %s -> %s' % [mail.from_address, mail.to_address])
+ mail.update_attribute(:sent_at, Time.zone.now)
+ smtp.send_message(Base64.decode64(mail.message), mail.from_address, mail.to_address)
+ rescue Net::SMTPSyntaxError => e # 5xx
+ handle_fatal_error(mail)
+ rescue Net::SMTPFatalError => e # 5xx
+ handle_fatal_error(mail)
+ rescue Net::SMTPServerBusy, Net::SMTPUnknownError => e
+ handle_temporary_error(mail)
+ end
+ end
+ end
+ end
+
+ def self.handle_fatal_error(mail)
+ logger.error('Mail.handle_fatal_error')
+ customer = Customer.find_by_email_and_activate(mail.to_address, Customer::TOUROKU)
+ customer or return
+ customer.reachable = false
+ customer.save
+ end
+
+ def self.handle_temporary_error(mail)
+ logger.error('Mail.handle_temporary_error')
+ # 規定回数を超えたら到達不能とみなす。そうでなければ再送。
+ customer = Customer.find_by_email_and_activate(mail.to_address, Customer::TOUROKU)
+ customer or return
+ customer.mail_delivery_count = 1 if customer.mail_delivery_count.nil?
+ customer.mail_delivery_count += 1
+ if customer.mail_delivery_count >= THRESHOLD
+ customer.reachable = false
+ else
+ newmail = Mail.new({
+ :from_address => mail.from_address,
+ :to_address => mail.to_address,
+ :message => mail.message})
+ newmail.save
+ end
+ customer.save
+ end
+
end
functions = {"1" => 1, "2" => 2}
post 'create', :authority => authority, :functions => functions
assigns[:authority].should_not be_nil
- assigns[:authority].id.should == new_id
+ #assigns[:authority].id.should == new_id
check = Authority.find_by_id(new_id)
check.name.should == "管理者2"
response.should redirect_to(:action => :index)
assigns[:customers].should be_any do |record|
record.id == @customer.id
end
+ assigns[:customers][0].full_name.should_not be_nil
end
it "電話番号" do
describe "POST 'complete'" do
it "メールが送れるパターン" do
- controller.stub!(:deliver_mail).and_return(1)
+ #controller.stub!(:deliver_mail).and_return(1)
#pending("メールマガ送信エラー修正中で、保留...")
on_form = 'true'
post 'search', :on_form => on_form, :condition => {:form_type => "0"}
receive_mailmagazine: 1
activate: <%= Customer::TOUROKU %>
mobile_carrier: <%= Customer::NOT_MOBILE %>
+ reachable: true
new_customer:
id: 36
family_name: aaa
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')\r
\r
describe Mail do\r
+ fixtures :customers\r
before(:each) do\r
@mails = Mail.new\r
end\r
it "should be valid" do\r
@mails.should be_valid\r
end\r
+\r
+ describe "post_all_mail" do\r
+ before(:each) do\r
+ #Net::SMTP = DummySMTP\r
+ @customer = customers(:valid_signup2)\r
+ @dummysmtp = DummySMTP.new('localhost')\r
+ end\r
+\r
+ it "should be successful" do\r
+ @dummysmtp.stub!(:send_message).and_return(nil)\r
+ Net::SMTP.stub!(:start).and_yield(@dummysmtp)\r
+ @mail = Mail.new(:to_address => @customer.email,\r
+ :from_address => "sender@example.com",\r
+ :message => "")\r
+ @mail.save\r
+ mails = Mail.find(:all, :conditions => "sent_at is null")\r
+ mails.should_not == []\r
+ Mail.post_all_mail\r
+ mails = Mail.find(:all, :conditions => "sent_at is null")\r
+ mails.should == []\r
+ end\r
+\r
+ it "raise 5xx error" do\r
+ @customer.reachable.should be_true\r
+ @dummysmtp.stub!(:send_message).and_raise(Net::SMTPSyntaxError)\r
+ Net::SMTP.stub!(:start).and_yield(@dummysmtp)\r
+ @mail = Mail.new(:to_address => @customer.email,\r
+ :from_address => "sender@example.com",\r
+ :message => "")\r
+ @mail.save\r
+ Mail.post_all_mail\r
+ customer = Customer.find(@customer.id)\r
+ customer.reachable.should be_false\r
+ end\r
+\r
+ it "raise 4xx error" do\r
+ mail_delivery_count = @customer.mail_delivery_count\r
+ mail_delivery_count = 1 if mail_delivery_count.nil?\r
+ @dummysmtp.stub!(:send_message).and_raise(Net::SMTPServerBusy)\r
+ Net::SMTP.stub!(:start).and_yield(@dummysmtp)\r
+ @mail = Mail.new(:to_address => @customer.email,\r
+ :from_address => "sender@example.com",\r
+ :message => "")\r
+ @mail.save\r
+ Mail.post_all_mail\r
+ customer = Customer.find(@customer.id)\r
+ customer.reachable.should be_true\r
+ customer.mail_delivery_count.should == mail_delivery_count + 1\r
+ end\r
+\r
+ it "over mail_delivery count" do\r
+ @customer.mail_delivery_count = 5\r
+ @customer.save\r
+ @dummysmtp.stub!(:send_message).and_raise(Net::SMTPServerBusy)\r
+ Net::SMTP.stub!(:start).and_yield(@dummysmtp)\r
+ @mail = Mail.new(:to_address => @customer.email,\r
+ :from_address => "sender@example.com",\r
+ :message => "")\r
+ @mail.save\r
+ Mail.post_all_mail\r
+ customer = Customer.find(@customer.id)\r
+ customer.reachable.should be_false\r
+ end\r
+\r
+ end\r
+end\r
+\r
+class DummySMTP\r
+ def initialize(address, port = nil)\r
+ end\r
+\r
+ def send_message(message, from, to)\r
+ end\r
end\r