From 09dca3b50a25104a51969e94a6eb978d1d397996 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Mon, 12 Jan 2015 11:55:13 +0100 Subject: [PATCH] Improved email parsing, added tests. --- app/models/channel/email_parser.rb | 15 +++- test/fixtures/mail30.box | 82 +++++++++++++++++++ test/unit/email_parser_test.rb | 45 +++++++++++ test/unit/email_process_test.rb | 122 +++++++++++++++++++---------- 4 files changed, 217 insertions(+), 47 deletions(-) create mode 100644 test/fixtures/mail30.box diff --git a/app/models/channel/email_parser.rb b/app/models/channel/email_parser.rb index 1d76f988a..4653bec9c 100644 --- a/app/models/channel/email_parser.rb +++ b/app/models/channel/email_parser.rb @@ -66,7 +66,14 @@ class Channel::EmailParser # set all headers mail.header.fields.each { |field| - data[field.name.to_s.downcase.to_sym] = Encode.conv( 'utf8', field.to_s ) + if field.name + + # full line, encode, ready for storage + data[field.name.to_s.downcase.to_sym] = Encode.conv( 'utf8', field.to_s ) + + # if we need to access the lines by objects later again + data[ "raw-#{field.name.downcase.to_s}".to_sym ] = field + end } # get sender @@ -367,9 +374,9 @@ class Channel::EmailParser end # create to and cc user - ['to', 'cc'].each { |item| - if mail[item.to_sym] - items = Mail::AddressList.new( mail[item.to_sym] ) + ['raw-to', 'raw-cc'].each { |item| + if mail[item.to_sym] && mail[item.to_sym].tree + items = mail[item.to_sym].tree items.addresses.each {|item| user_create( :firstname => item.display_name, diff --git a/test/fixtures/mail30.box b/test/fixtures/mail30.box new file mode 100644 index 000000000..65788b322 --- /dev/null +++ b/test/fixtures/mail30.box @@ -0,0 +1,82 @@ +From Manfred.Haert@example.com Fri Jan 9 14:19:00 2015 +Return-Path: +X-Original-To: info@znuny.inc +Delivered-To: znuny-sales@arber.znuny.inc +Received: from mprox01.example.com (mail.example.com [194.113.173.37]) + by arber.znuny.inc (Postfix) with ESMTP id DDC3C5FEBB + for ; Fri, 9 Jan 2015 14:18:59 +0100 (CET) +Message-ID: <54AFD538.10306@example.com> +Date: Fri, 9 Jan 2015 14:18:48 +0100 +From: Manfred Haert +MIME-Version: 1.0 +To: +CC: =?UTF-8?Q?Bert_J=c3=b6rg?= , + "Test, + Karl-Heinz" +Subject: Antragswesen in TesT abbilden +Content-Type: text/html; charset="UTF-8" +Content-Transfer-Encoding: 8bit +X-UID: 2208 +Status: RO +Content-Length: 3214 +Lines: 64 + + + + + + + + Sehr geehrte Damen und + Herren,
+
+ wir hatten bereits letztes Jahr einen TesT-Workshop mit Ihrem + Herrn XXX durchgeführt und würden nun gerne erneut + Ihre Dienste in Anspruch nehmen.
+
+ Mittlerweile setzen wir TesT produktiv ein und würden nun gerne an + einem Anwendungsfall (Change-Management) die Machbarkeit des + Abbildens eines derzeit "per Papier" durchgeführten Antragswesens + in TesT prüfen wollen.
+
+ Wir bitten gerne um ein entsprechendes Angebot.
+
+ Für Rückfragen stehe ich gerne zur Verfügung. Vielen Dank!
+
+
+
--
+ + + Freundliche Grüße
+ i.A. Manfred Härt
+
+ Test Somewhere GmbH
+ Ferdinand-Straße 99
+ 99073 Korlben
+ Bitte beachten Sie die neuen Rufnummern!
+ Telefon: 011261 00000-2460
+ Fax: 011261 0000-7460
+ mailto:manfred.haertel@example.com
+ http://www.example.com
+ JETZT AUCH BEI FACEBOOK !
+ https://www.facebook.com/test
+ ___________________________________
+ Test Somewhere GmbH
+
+

Diese + e-Mail ist ausschließlich für den beabsichtigten Empfänger + bestimmt. Sollten Sie irrtümlich diese e-Mail erhalten + haben, unterrichten Sie uns bitte umgehend unter + kontakt@example.com und vernichten Sie diese Mitteilung + einschließlich der ggf. beigefügten Dateien.
+ Weil wir die Echtheit oder Vollständigkeit der in dieser + Nachricht enthaltenen Informationen nicht garantieren + können, bitten wir um Verständnis, dass wir zu Ihrem und + unserem Schutz die rechtliche Verbindlichkeit der + vorstehenden Erklärungen ausschließen, soweit wir mit + Ihnen keine anders lautenden Vereinbarungen getroffen + haben.

+
+ + + diff --git a/test/unit/email_parser_test.rb b/test/unit/email_parser_test.rb index 222fa42b1..36f934366 100644 --- a/test/unit/email_parser_test.rb +++ b/test/unit/email_parser_test.rb @@ -598,6 +598,51 @@ Registration AG Ulm HRB 534075 * General Manager Holger Felgner [3] http://www.teamviewer.com", }, }, + { + :data => IO.read('test/fixtures/mail30.box'), + :body_md5 => 'bba63e2dbe29e7b82d893c2554ff466a', + :params => { + :from => 'Manfred Haert ', + :from_email => 'Manfred.Haert@example.com', + :from_display_name => "Manfred Haert", + :subject => "Antragswesen in TesT abbilden", + :to => 'info@znuny.inc', + :body => "Sehr geehrte Damen undHerren, + +wir hatten bereits letztes Jahr einen TesT-Workshop mit IhremHerrn XXX durchgeführt und würden nun gerne erneutIhre Dienste in Anspruch nehmen. + +Mittlerweile setzen wir TesT produktiv ein und würden nun gerne aneinem Anwendungsfall (Change-Management) die Machbarkeit desAbbildens eines derzeit \"per Papier\" durchgeführten Antragswesensin TesT prüfen wollen. + +Wir bitten gerne um ein entsprechendes Angebot. + +Für Rückfragen stehe ich gerne zur Verfügung. Vielen Dank! + +-- + Freundliche Grüße +i.A. Manfred Härt + +Test Somewhere GmbH +Ferdinand-Straße 99 +99073 Korlben +Bitte beachten Sie die neuen Rufnummern! +Telefon: 011261 00000-2460 +Fax: 011261 0000-7460 +[1] mailto:manfred.haertel@example.com +[2] http://www.example.com +JETZT AUCH BEI FACEBOOK ! +[3] https://www.facebook.com/test +___________________________________ +Test Somewhere GmbH + Diesee-Mail ist ausschließlich für den beabsichtigten Empfängerbestimmt. Sollten Sie irrtümlich diese e-Mail erhaltenhaben, unterrichten Sie uns bitte umgehend unter[4] kontakt@example.com und vernichten Sie diese Mitteilungeinschließlich der ggf. beigefügten Dateien. +Weil wir die Echtheit oder Vollständigkeit der in dieserNachricht enthaltenen Informationen nicht garantierenkönnen, bitten wir um Verständnis, dass wir zu Ihrem undunserem Schutz die rechtliche Verbindlichkeit dervorstehenden Erklärungen ausschließen, soweit wir mitIhnen keine anders lautenden Vereinbarungen getroffenhaben. + + +[1] mailto:manfred.haertel@example.com +[2] http://www.example.com +[3] https://www.facebook.com/test +[4] mailto:kontakt@example.com", + }, + }, ] files.each { |file| diff --git a/test/unit/email_process_test.rb b/test/unit/email_process_test.rb index 1101e10b9..9bead59fb 100644 --- a/test/unit/email_process_test.rb +++ b/test/unit/email_process_test.rb @@ -1823,6 +1823,85 @@ AElFTkSuQmCC }, }, }, + { + :data => 'From: Some Body +To: Bob +Cc: any@example.com +Subject: some subject + +Some Text', + :trusted => false, + :success => true, + :result => { + 0 => { + :group => 'Users', + :priority => '2 normal', + :title => 'some subject', + }, + 1 => { + :sender => 'Customer', + :type => 'email', + }, + }, + :verify => { + :users => [ + { + :firstname => 'Some', + :lastname => 'Body', + :email => 'somebody@example.com', + }, + { + :firstname => 'Bob', + :lastname => '', + :fullname => 'Bob', + :email => 'bod@example.com', + }, + { + :firstname => '', + :lastname => '', + :email => 'any@example.com', + :fullname => 'any@example.com', + }, + ], + } + }, + { + :data => IO.read('test/fixtures/mail30.box'), + :success => true, + :result => { + 0 => { + :priority => '2 normal', + :title => 'Antragswesen in TesT abbilden', + }, + 1 => { + :sender => 'Customer', + :type => 'email', + }, + }, + :verify => { + :users => [ + { + :firstname => 'Bert', + :lastname => 'Jörg', + :fullname => 'Bert Jörg', + :email => 'joerg.bert@example.com', + }, + { + :firstname => 'Karl-Heinz', + :lastname => 'Test', + :fullname => 'Karl-Heinz Test', + :email => 'karl-heinz.test@example.com', + }, + { + :firstname => 'Manfred', + :lastname => 'Haert', + :email => 'manfred.haert@example.com', + :fullname => 'Manfred Haert', + }, + ], + } + + }, ] process(files) end @@ -1971,49 +2050,6 @@ Some Text', }, }, }, - { - :data => 'From: Some Body -To: Bob -Cc: any@example.com -Subject: some subject - -Some Text', - :trusted => false, - :success => true, - :result => { - 0 => { - :group => group2.name, - :priority => '2 normal', - :title => 'some subject', - }, - 1 => { - :sender => 'Customer', - :type => 'email', - :internal => true, - }, - }, - :verify => { - :users => [ - { - :firstname => 'Some', - :lastname => 'Body', - :email => 'somebody@example.com', - }, - { - :firstname => 'Bob', - :lastname => '', - :fullname => 'Bob', - :email => 'bod@example.com', - }, - { - :firstname => '', - :lastname => '', - :email => 'any@example.com', - :fullname => 'any@example.com', - }, - ], - } - }, ] process(files) PostmasterFilter.destroy_all