# frozen_string_literal: true module Email class Cleaner def initialize(mail, remove_attachments: true, truncate: true, rejected: false) @mail = Mail.new(mail) @mail.charset = 'UTF-8' @remove_attachments = remove_attachments @truncate = truncate @rejected = rejected end def execute @mail.without_attachments! if @remove_attachments truncate! if @truncate remove_null_byte(@mail.to_s) end def self.delete_rejected! IncomingEmail.delete_by('rejection_message IS NOT NULL AND created_at < ?', SiteSetting.delete_rejected_email_after_days.days.ago) end private def truncate! parts.each { |part| part.body = part.body.decoded.truncate(truncate_limit, omission: '') } end def parts @mail.multipart? ? @mail.parts : [@mail] end def truncate_limit @rejected ? SiteSetting.raw_rejected_email_max_length : SiteSetting.raw_email_max_length end def remove_null_byte(message) message.gsub!("\x00", "") message end end end