Fixed issue #731 - Do not import own notification emails in Zammad.

This commit is contained in:
Martin Edenhofer 2017-02-03 17:42:57 +01:00
commit f0ff543bfb
6 changed files with 82 additions and 2 deletions

View file

@ -0,0 +1,20 @@
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
module Channel::Filter::OwnNotificationLoopDetection
def self.run(_channel, mail)
message_id = mail['message-id'.to_sym]
return if !message_id
recedence = mail['precedence'.to_sym]
return if !recedence
return if recedence !~ /bulk/i
fqdn = Setting.get('fqdn')
return if message_id !~ /@#{Regexp.quote(fqdn)}>/i
mail[ 'x-zammad-ignore'.to_sym ] = true
Rails.logger.info "Detected onw sent notification mail and dropped it to prevent loops (message_id: #{message_id}, from: #{mail[:from]}, to: #{mail[:to]})"
end
end

View file

@ -206,6 +206,7 @@ class Transaction::Notification
current_user: current_user, current_user: current_user,
changes: changes, changes: changes,
}, },
message_id: "<notification.#{DateTime.current.to_s(:number)}.#{ticket.id}.#{user.id}.#{rand(999_999)}@#{Setting.get('fqdn')}>",
references: ticket.get_references, references: ticket.get_references,
main_object: ticket, main_object: ticket,
attachments: attachments, attachments: attachments,

View file

@ -0,0 +1,18 @@
class DoNotImportOnwNotifications731 < ActiveRecord::Migration
def up
# return if it's a new setup
return if !Setting.find_by(name: 'system_init_done')
Setting.create_if_not_exists(
title: 'Define postmaster filter.',
name: '0014_postmaster_filter_own_notification_loop_detection',
area: 'Postmaster::PreFilter',
description: 'Define postmaster filter to check if email is a own created notification email, then ignore it to prevent email loops.',
options: {},
state: 'Channel::Filter::OwnNotificationLoopDetection',
frontend: false
)
end
end

View file

@ -2200,6 +2200,15 @@ Setting.create_if_not_exists(
state: 'Channel::Filter::SenderIsSystemAddress', state: 'Channel::Filter::SenderIsSystemAddress',
frontend: false frontend: false
) )
Setting.create_if_not_exists(
title: 'Defines postmaster filter.',
name: '0014_postmaster_filter_own_notification_loop_detection',
area: 'Postmaster::PreFilter',
description: 'Define postmaster filter to check if email is a own created notification email, then ignore it to prevent email loops.',
options: {},
state: 'Channel::Filter::OwnNotificationLoopDetection',
frontend: false
)
Setting.create_if_not_exists( Setting.create_if_not_exists(
title: 'Defines postmaster filter.', title: 'Defines postmaster filter.',
name: '0015_postmaster_filter_identify_sender', name: '0015_postmaster_filter_identify_sender',

View file

@ -90,7 +90,8 @@ returns
subject: 'sime subject', subject: 'sime subject',
body: 'some body', body: 'some body',
content_type: '', # optional, e. g. 'text/html' content_type: '', # optional, e. g. 'text/html'
references: ['message-id123', 'message-id456'], message_id: '<some_message_id@fqdn>', # optional
references: ['message-id123', 'message-id456'], # optional
attachments: [attachments...], # optional attachments: [attachments...], # optional
) )
@ -113,6 +114,7 @@ returns
from: sender, from: sender,
to: data[:recipient][:email], to: data[:recipient][:email],
subject: data[:subject], subject: data[:subject],
message_id: data[:message_id],
references: data[:references], references: data[:references],
body: data[:body], body: data[:body],
content_type: content_type, content_type: content_type,
@ -131,7 +133,8 @@ returns
recipient: User.find(2), recipient: User.find(2),
}, },
main_object: ticket.find(123), # optional main_object: ticket.find(123), # optional
references: ['message-id123', 'message-id456'], message_id: '<some_message_id@fqdn>', # optional
references: ['message-id123', 'message-id456'], # optional
standalone: true, # default: false - will send header & footer standalone: true, # default: false - will send header & footer
attachments: [attachments...], # optional attachments: [attachments...], # optional
) )
@ -158,6 +161,7 @@ returns
subject: result[:subject], subject: result[:subject],
body: result[:body], body: result[:body],
content_type: 'text/html', content_type: 'text/html',
message_id: data[:message_id],
references: data[:references], references: data[:references],
attachments: data[:attachments], attachments: data[:attachments],
) )

View file

@ -18,6 +18,34 @@ Some Text',
}, },
success: true, success: true,
}, },
{
data: "From: my_own_zammad@example.com
To: customer_which_is_routed_into_my_zammad@example.com
Subject: some subject
Message-ID: <1234@#{Setting.get('fqdn')}>
Some Text",
channel: {
trusted: false,
},
success: true,
},
{
data: "From: my_own_zammad@example.com
To: customer_which_is_routed_into_my_zammad@example.com
Subject: some subject
Message-ID: <1234@#{Setting.get('fqdn')}>
X-Loop: yes
Precedence: bulk
Auto-Submitted: auto-generated
X-Auto-Response-Suppress: All
Some Text",
channel: {
trusted: false,
},
success: false,
},
{ {
data: "From: me@example.com data: "From: me@example.com
To: customer@example.com To: customer@example.com