Improved email processing and cleaning up firstname/lastname detection.
This commit is contained in:
parent
673b7c3d65
commit
ef179bf67b
4 changed files with 339 additions and 61 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -360,6 +360,7 @@ returns
|
|||
next if local_url.blank?
|
||||
url = local_url
|
||||
end
|
||||
begin
|
||||
create!(
|
||||
login: hash['info']['nickname'] || hash['uid'],
|
||||
firstname: hash['info']['name'],
|
||||
|
@ -373,6 +374,10 @@ returns
|
|||
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
|
||||
(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
|
||||
|
|
|
@ -172,6 +172,237 @@ Some Textäöü".encode('ISO-8859-1'),
|
|||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
data: 'From: Bob Smith <customer_with_blank_at_end@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: 'Bob',
|
||||
lastname: 'Smith',
|
||||
fullname: 'Bob Smith',
|
||||
email: 'customer_with_blank_at_end@example.com',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
data: 'From: dr. daniel rodriguez <info_dr_daniel"@example.de>
|
||||
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 <info_dr_daniel_r"@example.de>
|
||||
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> <ilka.mueller@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 <yann@example.com>
|
||||
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 <yann2@example.com>
|
||||
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 <yann3@example.com>
|
||||
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',
|
||||
},
|
||||
],
|
||||
|
|
Loading…
Reference in a new issue