Просмотр исходного кода

Fixes #5047 - Missing rake task to reparse failed articles with long content.

Co-authored-by: Martin Gruner <mg@zammad.com>
Rolf Schmidt 1 год назад
Родитель
Сommit
59e33badac

+ 27 - 0
app/models/channel/email_parser.rb

@@ -517,6 +517,33 @@ process unprocessable_mails (var/spool/unprocessable_mail/*.eml) again
     files
   end
 
+=begin
+
+process unprocessable articles provided by the HTMLSanitizer.
+
+  Channel::EmailParser.process_unprocessable_articles
+
+=end
+
+  def self.process_unprocessable_articles(_params = {})
+    articles = Ticket::Article.where(body: ::HtmlSanitizer::UNPROCESSABLE_HTML_MSG)
+    articles.find_each do |article|
+      if !article.as_raw&.content
+        puts "No raw content for article id #{article.id}! Please verify manually via command: Ticket::Article.find(#{article.id}).as_raw" # rubocop:disable Rails/Output
+        next
+      end
+
+      puts "Fix article #{article.id}..." # rubocop:disable Rails/Output
+
+      ApplicationHandleInfo.use('email_parser.postmaster') do
+        parsed = Channel::EmailParser.new.parse(article.as_raw.content)
+        article.update!(body: parsed[:body], content_type: parsed[:content_type])
+      end
+    end
+
+    puts "#{articles.count} articles are affected." # rubocop:disable Rails/Output
+  end
+
 =begin
 
   process oversized emails by

+ 13 - 0
lib/tasks/zammad/email_parser/reprocess_articles.rake

@@ -0,0 +1,13 @@
+# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
+
+namespace :zammad do
+
+  namespace :email_parser do
+
+    desc 'Reprocess articles which failed to parse and were saved as unprocessable.'
+    task reprocess_articles: :environment do |_task, _args|
+      Channel::EmailParser.process_unprocessable_articles
+      puts 'done.'
+    end
+  end
+end

+ 13 - 0
lib/tasks/zammad/email_parser/reprocess_mails.rake

@@ -0,0 +1,13 @@
+# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
+
+namespace :zammad do
+
+  namespace :email_parser do
+
+    desc 'Reprocess mails which failed to parse and were saved as unprocessable.'
+    task reprocess_mails: :environment do |_task, _args|
+      Channel::EmailParser.process_unprocessable_mails
+      puts 'done.'
+    end
+  end
+end

+ 24 - 0
spec/models/channel/email_parser/process_unprocessable_articles_spec.rb

@@ -0,0 +1,24 @@
+# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
+
+require 'rails_helper'
+
+RSpec.describe 'Channel::EmailParser#process_unprocessable_articles', aggregate_failures: true, type: :model do
+  context 'when receiving unprocessable article' do
+    before do
+      allow_any_instance_of(HtmlSanitizer::Strict).to receive(:run_sanitization).and_raise(Timeout::Error, HtmlSanitizer::UNPROCESSABLE_HTML_MSG)
+      parser = Channel::EmailParser.new
+      begin
+        parser.process({}, File.read('test/data/mail/mail001.box'))
+      rescue
+        # expected
+      end
+    end
+
+    it 'does reprocess the unprocessable article' do
+      expect(Ticket::Article.last.body).to eq(HtmlSanitizer::UNPROCESSABLE_HTML_MSG)
+      allow_any_instance_of(HtmlSanitizer::Strict).to receive(:run_sanitization).and_call_original
+      Channel::EmailParser.process_unprocessable_articles
+      expect(Ticket::Article.last.body).not_to eq(HtmlSanitizer::UNPROCESSABLE_HTML_MSG)
+    end
+  end
+end