From 791c9c96b5c1a900e33258304730d6636b6d8082 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Sat, 5 May 2012 11:24:05 +0200 Subject: [PATCH] Improved charset handling of mail parsing. --- app/models/channel/email_parser.rb | 22 +- test/fixtures/mail3.box | 433 +++++++++++++++++++++++++++++ test/unit/email_parser_test.rb | 12 +- 3 files changed, 459 insertions(+), 8 deletions(-) create mode 100644 test/fixtures/mail3.box diff --git a/app/models/channel/email_parser.rb b/app/models/channel/email_parser.rb index a5e882395..b259e715f 100644 --- a/app/models/channel/email_parser.rb +++ b/app/models/channel/email_parser.rb @@ -16,15 +16,23 @@ class Channel::EmailParser data = {} mail = Mail.new( msg ) - # headers - data[:from_email] = Mail::Address.new( mail[:from].value ).address - data[:from_display_name] = Mail::Address.new( mail[:from].value ).display_name - ['from', 'to', 'cc', 'subject'].each {|key| - data[key.to_sym] = mail[key] ? mail[key].to_s : nil + # set all headers + mail.header.fields.each { |field| + data[field.name.downcase.to_sym] = field.to_s } - # message id - data[:message_id] = mail['message_id'] ? mail['message_id'].to_s : nil + # set extra headers + data[:from_email] = Mail::Address.new( mail[:from].value ).address + data[:from_local] = Mail::Address.new( mail[:from].value ).local + data[:from_domain] = Mail::Address.new( mail[:from].value ).domain + data[:from_display_name] = Mail::Address.new( mail[:from].value ).display_name + + # do extra decoding because we needed to use field.value + data[:from_display_name] = Mail::Field.new( 'X-From', data[:from_display_name] ).to_s + + # compat headers + data[:message_id] = data['message-id'.to_sym] + puts data.inspect # body # plain_part = mail.multipart? ? (mail.text_part ? mail.text_part.body.decoded : nil) : mail.body.decoded diff --git a/test/fixtures/mail3.box b/test/fixtures/mail3.box new file mode 100644 index 000000000..b15d14c6d --- /dev/null +++ b/test/fixtures/mail3.box @@ -0,0 +1,433 @@ +Return-Path: +X-Original-To: me@example.com +Delivered-To: martin@samba.example.com +X-Greylist: delayed 80660 seconds by postgrey-1.32 at samba; Fri, 04 May 2012 08:12:40 BST +Received: from smtprelay02.example.com (smtprelay02.example.com [8.6.1.1]) + by samba.example.com (Postfix) with ESMTP id 91B9A500D3D + for ; Fri, 4 May 2012 08:12:40 +0100 (BST) +Received: from [1.1.0.2] (helo=exchange.eu) + by smtprelay02.example.com with esmtps (TLSv1:RC4-MD5:128) + (Exim 4.68) + (envelope-from ) + id 1SQCh0-0008V2-7x + for me@example.com; Fri, 04 May 2012 09:12:42 +0200 +Received: from ECR04PUBLIC.exchange.local ([1.1.2.4]) by + efe02.exchange.local ([1.1.0.2]) with mapi; Fri, 4 May 2012 09:12:42 +0200 +From: =?iso-8859-1?Q?G=FCnther_John_=7C_Example_GmbH?= + +To: Fritz Bauer +Date: Fri, 4 May 2012 09:12:46 +0200 +Subject: Ticket Templates +Thread-Topic: Ticket Templates +Thread-Index: Ac0pEkehxk8anBjgRfSXKBLb2B04CAAstiNQ +Message-ID: +References: + <970531F2D9256C459C026FC3137B0BBD012D6F13@Exchange2.example.com> + + <2B0ECF06-5BF6-483F-902A-BD19B99B8D68@example.com> +In-Reply-To: <2B0ECF06-5BF6-483F-902A-BD19B99B8D68@example.com> +Accept-Language: de-DE +Content-Language: de-DE +X-MS-Has-Attach: +X-MS-TNEF-Correlator: +acceptlanguage: de-DE +Content-Type: multipart/alternative; + boundary="_000_F799DA4E63A20B4EBE9D5A412196D71D3CADBE9DF6ECCR04PUBLICe_" +MIME-Version: 1.0 + +--_000_F799DA4E63A20B4EBE9D5A412196D71D3CADBE9DF6ECCR04PUBLICe_ +Content-Type: text/plain; charset="iso-8859-1" +Content-Transfer-Encoding: quoted-printable + +Hallo Fritz, + +ich m=F6chte mich gern f=FCr den Beta-Test f=FCr die Ticket Templates unter= + XXXX 2.4 anmelden. + + +Mit freundlichen Gr=FC=DFen +John G=FCnther + +example.com - profitieren S= +ie vom umfangreichen Daten-Netzwerk + +_ __ ___ ____________________________ ___ __ _ + +Example GmbH +Some What + +Sitz: Someware-Stra=DFe 9, XXXXX Someware + +M: +49 (0) XXX XX XX 70 +T: +49 (0) XXX XX XX 22 +F: +49 (0) XXX XX XX 11 +W: www.example.com + +Gesch=E4ftsf=FChrer: John Smith +HRB XXXXXX AG Someware +St.-Nr.: XXX/XXX/XXXXX + +ISO 9001:2008 Zertifiziert -Qualit=E4tsstandard mit Zukunft +_ __ ___ ____________________________ ___ __ _ + +Diese Information ist ausschlie=DFlich f=FCr den Adressaten bestimmt und ka= +nn vertrauliche oder gesetzlich gesch=FCtzte Informationen enthalten. Wenn = +Sie nicht der bestimmungsgem=E4=DFe Adressat sind, unterrichten Sie bitte d= +en Absender und vernichten Sie diese Mail. Anderen als dem bestimmungsgem= +=E4=DFen Adressaten ist es untersagt, diese E-Mail zu lesen, zu speichern, = +weiterzuleiten oder ihren Inhalt auf welche Weise auch immer zu verwenden. + +Von: Fritz Bauer [mailto:me@example.com] +Gesendet: Donnerstag, 3. Mai 2012 11:51 +An: John Smith +Cc: Smith, John Marian; johnel.stock@example.com; ole.brei@example.com= +; G=FCnther John | Example GmbH; bkopon@example.com; john.heisterhagen@tea= +m.example.com; sven.rocked@example.com; michael.house@example.com; t= +gutzeit@example.com +Betreff: Re: XXXX::XXX Erweiterung - Anh=E4nge an CI's + +Hallo, + +ich versuche an den Punkten anzukn=FCpfen. + +a) LDAP Muster Konfigdatei + +https://wiki.lab.example.com/doku.php?id=3Dxxxx:start&#ldap + +PS: Es gibt noch eine Reihe weiterer M=F6glichkeiten, vor allem im Bezug au= +f Agenten-Rechte/LDAP Gruppen Synchronisation. Wenn Ihr hier weitere Inform= +ationen ben=F6tigt, einfach im Wiki die Aufgabenbeschreibung rein machen un= +d ich kann eine Beispiel-Config dazu legen. + + +b) Ticket Templates +Wir haben das Paket vom alten Maintainer =FCbernommen, es l=E4uft nun auf O= +TRS 2.4, XXXX 3.0 und XXXX 3.1. Wir haben das Paket um weitere Funktionen e= +rg=E4nzt und w=FCrden es gerne hier in diesen Kreis zum Beta-Test bereit st= +ellen. + +Vorgehen: +Wer Interesse hat, bitte eine Email an mich und ich versende Zug=E4nge zu d= +en Beta-Test-Systemen. Nach ca. 2 Wochen werden wir die Erweiterungen in de= +r Version 1.0 ver=F6ffentlichen. + + +c) XXXX Entwickler Schulung +Weil es immer wieder Thema war, falls jemand Interesse hat, das XXXX = +bietet nun auch XXXX Entwickler Schulungen an (http://www.example.com/kur= +s/xxxx_entwickler/). + + +d) Genelle Fragen? +Haben sich beim ein oder anderen generell noch Fragen aufgetan? + + +Viele Gr=FC=DFe! + +-Fritz +On May 2, 2012, at 14:25 , John Smith wrote: + + +Moin Moin, + +die Antwort ist zwar etwas sp=E4t, aber nach der Schulung war ich krank und= + danach +hatte ich viel zu tun auf der Arbeit, sodass ich keine Zeit f=FCr XXXX hatt= +e. +Ich denke das ist allgemein das Problem, wenn sowas nebenbei gemacht werden= + muss. + +Wie auch immer, danke f=FCr die mail mit dem XXX Zusatz auch wenn das zur = +Zeit bei der Example nicht relevant ist. + +Ich habe im XXXX Wiki den Punkt um die Vorlagen angef=FCgt. +Ticket Template von John B=E4cker +Bei uns habe ich das Ticket Template von John B=E4cker in der Version 0.1.= +96 unter XXXX 3.0.10 implementiert. + +Fritz wollte sich auch um das andere Ticket Template Modul k=FCmmern und u= +ns zur Verf=FCgung stellen, welches unter XXXX 3.0 nicht lauff=E4hig sein s= +ollte. + + +Im Wiki kann ich die LDAP Muster Konfigdatei nicht finden. +Hat die jemand von euch zuf=E4lligerweise ? + + +Danke und Gru=DF +John Smith + + +Am 4. April 2012 08:24 schrieb Smith, John Marian >: +Hallo zusammen, + + + +ich hoffe Ihr seid noch gut nach Hause gekommen am Mittwoch. Der XXX Kurs = +Donnerstag und Freitag war noch ganz gut, wobei ich mir den letzten halben = +Tag eigentlich h=E4tte schenken k=F6nnen. + +Soweit ich wei=DF arbeitet Ihr nicht mit XXX? Falls doch habe ich hier ein= +e tolle (eigentlich) kostenpflichtige Erweiterung f=FCr Euch. + +Es handelt sich um eine programmiertes Paket von der XXXX AG. Die Weitergab= +e ist legal. + +Mit dem Paket kann man Anh=E4nge an CI's (Configuration Items) verkn=FCpfen= +. Das ist sehr praktisch wenn man zum Beispiel Rechnungen an Server, Comput= +ern und und und anh=E4ngen m=F6chte. + + + +Der Dank geht an Frank Linden, der uns das Paket kostenlos zur Verf=FCgung = +gestellt hat. + + + +Viele Gr=FC=DFe aus Someware + + + +John + +_________________________ +SysAdmin +John Marian Smith +IT-Management + +Example GmbH & Co. KG +Der Provider f=FCr +Mehrwertdienste & YYY + +Someware 23 +XXXXX Someware + +Tel. (01802) XX XX XX - 42 +Fax (01802) XX XX XX - 99 +nur 6 Cent je Anruf aus dem dt. Festnetz, +max. 42 Cent pro Min. aus dem Mobilfunknetz + +E-Mail john.smith@Example.de +Web www.Example.de +Amtsgericht Someware HRA xxxxxxxx +Komplement=E4rin: Example Verwaltungs- GmbH +Vertreten durch: Somebody, Somebody +Amtsgericht Someware HRB XXX XXX + +_________________________ +Highlights der Example Contact Center-Suite: +Virtual XXX&Power-XXX, Self-Services&XXX-Portale, +XXX-/Web-Kundenbefragungen, CRM, PEP, YYY + +--_000_F799DA4E63A20B4EBE9D5A412196D71D3CADBE9DF6ECCR04PUBLICe_ +Content-Type: text/html; charset="iso-8859-1" +Content-Transfer-Encoding: quoted-printable + + +

Hallo Marti= +n,

 

ich m=F6chte mich gern f=FCr den Beta-Test= + f=FCr die Ticket Templates unter XXXX 2.4 anmelden.

<= +p class=3DMsoNormal> 

<= +o:p> 

Mit freundlichen Gr=FC=DFen

John G=FCnther

 

example.com – profitieren Sie vom umfangreichen Daten-Netzwerk

 

_ __ = +___ ____________________________ ___ __ _

 

Example GmbH

Some What

 

Sitz: Someware-Stra=DFe = +9, XXXXX Someware

 

M: +49 (0)=A0 XXX XX XX 70

T: +49 (0) XXX XX XX 22

F: = ++49 (0) XXX XX XX 11

W: www.brain-scc= +.de

 

Gesch=E4ftsf=FChrer: John Smith

HRB XXXXXX AG Someware

St.-Nr.: 112= +/107/05858

 

<= +p class=3DMsoNormal>ISO 9001:2008 Zertifiziert -Qualit=E4tsstandard mit Zukunft

_ __ ___ ____________________________ ___= + __ _

 

Diese Information ist ausschlie=DFlich f=FCr den Adressaten bestimm= +t und kann vertrauliche oder gesetzlich gesch=FCtzte Informationen enthalte= +n. Wenn Sie nicht der bestimmungsgem=E4=DFe Adressat sind, unterrichten Sie= + bitte den Absender und vernichten Sie diese Mail. Anderen als dem bestimmu= +ngsgem=E4=DFen Adressaten ist es untersagt, diese E-Mail zu lesen, zu speic= +hern, weiterzuleiten oder ihren Inhalt auf welche Weise auch immer zu verwe= +nden.

 

Von: Fritz Bauer [mailt= +o:me@example.com]
Gesendet: Donnerstag, 3. Mai 2012 11:51
An: John Smith
Cc: Smith, John Marian; johnel.fratcz= +ak@example.com; ole.brei@example.com; G=FCnther John | Example GmbH; bko= +pon@example.com; john.heisterhagen@team.example.com; sven.rocked@example.com;= + michael.house@example.com; tgutzeit@example.com
Betreff: Re: O= +TRS::XXX Erweiterung - Anh=E4nge an CI's

= +

 

Hallo,<= +/o:p>

 

ich versuche an den Punkten anzukn=FCpfen. 

 

a) LDAP Muster Konfigdatei

 

 

PS: Es gibt noch eine Reihe weiterer M=F6glichkeiten= +, vor allem im Bezug auf Agenten-Rechte/LDAP Gruppen Synchronisation. Wenn = +Ihr hier weitere Informationen ben=F6tigt, einfach im Wiki die Aufgabenbesc= +hreibung rein machen und ich kann eine Beispiel-Config dazu legen.

 

 

b) = +Ticket Templates

Wir habe= +n das Paket vom alten Maintainer =FCbernommen, es l=E4uft nun auf XXXX 2.4,= + XXXX 3.0 und XXXX 3.1. Wir haben das Paket um weitere Funktionen erg=E4nzt= + und w=FCrden es gerne hier in diesen Kreis zum Beta-Test bereit stellen.&n= +bsp;

 

Vorgehen:

Wer Interesse hat, bitte eine Email an mich und ich versende Zug= +=E4nge zu den Beta-Test-Systemen. Nach ca. 2 Wochen werden wir die Erweiter= +ungen in der Version 1.0 ver=F6ffentlichen.

 

&n= +bsp;

c) XXXX Entwickler Schulun= +g

Weil es immer wieder Th= +ema war, falls jemand Interesse hat, das XXXX bietet nun auch OT= +RS Entwickler Schulungen an (http://www.example.com/kurs/xxxx_entwickler/).

 

 

d) G= +enelle Fragen?

Haben sich= + beim ein oder anderen generell noch Fragen aufgetan?

<= +div>

 

 

Viele Gr=FC=DFe!

 

-Fritz

On May 2, 2012, at 14:25 , John Smith= + wrote:


Moin Moin,

di= +e Antwort ist zwar etwas sp=E4t, aber nach der Schulung war ich krank und d= +anach
hatte ich viel zu tun auf der Arbeit, sodass ich keine Zeit f=FCr = +XXXX hatte.
Ich denke das ist allgemein das Problem, wenn sowas nebenbei= + gemacht werden muss.

Wie auch immer, danke f=FCr die mail mit dem I= +TSM Zusatz auch wenn das zur Zeit bei der Example nicht relevant ist.
Ich habe im XXXX Wiki den Punkt um die Vorlagen angef=FCgt.
= +Ticket Template von John B=E4cker
Bei uns habe ich das Ticket Template = +von John B=E4cker in der Version 0.1.96 unter XXXX 3.0.10 implementie= +rt. 

Fritz wollte sich auch um das andere Ticket Template Modu= +l k=FCmmern und uns zur Verf=FCgung stellen, welches unter XXXX 3.0 nicht l= +auff=E4hig sein sollte.


Im Wiki kann ich die LDAP Muster Konfigd= +atei nicht finden.
Hat die jemand von euch zuf=E4lligerweise ?

Danke und Gru=DF
John Smith


Am 4. April 2012 08:24 schrieb = +Smith, John Marian <john.hin= +z@example.com>:
Hallo zusammen,

 

ich hoffe Ihr se= +id noch gut nach Hause gekommen am Mittwoch. Der XXX Kurs Donnerstag und F= +reitag war noch ganz gut, wobei ich mir den letzten halben Tag eigentlich h= +=E4tte schenken k=F6nnen.

Soweit ich wei=DF arbeitet Ihr nicht = +mit XXX? Falls doch habe ich hier eine tolle (eigentlich) kostenpflichtige= + Erweiterung f=FCr Euch.

Es handelt sich um eine programmiertes Pake= +t von der XXXX AG. Die Weitergabe ist legal.

Mit dem Paket kann man = +Anh=E4nge an CI’s (Configuration Items) verkn=FCpfen. Das ist sehr pr= +aktisch wenn man zum Beispiel Rechnungen an Server, Computern und und und a= +nh=E4ngen m=F6chte.

 

Der Dank geht an Frank Linden= +, der uns das Paket kostenlos zur Verf=FCgung gestellt hat.

 
Viele Gr=FC=DFe aus Someware

 

John

_______= +__________________
SysAdmin
John Marian Smith
IT-Mana= +gement

Example GmbH & Co. KG
Der Provider f=FCr
Mehrwertdiens= +te & YYY

Someware 23
XXXXX Someware
<= +br>Tel. (01802) XX XX XX - 42
Fax (01802) XX XX XX - 99
nur 6 Cent je= + Anruf aus dem dt. Festnetz,
max. 42 Cent pro Min. aus dem Mobilfunknetz= +

E-Mail john.smith@Example.deWeb www.Example.de
Amtsgericht Ha= +nnover HRA xxxxxxxx
Komplement=E4rin: Example Verwaltungs- GmbH
Vertreten = +durch: Somebody, Somebody
Amtsgericht Someware HRB XXX XXX
_________________________ 
Highlights der Example Contact Center-Suit= +e:
Virtual XXX&Power-XXX, Self-Services&XXX-Portale,
XXX= +-/Web-Kundenbefragungen, CRM, PEP, YYY

= + +--_000_F799DA4E63A20B4EBE9D5A412196D71D3CADBE9DF6ECCR04PUBLICe_-- diff --git a/test/unit/email_parser_test.rb b/test/unit/email_parser_test.rb index 89032c365..77c03aedc 100644 --- a/test/unit/email_parser_test.rb +++ b/test/unit/email_parser_test.rb @@ -25,6 +25,16 @@ class EmailParserTest < ActiveSupport::TestCase :plain_part => "äöüß ad asd\r\n\r\n-Martin\r\n\r\n--\r\nOld programmers never die. They just branch to a new address.", }, }, + { + :data => IO.read('test/fixtures/mail3.box'), + :body_md5 => '0914848466334919eb33ad4de79d6189', + :params => { + :from => '"Günther John | Example GmbH" ', + :from_email => 'k.guenther@example.com', + :from_display_name => 'Günther John | Example GmbH', + :subject => 'Ticket Templates', + }, + }, ] files.each { |file| @@ -35,7 +45,7 @@ class EmailParserTest < ActiveSupport::TestCase # check body md5 = Digest::MD5.hexdigest( data[:plain_part] ) assert_equal( file[:body_md5], md5 ) - + puts data[:from] # check params file[:params].each { |key, value| if key.to_s == 'plain_part'