diff --git a/app/models/channel/email_parser.rb b/app/models/channel/email_parser.rb index 4b5d10bf2..6ddc6d404 100644 --- a/app/models/channel/email_parser.rb +++ b/app/models/channel/email_parser.rb @@ -365,7 +365,7 @@ returns data[:from_local] = mail_address.local data[:from_domain] = mail_address.domain data[:from_display_name] = mail_address.display_name || mail_address.comments&.first - elsif from =~ /^(.+?)<((.+?)@(.+?))>$/ + elsif from =~ /^(.+?)<((.+?)@(.+?))>/ data[:from_email] = $2 data[:from_local] = $3 data[:from_domain] = $4 diff --git a/app/models/channel/filter/identify_sender.rb b/app/models/channel/filter/identify_sender.rb index 5b8984046..6affad4ed 100644 --- a/app/models/channel/filter/identify_sender.rb +++ b/app/models/channel/filter/identify_sender.rb @@ -145,8 +145,9 @@ module Channel::Filter::IdentifySender def self.user_create(data, role_ids = nil) data[:email] += '@local' if !data[:email].match?(/@/) - user = User.find_by(email: data[:email].downcase) || - User.find_by(login: data[:email].downcase) + data[:email] = cleanup_email(data[:email]) + user = User.find_by(email: data[:email]) || + User.find_by(login: data[:email]) # check if firstname or lastname need to be updated if user @@ -194,4 +195,11 @@ module Channel::Filter::IdentifySender string end + def self.cleanup_email(string) + string = string.downcase + string.strip! + string.delete!('"') + string + end + end diff --git a/app/models/user.rb b/app/models/user.rb index 3eb62b450..86d17cd5e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -360,19 +360,24 @@ returns next if local_url.blank? url = local_url end - create!( - login: hash['info']['nickname'] || hash['uid'], - firstname: hash['info']['name'], - email: hash['info']['email'], - image_source: hash['info']['image'], - web: url, - address: hash['info']['location'], - note: hash['info']['description'], - source: hash['provider'], - role_ids: role_ids, - updated_by_id: 1, - created_by_id: 1, - ) + begin + create!( + login: hash['info']['nickname'] || hash['uid'], + firstname: hash['info']['name'], + email: hash['info']['email'], + image_source: hash['info']['image'], + web: url, + address: hash['info']['location'], + note: hash['info']['description'], + source: hash['provider'], + role_ids: role_ids, + updated_by_id: 1, + created_by_id: 1, + ) + rescue => e + logger.error e + raise Exceptions::UnprocessableEntity, e.message + end end =begin @@ -532,10 +537,10 @@ returns return if username.blank? # try to find user based on login - user = User.find_by(login: username.downcase, active: true) + user = User.find_by(login: username.downcase.strip, active: true) # try second lookup with email - user ||= User.find_by(email: username.downcase, active: true) + user ||= User.find_by(email: username.downcase.strip, active: true) # check if email address exists return if !user @@ -829,6 +834,62 @@ returns Cache.delete(key) end +=begin + +try to find correct name + + [firstname, lastname] = User.name_guess('Some Name', 'some.name@example.com') + +=end + + def self.name_guess(string, email = nil) + return if string.blank? && email.blank? + string.strip! + firstname = '' + lastname = '' + + # "Lastname, Firstname" + if string.match?(',') + name = string.split(', ', 2) + if name.count == 2 + if name[0].present? + lastname = name[0].strip + end + if name[1].present? + firstname = name[1].strip + end + return [firstname, lastname] if firstname.present? || lastname.present? + end + end + + # "Firstname Lastname" + if string =~ /^(((Dr\.|Prof\.)[[:space:]]|).+?)[[:space:]](.+?)$/i + if $1.present? + firstname = $1.strip + end + if $4.present? + lastname = $4.strip + end + return [firstname, lastname] if firstname.present? || lastname.present? + end + + # -no name- "firstname.lastname@example.com" + if string.blank? && email.present? + scan = email.scan(/^(.+?)\.(.+?)\@.+?$/) + if scan[0].present? + if scan[0][0].present? + firstname = scan[0][0].strip + end + if scan[0][1].present? + lastname = scan[0][1].strip + end + return [firstname, lastname] if firstname.present? || lastname.present? + end + end + + nil + end + private def check_name @@ -842,43 +903,21 @@ returns return true if firstname.present? && lastname.present? if (firstname.blank? && lastname.present?) || (firstname.present? && lastname.blank?) - - # "Lastname, Firstname" used_name = firstname.presence || lastname - name = used_name.split(', ', 2) - if name.count == 2 - if name[0].present? - self.lastname = name[0] - end - if name[1].present? - self.firstname = name[1] - end - return true - end + (local_firstname, local_lastname) = User.name_guess(used_name, email) - # "Firstname Lastname" - name = used_name.split(' ', 2) - if name.count == 2 - if name[0].present? - self.firstname = name[0] - end - if name[1].present? - self.lastname = name[1] - end - return true - end - - # -no name- "firstname.lastname@example.com" elsif firstname.blank? && lastname.blank? && email.present? - scan = email.scan(/^(.+?)\.(.+?)\@.+?$/) - if scan[0] - if scan[0][0].present? - self.firstname = scan[0][0].capitalize - end - if scan[0][1].present? - self.lastname = scan[0][1].capitalize - end - end + (local_firstname, local_lastname) = User.name_guess('', email) + end + + self.firstname = local_firstname if local_firstname.present? + self.lastname = local_lastname if local_lastname.present? + + if firstname.present? && firstname.match(/^[A-z]+$/) && (firstname.downcase == firstname || firstname.upcase == firstname) + firstname.capitalize! + end + if lastname.present? && lastname.match(/^[A-z]+$/) && (lastname.downcase == lastname || lastname.upcase == lastname) + lastname.capitalize! end true end diff --git a/test/unit/email_process_test.rb b/test/unit/email_process_test.rb index 5819e8a2a..a6d1bd319 100644 --- a/test/unit/email_process_test.rb +++ b/test/unit/email_process_test.rb @@ -172,6 +172,237 @@ Some Textäöü".encode('ISO-8859-1'), }, }, }, + { + data: 'From: Bob Smith > +To: zammad@example.com +Subject: abc some subject + +Some Text with stange from line', + channel: { + trusted: false, + }, + success: true, + result: { + 0 => { + priority: '2 normal', + title: 'abc some subject', + }, + 1 => { + body: 'Some Text with stange from line', + sender: 'Customer', + type: 'email', + internal: false, + }, + }, + verify: { + users: [ + { + firstname: 'Bob', + lastname: 'Smith', + fullname: 'Bob Smith', + email: 'customer_with_blank_at_end@example.com', + }, + ], + }, + }, + { + data: 'From: dr. daniel rodriguez +To: zammad@example.com +Subject: abc some subject + +Some Text with stange from line', + channel: { + trusted: false, + }, + success: true, + result: { + 0 => { + priority: '2 normal', + title: 'abc some subject', + }, + 1 => { + body: 'Some Text with stange from line', + sender: 'Customer', + type: 'email', + internal: false, + }, + }, + verify: { + users: [ + { + firstname: 'dr. daniel', + lastname: 'Rodriguez', + fullname: 'dr. daniel Rodriguez', + email: 'info_dr_daniel@example.de', + }, + ], + }, + }, + { + data: 'From: Dr. Daniel Rodriguez +To: zammad@example.com +Subject: abc some subject + +Some Text with stange from line', + channel: { + trusted: false, + }, + success: true, + result: { + 0 => { + priority: '2 normal', + title: 'abc some subject', + }, + 1 => { + body: 'Some Text with stange from line', + sender: 'Customer', + type: 'email', + internal: false, + }, + }, + verify: { + users: [ + { + firstname: 'Dr. Daniel', + lastname: 'Rodriguez', + fullname: 'Dr. Daniel Rodriguez', + email: 'info_dr_daniel_r@example.de', + }, + ], + }, + }, + { + data: 'From: akademie@example.com> +To: zammad@example.com +Subject: abc some subject + +Some Text with stange from line', + channel: { + trusted: false, + }, + success: true, + result: { + 0 => { + priority: '2 normal', + title: 'abc some subject', + }, + 1 => { + body: 'Some Text with stange from line', + sender: 'Customer', + type: 'email', + internal: false, + }, + }, + verify: { + users: [ + { + firstname: 'akademie@example.com>', + lastname: '', + fullname: 'akademie@example.com>', + email: 'ilka.mueller@example.com', + }, + ], + }, + }, + { + data: 'From: yann degran +To: zammad@example.com +Subject: test name in downcase #1 + +test name in downcase #1', + channel: { + trusted: false, + }, + success: true, + result: { + 0 => { + priority: '2 normal', + title: 'test name in downcase #1', + }, + 1 => { + body: 'test name in downcase #1', + sender: 'Customer', + type: 'email', + internal: false, + }, + }, + verify: { + users: [ + { + firstname: 'Yann', + lastname: 'Degran', + fullname: 'Yann Degran', + email: 'yann@example.com', + }, + ], + }, + }, + { + data: 'From: yann Degran +To: zammad@example.com +Subject: test name in downcase #2 + +test name in downcase #2', + channel: { + trusted: false, + }, + success: true, + result: { + 0 => { + priority: '2 normal', + title: 'test name in downcase #2', + }, + 1 => { + body: 'test name in downcase #2', + sender: 'Customer', + type: 'email', + internal: false, + }, + }, + verify: { + users: [ + { + firstname: 'Yann', + lastname: 'Degran', + fullname: 'Yann Degran', + email: 'yann2@example.com', + }, + ], + }, + }, + { + data: 'From: YANN DEGRAN +To: zammad@example.com +Subject: test name in downcase #3 + +test name in downcase #3', + channel: { + trusted: false, + }, + success: true, + result: { + 0 => { + priority: '2 normal', + title: 'test name in downcase #3', + }, + 1 => { + body: 'test name in downcase #3', + sender: 'Customer', + type: 'email', + internal: false, + }, + }, + verify: { + users: [ + { + firstname: 'Yann', + lastname: 'Degran', + fullname: 'Yann Degran', + email: 'yann3@example.com', + }, + ], + }, + }, { data: "From: Realname To: customer@example.com @@ -226,9 +457,9 @@ Some Text", verify: { users: [ { - firstname: 'max', + firstname: 'Max', lastname: '', - fullname: 'max', + fullname: 'Max', email: 'somebody_else@example.com', }, { @@ -2354,9 +2585,9 @@ Some Text', verify: { users: [ { - firstname: 'bertha mou', - lastname: '', - fullname: 'bertha mou', + firstname: 'Bertha', + lastname: 'Mou', + fullname: 'Bertha Mou', email: 'zhengkang@ha.chinamobile.com', }, ], @@ -2404,8 +2635,8 @@ Some Text', { firstname: '', lastname: '', - fullname: '"finances8@firstfinanceloanfirm.example.com"', - email: '"finances8@firstfinanceloanfirm.example.com"', + fullname: 'finances8@firstfinanceloanfirm.example.com', + email: 'finances8@firstfinanceloanfirm.example.com', }, ], } @@ -2560,9 +2791,9 @@ Some Text', verify: { users: [ { - firstname: 'EXAMPLE', + firstname: 'Example', lastname: 'HotPriceMail', - fullname: 'EXAMPLE HotPriceMail', + fullname: 'Example HotPriceMail', email: 'anja.weber@example.de', }, ],