diff --git a/app/controllers/admin/e_paper_criterias_controller.rb b/app/controllers/admin/e_paper_criterias_controller.rb index d25d0f9..de4ac13 100644 --- a/app/controllers/admin/e_paper_criterias_controller.rb +++ b/app/controllers/admin/e_paper_criterias_controller.rb @@ -56,18 +56,24 @@ def initialize def send_newsletter Orbit::Application.load_tasks - locale = I18n.locale - Thread.new do - begin - rake = Rake::Task['epaper:send_email'].execute(OpenStruct.new({:paper_criteria_id => params[:id], :domain => request.host_with_port, :locale => locale})) - rescue => e - puts [e,e.backtrace] - end - end + rake = Rake::Task['epaper:send_email'].execute(OpenStruct.new({:paper_criteria_id => params[:id], :domain => request.host_with_port, :locale => I18n.locale})) # rake = Rake::Task['epaper:send_email'].invoke([params[:id], request.host_with_port]) - render :json => {"success" => true}.to_json + paper = PaperCriteria.find(params[:id]) rescue nil + if !paper.nil? && paper.invalid_emails.blank? + render :json => {"success" => true}.to_json + else + invalid_email_list = paper.invalid_emails rescue 'can not find paper' + render :json => {"success" => false,"invalid_emails"=>invalid_email_list}.to_json + end + end + def get_failed_emails + send_failed_emails = PaperCriteria.find(params[:id]).send_failed_emails rescue nil + render :json => {'data' => (send_failed_emails.blank? ? 'None' : send_failed_emails)} + end + def get_invalid_emails + invalid_emails = PaperCriteria.find(params[:id]).invalid_emails rescue nil + render :json => {'data' => (invalid_emails.blank? ? 'None' : invalid_emails)} end - private def paper_criteria_params diff --git a/app/models/paper_criteria.rb b/app/models/paper_criteria.rb index a927f1e..cb83668 100644 --- a/app/models/paper_criteria.rb +++ b/app/models/paper_criteria.rb @@ -13,8 +13,8 @@ class PaperCriteria field :language_to_send, type: Array, :default => ["en","zh_tw"] field :receivers, type: Array, :default => ["subscriber"] field :other_emails - - + field :invalid_emails, type: Array, :default => [] + field :send_failed_emails, type: Array, :default => [] def epaper_topics tmp = EPaperTopic.where(:period.gte => self.start_date.in_time_zone(Time.zone.utc_offset / 3600), :period.lte => self.end_date.in_time_zone(Time.zone.utc_offset / 3600)).can_display tmp = EPaperTopic.where(:period.gte => self.start_date.in_time_zone(Time.zone.utc_offset / 3600), :period.lte => self.end_date.in_time_zone(Time.zone.utc_offset / 3600)).limit(1) if tmp.first.nil? diff --git a/app/views/admin/e_paper_criterias/_index.html.erb b/app/views/admin/e_paper_criterias/_index.html.erb index 514e631..8de8b73 100644 --- a/app/views/admin/e_paper_criterias/_index.html.erb +++ b/app/views/admin/e_paper_criterias/_index.html.erb @@ -16,6 +16,8 @@
  • <%= t(:edit) %>
  • <%= t('e_paper.test_mail') %>
  • <%= t('e_paper.send_newsletter') %>
  • +
  • <%= t('e_paper.get_failed_emails') %>
  • +
  • <%= t('e_paper.get_invalid_emails') %>
  • <%= t(:delete_) %>
  • @@ -25,6 +27,7 @@ <% end %> +
    <%= content_tag :div, paginate(@criterias), class: "pagination pagination-centered" %>
    @@ -33,7 +36,16 @@
    + \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index 69681c4..9c9fef0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1,7 +1,9 @@ en: module_name: e_paper: "ePaper" - e_paper: + e_paper: + get_invalid_emails: get invalid email + get_failed_emails: get sended-failed emails e_paper: "ePaper" all_articles: All Articles title: Title diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index fcb14d9..1c39424 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -1,7 +1,9 @@ zh_tw: module_name: e_paper: 電子報 - e_paper: + e_paper: + get_invalid_emails: 顯示格式錯誤的email + get_failed_emails: 顯示寄送失敗的email e_paper: "電子報" title: "文章標題" publish_date: "發行日期" diff --git a/config/routes.rb b/config/routes.rb index ef59198..17006f7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,6 +8,8 @@ Rails.application.routes.draw do member do get "send_test_email" get "send_newsletter" + get "get_failed_emails" + get "get_invalid_emails" end end resources :e_paper_subscribers diff --git a/lib/tasks/e_paper_tasks.rake b/lib/tasks/e_paper_tasks.rake index 8253cac..738841f 100644 --- a/lib/tasks/e_paper_tasks.rake +++ b/lib/tasks/e_paper_tasks.rake @@ -6,6 +6,7 @@ namespace :epaper do papers_data = Admin::EpaperHelper.get_paper_data(paper) domain = args[:domain] if !paper.nil? + email_format = /^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$/ subscribers = EPaperSubscriber.where(:language.in=>paper.language_to_send,:email.nin=>['',nil]) subscribers.update_all(:last_paper_sent => paper.id.to_s) emails = subscribers.collect(&:email) @@ -13,15 +14,27 @@ namespace :epaper do email_limit_reciever = site[:site_settings][:email_limit_reciever].to_i rescue 0 mail_limit = email_limit_reciever==0 ? 25 : email_limit_reciever emails += paper.other_emails_ids - emails.each_slice(mail_limit).each do |slice_emails| - email = Email.new(:mail_subject => paper.sending_title, :mail_lang => args[:locale], :template => "admin/e_paper_criterias/emailer", :template_data => {"paper" => paper, "page" => "http://" + domain + page, "siteurl" => "http://" + domain, "papers_data" => papers_data }, :mail_to => slice_emails) - begin - email.deliver - puts "Sending #{slice_emails.count} emails" - rescue => e - puts [slice_emails.inspect,e,e.backtrace] - end + emails_valid = emails.select do |email| + tmp = (email_format=~email) + tmp==0 ? true : false end + emails_invalid = emails - emails_valid + paper.send_failed_emails = [] + Thread.new do + tmp = [] + emails_valid.each_slice(mail_limit).each do |slice_emails| + email = Email.new(:mail_subject => paper.sending_title, :mail_lang => args[:locale], :template => "admin/e_paper_criterias/emailer", :template_data => {"paper" => paper, "page" => "http://" + domain + page, "siteurl" => "http://" + domain, "papers_data" => papers_data }, :mail_to => slice_emails) + begin + email.deliver + puts "Sending #{slice_emails.count} emails" + rescue => e + puts [slice_emails.inspect,e,e.backtrace] + tmp += slice_emails + end + end + paper.update_attributes(:send_failed_emails => tmp) + end + paper.invalid_emails = emails_invalid paper.save end end