diff --git a/app/models/channel/filter/database.rb b/app/models/channel/filter/database.rb index aea04d4f6..822638950 100644 --- a/app/models/channel/filter/database.rb +++ b/app/models/channel/filter/database.rb @@ -13,13 +13,13 @@ module Channel::Filter::Database min_one_rule_exists = false filter[:match].each { |key, meta| begin - next if !meta || !meta['value'] || meta['value'].empty? + next if meta.blank? || meta['value'].blank? min_one_rule_exists = true - scan = [] - if mail - scan = mail[ key.downcase.to_sym ].scan(/#{meta['value']}/i) + has_matched = false + if mail[ key.downcase.to_sym ].present? && mail[ key.downcase.to_sym ] =~ /#{meta['value']}/i + has_matched = true end - if scan[0] + if has_matched if meta[:operator] == 'contains not' all_matches_ok = false end diff --git a/test/unit/email_postmaster_test.rb b/test/unit/email_postmaster_test.rb index 82e0134c5..afffb22be 100644 --- a/test/unit/email_postmaster_test.rb +++ b/test/unit/email_postmaster_test.rb @@ -396,6 +396,101 @@ Some Text' assert_equal('2 normal', ticket.priority.name) PostmasterFilter.destroy_all + PostmasterFilter.create!( + name: 'Autoresponder', + match: { + 'auto-submitted' => { + 'operator' => 'contains not', + 'value' => 'auto-generated', + }, + 'from' => { + 'operator' => 'contains', + 'value' => '@example.com', + } + }, + perform: { + 'x-zammad-article-internal' => { + 'value' => 'true', + }, + 'x-zammad-article-type_id' => { + 'value' => Ticket::Article::Type.find_by(name: 'note').id.to_s, + }, + 'x-zammad-ignore' => { + 'value' => 'false', + }, + }, + channel: 'email', + active: true, + created_by_id: 1, + updated_by_id: 1, + ) + + data = 'From: ME Bob +To: customer@example.com +Subject: some subject + +Some Text' + + parser = Channel::EmailParser.new + ticket, article, user = parser.process({ group_id: group_default.id, trusted: false }, data) + assert_equal('Users', ticket.group.name) + assert_equal('2 normal', ticket.priority.name) + assert_equal('some subject', ticket.title) + assert_equal('me@example.com', ticket.customer.email) + assert_equal('2 normal', ticket.priority.name) + + assert_equal('Customer', article.sender.name) + assert_equal('note', article.type.name) + assert_equal(true, article.internal) + + PostmasterFilter.destroy_all + PostmasterFilter.create!( + name: 'Autoresponder', + match: { + 'auto-submitted' => { + 'operator' => 'contains', + 'value' => 'auto-generated', + }, + 'from' => { + 'operator' => 'contains', + 'value' => '@example.com', + } + }, + perform: { + 'x-zammad-article-internal' => { + 'value' => 'true', + }, + 'x-zammad-article-type_id' => { + 'value' => Ticket::Article::Type.find_by(name: 'note').id.to_s, + }, + 'x-zammad-ignore' => { + 'value' => 'false', + }, + }, + channel: 'email', + active: true, + created_by_id: 1, + updated_by_id: 1, + ) + + data = 'From: ME Bob +To: customer@example.com +Subject: some subject + +Some Text' + + parser = Channel::EmailParser.new + ticket, article, user = parser.process({ group_id: group_default.id, trusted: false }, data) + assert_equal('Users', ticket.group.name) + assert_equal('2 normal', ticket.priority.name) + assert_equal('some subject', ticket.title) + assert_equal('me@example.com', ticket.customer.email) + assert_equal('2 normal', ticket.priority.name) + + assert_equal('Customer', article.sender.name) + assert_equal('email', article.type.name) + assert_equal(false, article.internal) + end end