Fixed issue #2423 - Unable to update already configured email channel, verify email will not arrive.
This commit is contained in:
parent
dadb8e207b
commit
6faaee3a97
3 changed files with 77 additions and 10 deletions
|
@ -145,11 +145,12 @@ example
|
||||||
end
|
end
|
||||||
|
|
||||||
# check how many content messages we have, for notice used
|
# check how many content messages we have, for notice used
|
||||||
header = message_meta['RFC822.HEADER']
|
headers = parse_headers(message_meta['RFC822.HEADER'])
|
||||||
if header && header !~ /x-zammad-ignore/i
|
next if messages_is_verify_message?(headers)
|
||||||
content_messages += 1
|
next if messages_is_ignore_message?(headers)
|
||||||
break if content_max_check < content_messages
|
|
||||||
end
|
content_messages += 1
|
||||||
|
break if content_max_check < content_messages
|
||||||
end
|
end
|
||||||
if content_messages >= content_max_check
|
if content_messages >= content_max_check
|
||||||
content_messages = message_ids.count
|
content_messages = message_ids.count
|
||||||
|
@ -207,9 +208,12 @@ example
|
||||||
|
|
||||||
message_meta = nil
|
message_meta = nil
|
||||||
timeout(1.minute) do
|
timeout(1.minute) do
|
||||||
message_meta = @imap.fetch(message_id, ['RFC822.SIZE', 'ENVELOPE', 'FLAGS', 'INTERNALDATE'])[0]
|
message_meta = @imap.fetch(message_id, ['RFC822.SIZE', 'ENVELOPE', 'FLAGS', 'INTERNALDATE', 'RFC822.HEADER'])[0]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# ignore verify messages
|
||||||
|
next if !messages_is_too_old_verify?(message_meta, count, count_all)
|
||||||
|
|
||||||
# ignore to big messages
|
# ignore to big messages
|
||||||
info = too_big?(message_meta, count, count_all)
|
info = too_big?(message_meta, count, count_all)
|
||||||
if info
|
if info
|
||||||
|
@ -283,6 +287,50 @@ returns
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def messages_is_too_old_verify?(message_meta, count, count_all)
|
||||||
|
headers = parse_headers(message_meta.attr['RFC822.HEADER'])
|
||||||
|
return true if !messages_is_verify_message?(headers)
|
||||||
|
return true if headers['X-Zammad-Verify-Time'].blank?
|
||||||
|
|
||||||
|
begin
|
||||||
|
verify_time = Time.zone.parse(headers['X-Zammad-Verify-Time'])
|
||||||
|
rescue => e
|
||||||
|
Rails.logger.error e
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return true if verify_time < Time.zone.now - 30.minutes
|
||||||
|
|
||||||
|
Rails.logger.info " - ignore message #{count}/#{count_all} - because message has a verify message"
|
||||||
|
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def messages_is_verify_message?(headers)
|
||||||
|
return true if headers['X-Zammad-Verify'] == 'true'
|
||||||
|
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def messages_is_ignore_message?(headers)
|
||||||
|
return true if headers['X-Zammad-Ignore'] == 'true'
|
||||||
|
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def parse_headers(string)
|
||||||
|
return {} if string.blank?
|
||||||
|
|
||||||
|
headers = {}
|
||||||
|
headers_pairs = string.split("\r\n")
|
||||||
|
headers_pairs.each do |pair|
|
||||||
|
key_value = pair.split(': ')
|
||||||
|
next if key_value[0].blank?
|
||||||
|
|
||||||
|
headers[key_value[0]] = key_value[1]
|
||||||
|
end
|
||||||
|
headers
|
||||||
|
end
|
||||||
|
|
||||||
# rubocop:disable Metrics/ParameterLists
|
# rubocop:disable Metrics/ParameterLists
|
||||||
def already_imported?(message_id, message_meta, count, count_all, keep_on_server, channel)
|
def already_imported?(message_id, message_meta, count, count_all, keep_on_server, channel)
|
||||||
# rubocop:enable Metrics/ParameterLists
|
# rubocop:enable Metrics/ParameterLists
|
||||||
|
|
|
@ -91,7 +91,7 @@ returns
|
||||||
next if !mail
|
next if !mail
|
||||||
|
|
||||||
# check how many content messages we have, for notice used
|
# check how many content messages we have, for notice used
|
||||||
if !mail.match?(/x-zammad-ignore/i)
|
if !mail.match?(/(X-Zammad-Ignore: true|X-Zammad-Verify: true)/)
|
||||||
content_messages += 1
|
content_messages += 1
|
||||||
break if content_max_check < content_messages
|
break if content_max_check < content_messages
|
||||||
end
|
end
|
||||||
|
@ -112,7 +112,7 @@ returns
|
||||||
mails.reverse!
|
mails.reverse!
|
||||||
|
|
||||||
# check for verify message
|
# check for verify message
|
||||||
mails.each do |m|
|
mails.first(2000).each do |m|
|
||||||
mail = m.pop
|
mail = m.pop
|
||||||
next if !mail
|
next if !mail
|
||||||
|
|
||||||
|
@ -137,12 +137,28 @@ returns
|
||||||
count = 0
|
count = 0
|
||||||
count_fetched = 0
|
count_fetched = 0
|
||||||
notice = ''
|
notice = ''
|
||||||
mails.each do |m|
|
mails.first(2000).each do |m|
|
||||||
count += 1
|
count += 1
|
||||||
Rails.logger.info " - message #{count}/#{count_all}"
|
Rails.logger.info " - message #{count}/#{count_all}"
|
||||||
mail = m.pop
|
mail = m.pop
|
||||||
next if !mail
|
next if !mail
|
||||||
|
|
||||||
|
# ignore verify messages
|
||||||
|
if mail.match?(/(X-Zammad-Ignore: true|X-Zammad-Verify: true)/)
|
||||||
|
if mail =~ /X-Zammad-Verify-Time:\s(.+?)\s/
|
||||||
|
begin
|
||||||
|
verify_time = Time.zone.parse($1)
|
||||||
|
if verify_time > Time.zone.now - 30.minutes
|
||||||
|
info = " - ignore message #{count}/#{count_all} - because it's a verify message"
|
||||||
|
Rails.logger.info info
|
||||||
|
next
|
||||||
|
end
|
||||||
|
rescue => e
|
||||||
|
Rails.logger.error e
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# ignore to big messages
|
# ignore to big messages
|
||||||
max_message_size = Setting.get('postmaster_max_size').to_f
|
max_message_size = Setting.get('postmaster_max_size').to_f
|
||||||
real_message_size = mail.size.to_f / 1024 / 1024
|
real_message_size = mail.size.to_f / 1024 / 1024
|
||||||
|
|
|
@ -308,10 +308,13 @@ returns on fail
|
||||||
body: "This is a Test Email of Zammad to verify if Zammad can send emails to an external address.\n\nIf you see this email, you can ignore and delete it.",
|
body: "This is a Test Email of Zammad to verify if Zammad can send emails to an external address.\n\nIf you see this email, you can ignore and delete it.",
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
if subject
|
if subject.present?
|
||||||
mail['X-Zammad-Test-Message'] = subject
|
mail['X-Zammad-Test-Message'] = subject
|
||||||
end
|
end
|
||||||
mail['X-Zammad-Ignore'] = 'true'
|
mail['X-Zammad-Ignore'] = 'true'
|
||||||
|
mail['X-Zammad-Fqdn'] = Setting.get('fqdn')
|
||||||
|
mail['X-Zammad-Verify'] = 'true'
|
||||||
|
mail['X-Zammad-Verify-Time'] = Time.zone.now.iso8601
|
||||||
mail['X-Loop'] = 'yes'
|
mail['X-Loop'] = 'yes'
|
||||||
mail['Precedence'] = 'bulk'
|
mail['Precedence'] = 'bulk'
|
||||||
mail['Auto-Submitted'] = 'auto-generated'
|
mail['Auto-Submitted'] = 'auto-generated'
|
||||||
|
|
Loading…
Reference in a new issue