Enabled signature detection for html emails.

This commit is contained in:
Martin Edenhofer 2016-06-28 22:49:38 +02:00
parent a88e6b03b3
commit ca141bbb9b
9 changed files with 768 additions and 51 deletions

View file

@ -91,10 +91,14 @@ class ArticleViewItem extends App.ObserverController
# prepare html body # prepare html body
if article.content_type is 'text/html' if article.content_type is 'text/html'
if article.sender.name is 'Agent' body = article.body
article['html'] = App.Utils.signatureIdentify(article.body, false, true) if article.preferences && article.preferences.signature_detection
else signatureDetected = '<span class="js-signatureMarker"></span>'
article['html'] = App.Utils.signatureIdentify(article.body) body = body.replace(signatureDetected, '')
body = body.split('<br>')
body.splice(article.preferences.signature_detection, 0, signatureDetected)
body = body.join('<br>')
article['html'] = body
else else
# client signature detection # client signature detection
@ -182,13 +186,16 @@ class ArticleViewItem extends App.ObserverController
bubbleOvervlowContainer.css('opacity', '') bubbleOvervlowContainer.css('opacity', '')
# remember offset of "see more" # remember offset of "see more"
offsetTop = bubbleContent.find('.js-signatureMarker').position() signatureMarker = bubbleContent.find('.js-signatureMarker')
if !signatureMarker.get(0)
signatureMarker = bubbleContent.find('div [data-signature=true]')
offsetTop = signatureMarker.position()
# safari - workaround # safari - workaround
# in safari somethimes the marker is directly on top via .top and inspector but it isn't # in safari somethimes the marker is directly on top via .top and inspector but it isn't
# in this case use the next element # in this case use the next element
if offsetTop && offsetTop.top is 0 if offsetTop && offsetTop.top is 0
offsetTop = bubbleContent.find('.js-signatureMarker').next('div, p').position() offsetTop = signatureMarker.next('div, p, br').position()
# remember bubble heigth # remember bubble heigth
heigth = bubbleContent.height() heigth = bubbleContent.height()

View file

@ -44,7 +44,7 @@ class Transaction::SignatureDetection
type = Ticket::Article::Type.lookup(id: article.type_id) type = Ticket::Article::Type.lookup(id: article.type_id)
return if type['name'] != 'email' return if type['name'] != 'email'
# add queue job to update current signature of user id # update current signature of user id
SignatureDetection.rebuild_user(article.created_by_id) SignatureDetection.rebuild_user(article.created_by_id)
# user # user
@ -52,7 +52,11 @@ class Transaction::SignatureDetection
return if !user return if !user
return if !user.preferences return if !user.preferences
return if !user.preferences[:signature_detection] return if !user.preferences[:signature_detection]
article.preferences[:signature_detection] = SignatureDetection.find_signature_line(user.preferences[:signature_detection], article.body) article.preferences[:signature_detection] = SignatureDetection.find_signature_line(
user.preferences[:signature_detection],
article.body,
article.content_type,
)
article.save article.save
end end

View file

@ -287,13 +287,93 @@ class String
=end =end
def html2html_strict def html2html_strict(force = false)
string = html2text(true, true) string = html2text(true, true)
string.signature_identify(force)
string = string.text2html string = string.text2html
string.gsub!(%r{######LINKEXT:(.+?)/TEXT:(.+?)######}, '<a href="\1" target="_blank">\2</a>') string.gsub!(%r{######LINKEXT:(.+?)/TEXT:(.+?)######}, '<a href="\1" target="_blank">\2</a>')
string.gsub!(/######LINKRAW:(.+?)######/, '<a href="\1" target="_blank">\1</a>') string.gsub!(/######LINKRAW:(.+?)######/, '<a href="\1" target="_blank">\1</a>')
marker_template = '<span class="js-signatureMarker"></span>'
string.sub!(/######SIGNATURE_MARKER######/, marker_template)
string.gsub!(/######SIGNATURE_MARKER######/, '')
string.gsub!(/######(.+?)######/, '<\1>') string.gsub!(/######(.+?)######/, '<\1>')
string.chomp string.chomp
end end
def signature_identify(force = false)
string = self
# if we do have less then 10 lines and less then 300 chars ignore this
if !force
lines = string.split("\n")
return if lines.count < 10 && string.length < 300
end
marker = '######SIGNATURE_MARKER######'
# search for signature seperator "--\n"
string.sub!(/^\s{0,2}--\s{0,2}$/) { |placeholder|
placeholder = "#{marker}#{placeholder}"
}
map = {}
# Apple Mail
# On 01/04/15 10:55, Bob Smith wrote:
map['apple-en'] = '^(On)[[:space:]].{6,20}[[:space:]].{3,10}[[:space:]].{1,250}[[:space:]](wrote):'
# Am 03.04.2015 um 20:58 schrieb Martin Edenhofer <me@znuny.ink>:
map['apple-de'] = '^(Am)[[:space:]].{6,20}[[:space:]](um)[[:space:]].{3,10}[[:space:]](schrieb)[[:space:]].{1,250}:'
# Thunderbird
# Am 04.03.2015 um 12:47 schrieb Alf Aardvark:
map['thunderbird-de'] = '^(Am)[[:space:]].{6,20}[[:space:]](um)[[:space:]].{3,10}[[:space:]](schrieb)[[:space:]].{1,250}:'
# Thunderbird default - http://kb.mozillazine.org/Reply_header_settings
# On 01-01-2007 11:00 AM, Alf Aardvark wrote:
map['thunderbird-en-default'] = '^(On)[[:space:]].{6,20}[[:space:]].{3,10},[[:space:]].{1,250}(wrote):'
# http://kb.mozillazine.org/Reply_header_settings
# Alf Aardvark wrote, on 01-01-2007 11:00 AM:
map['thunderbird-en'] = '^.{1,250}[[:space:]](wrote),[[:space:]]on[[:space:]].{3,20}:'
# otrs
# 25.02.2015 10:26 - edv hotline wrote:
# 25.02.2015 10:26 - edv hotline schrieb:
map['otrs-en-de'] = '^.{6,10}[[:space:]].{3,10}[[:space:]]-[[:space:]].{1,250}[[:space:]](wrote|schrieb):'
# Ms
# rubocop:disable Style/AsciiComments
# From: Martin Edenhofer via Znuny Support [mailto:support@znuny.inc]
# Send: Donnerstag, 2. April 2015 10:00
# To/Cc/Bcc: xxx
# Subject: xxx
# - or -
# From: xxx
# To/Cc/Bcc: xxx
# Date: 01.04.2015 12:41
# Subject: xxx
# - or -
# De : xxx
# À/?/?: xxx
# Envoyé : mercredi 29 avril 2015 17:31
# Objet : xxx
# rubocop:enable Style/AsciiComments
# en/de/fr | sometimes ms adds a space to "xx : value"
map['ms-en-de-fr_from'] = '^(From|Von|De)( ?):[[:space:]].+?'
map['ms-en-de-fr_from_html'] = "\n######b######(From|Von|De)([[:space:]]?):([[:space:]]?)(######\/b######)[[:space:]].+?"
# word 14
# edv hotline wrote:
# edv hotline schrieb:
#map['word-en-de'] = "[^#{marker}].{1,250}\s(wrote|schrieb):"
map.each {|_key, regexp|
string.sub!(/#{regexp}/) { |placeholder|
placeholder = "#{marker}#{placeholder}"
}
}
string
end
end end

View file

@ -4,7 +4,14 @@ module SignatureDetection
try to detect the signature in list of articles for example try to detect the signature in list of articles for example
signature = SignatureDetection.find_signature(string_list) messages = [
{
content: 'some content',
content_type: 'text/plain',
},
]
signature = SignatureDetection.find_signature(messages)
returns returns
@ -12,13 +19,22 @@ returns
=end =end
def self.find_signature(string_list) def self.find_signature(messages)
string_list = []
messages.each {|message|
if message[:content_type] =~ %r{text/html}i
string_list.push message[:content].html2text(true)
next
end
string_list.push message[:content]
}
# hash with possible signature and count of matches in string list # hash with possible signature and count of matches in string list
possible_signatures = {} possible_signatures = {}
# loop all strings in array # loop all strings in array
( 0..string_list.length - 1 ).each {|main_string_index| string_list.each_with_index { |_main_string, main_string_index|
break if main_string_index + 1 > string_list.length - 1 break if main_string_index + 1 > string_list.length - 1
# loop all all strings in array except of the previous index # loop all all strings in array except of the previous index
@ -95,7 +111,7 @@ returns
this function will search for a signature string in a string (e.g. article) and return the line number of the signature start this function will search for a signature string in a string (e.g. article) and return the line number of the signature start
signature_line = SignatureDetection.find_signature_line(signature, string) signature_line = SignatureDetection.find_signature_line(signature, message, content_type)
returns returns
@ -107,7 +123,11 @@ returns
=end =end
def self.find_signature_line(signature, string) def self.find_signature_line(signature, string, content_type)
if content_type =~ %r{text/html}i
string = string.html2text(true)
end
# try to find the char position of the signature # try to find the char position of the signature
search_position = string.index(signature) search_position = string.index(signature)
@ -133,12 +153,20 @@ returns
def self.by_user_id(user_id) def self.by_user_id(user_id)
type = Ticket::Article::Type.lookup(name: 'email') type = Ticket::Article::Type.lookup(name: 'email')
sender = Ticket::Article::Sender.lookup(name: 'Customer') sender = Ticket::Article::Sender.lookup(name: 'Customer')
tickets = Ticket.where(
created_by_id: user_id,
create_article_type_id: type.id,
create_article_sender_id: sender.id
).limit(5).order(id: :desc)
article_bodies = [] article_bodies = []
tickets = Ticket.where(created_by_id: user_id, create_article_type_id: type.id, create_article_sender_id: sender.id).limit(5).order(id: :desc)
tickets.each {|ticket| tickets.each {|ticket|
article = ticket.articles.first article = ticket.articles.first
next if !article next if !article
article_bodies.push article.body data = {
content: article.body,
content_type: article.content_type,
}
article_bodies.push data
} }
find_signature(article_bodies) find_signature(article_bodies)
@ -157,7 +185,6 @@ returns
=end =end
def self.rebuild_all_user def self.rebuild_all_user
User.select('id').where(active: true).order(id: :desc).each {|local_user| User.select('id').where(active: true).order(id: :desc).each {|local_user|
rebuild_user(local_user.id) rebuild_user(local_user.id)
} }
@ -209,7 +236,11 @@ returns
user = User.find(article.created_by_id) user = User.find(article.created_by_id)
next if !user.preferences[:signature_detection] next if !user.preferences[:signature_detection]
signature_line = find_signature_line(user.preferences[:signature_detection], article.body) signature_line = find_signature_line(
user.preferences[:signature_detection],
article.body,
article.content_type,
)
next if !signature_line next if !signature_line
next if article.preferences[:signature_detection] == signature_line next if article.preferences[:signature_detection] == signature_line

View file

@ -0,0 +1,155 @@
<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<!-- Template generated by Exclaimer Mail Disclaimers on 08:33:16 Dienstag, 28 Juni 2016 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">P.ImprintUniqueID {
MARGIN: 0cm 0cm 0pt
}
LI.ImprintUniqueID {
MARGIN: 0cm 0cm 0pt
}
DIV.ImprintUniqueID {
MARGIN: 0cm 0cm 0pt
}
TABLE.ImprintUniqueIDTable {
MARGIN: 0cm 0cm 0pt
}
DIV.Section1 {
page: Section1
}
</style>
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:Helvetica;
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
span.E-MailFormatvorlage17
{mso-style-type:personal-reply;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body style="FONT-SIZE: x-small; FONT-FAMILY: Verdana; LINE-HEIGHT: normal; TEXT-INDENT: 0px" lang="DE" link="#0563C1" vlink="#954F72">
<p class="ImprintUniqueID"></p>
<p class="ImprintUniqueID"></p>
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;mso-fareast-language:EN-US">Guten Abend Herr Smith,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;mso-fareast-language:EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;mso-fareast-language:EN-US">die Test-Instanz steht bereit. Sie ist ein Klon der Produktiv-Instanz.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;mso-fareast-language:EN-US">FQDN:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 999sv3902-Test.ad.org-unit.de<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;mso-fareast-language:EN-US">IPv4:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.45.0.140<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;mso-fareast-language:EN-US">Die Anmeldedaten sind mit denen der Produktiv-Instanz identisch.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;mso-fareast-language:EN-US">Alle POP3-Abrufe habe ich entfernt und das Senden von e-mails deaktiviert.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;mso-fareast-language:EN-US"><o:p>&nbsp;</o:p></span></p>
<div></div>
</div>
<br>
<p></p>
<p class="ImprintUniqueID">
<table class="ImprintUniqueIDTable" style="WIDTH: 100%; BORDER-COLLAPSE: collapse" cellspacing="0" cols="2" cellpadding="0" border="0">
<tbody>
<tr style="FONT-SIZE: 8pt">
<td style="FONT-SIZE: 8pt; BORDER-TOP: #cecece 1px solid; FONT-FAMILY: Verdana; WIDTH: 315px; COLOR: #a0a0a0; PADDING-TOP: 10px" valign="top" width="240">
<p class="ImprintUniqueID"><font style="FONT-SIZE: 8pt" color="#cecece" face="Verdana"></font><font style="FONT-SIZE: 8pt" color="#a1a1a1" face="Verdana">
<table style="color: #A0A0A0; font-size: 8pt; font-family: Verdana;" cellpadding="0" cellspacing="0" class="12995e5b-0c66-4f65-91b1-046f9707942eTable">
<tbody>
<tr>
<td><font style="font-size:11pt;color:#000000;"><font style="color:#000000;">Christian<font style="color:#000000;">
</font>Smith</font></font></td>
</tr>
<tr>
<td><font style="color:#000000;"><font style="color:#000000;">Technik</font></font></td>
</tr>
</tbody>
</table>
</font><font style="FONT-SIZE: 8pt" color="#a1a1a1" face="Verdana"></font></p>
<p class="ImprintUniqueID">&nbsp;</p>
</td>
<td style="BORDER-TOP: #cecece 1px solid; WIDTH: 695px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; PADDING-LEFT: 10px; BORDER-LEFT: #cecece 1px solid" valign="top">
<table style="font-family:Verdana; color: #CECECE; font-size: 8pt;" cellpadding="0" cellspacing="0" class="12995e5b-0c66-4f65-91b1-046f9707942eTable">
<tbody>
<tr style="">
<td align="Left"><font style="font-family:Verdana;color:#A0A0A0;font-weight:bold;"><font style="font-family:Verdana;color:#000000;"><font style="font-family:verdana;color:#000000;font-weight:normal;">Tel:</font></font></font></td>
<td align="Left"><font style="font-family:Verdana;color:#A0A0A0;"><font style="font-family:Verdana;color:#000000;">&#43;49 12 34 56 78 441</font></font></td>
</tr>
<tr style="">
<td align="Left"><font style="font-family:Verdana;color:#A0A0A0;font-weight:bold;"><font style="font-family:Verdana;color:#000000;"><font style="font-family:verdana;color:#000000;font-weight:normal;">Fax:</font></font></font></td>
<td align="Left"><font style="font-family:Verdana;color:#A0A0A0;"><font style="font-family:Verdana;color:#000000;">&#43;49 12 34 56 78 499</font></font></td>
</tr>
<tr style="">
<td align="Left" width="25%" nowrap="1"><font style="font-family:Verdana;color:#000000;font-weight:bold;"><font style="font-family:Verdana;color:#000000;"><font style="font-family:verdana;color:#000000;font-weight:normal;">Email:
</font></font></font></td>
<td align="Left"><font style="font-family:Verdana;color:#000000;"><font style="font-family:Verdana;color:#000000;"><span style="font-family:Verdana;color:#000000;text-decoration:none;"><a href="mailto:Christian.Smith@example.com" title="Click to send email to Smith, Christian" target="" style="font-family:Verdana;color:#000000;text-decoration:none;"><span style="font-family:Verdana; color:#000000; text-decoration:none;">Christian.Smith@example.com</span></a></span></font></font></td>
</tr>
<tr style="">
<td align="Left"><font style="font-family:Verdana;color:#A0A0A0;font-weight:bold;"><font style="font-family:Verdana;color:#000000;"><font style="font-family:verdana;color:#000000;font-weight:normal;">Web:</font></font></font></td>
<td align="Left"><font style="font-family:Verdana;color:#000000;"><font style="font-family:Verdana;color:#000000;"><font style="font-family:verdana;color:#000000;font-weight:normal;">www.example.com</font></font></font></td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td style="BORDER-BOTTOM: #cecece 1px solid"><font style="FONT-SIZE: 7pt; FONT-FAMILY: Verdana; COLOR: #a0a0a0" color="#cecece" face="Verdana">ABC&nbsp;KFZ- und Flugzeug B.V. &amp; Co. KG<br>
Hauptverwaltung<br>
Ost Straße 2<br>
12345 Somewhere</font></td>
<td style="BORDER-BOTTOM: #cecece 1px solid; PADDING-BOTTOM: 10px; PADDING-LEFT: 10px; BORDER-LEFT: #cecece 1px solid" valign="top">
<font style="FONT-SIZE: 7pt; FONT-FAMILY: Verdana; COLOR: #a0a0a0" color="#cecece" face="Verdana"></font></td>
</tr>
</tbody>
</table>
</p>
<font color="#000000"><!-- This is the environment stuff -->
<p class="ImprintUniqueID" style="FONT-SIZE: 7pt">
<table class="ImprintUniqueIDTable" style="WIDTH: 100%; BORDER-COLLAPSE: collapse" cellspacing="0" cols="2" cellpadding="0" border="0">
<tbody>
</tbody>
</table>
</p>
<!-- This is the start of the disclaimer -->
<p class="ImprintUniqueID" style="FONT-SIZE: 7pt"><font color="#cfcfcf" face="Verdana"><font title="Disclaimer HVW" face="Verdana"><br>
<font size="1">ABC KFZ- und Flugzeug B.V. &amp;&nbsp; Co. KG<br>
</font></font><font size="1">Sitz: Zuhause, HARA 123 Stern/Tief<br>
phG: ABC Beteiligungs B.V.<br>
Wo: Dorten, Kammer van What 1234567<br>
Auch noch: Zuhause, HRB ABC Stern/Tief<br>
Geschäftsführer: André Bob / Gery Hauer<br>
<br>
</font></font></p>
</body>
</html>

View file

@ -0,0 +1,182 @@
<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<!-- Template generated by Exclaimer Mail Disclaimers on 03:13:32 Dienstag, 14 Juni 2016 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">P.ImprintUniqueID {
MARGIN: 0cm 0cm 0pt
}
LI.ImprintUniqueID {
MARGIN: 0cm 0cm 0pt
}
DIV.ImprintUniqueID {
MARGIN: 0cm 0cm 0pt
}
TABLE.ImprintUniqueIDTable {
MARGIN: 0cm 0cm 0pt
}
DIV.Section1 {
page: Section1
}
</style>
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:Helvetica;
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
span.E-MailFormatvorlage17
{mso-style-type:personal;
font-family:"Calibri",sans-serif;
color:black;}
span.E-MailFormatvorlage18
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body style="FONT-SIZE: x-small; FONT-FAMILY: Verdana; LINE-HEIGHT: normal; TEXT-INDENT: 0px" lang="DE" link="#0563C1" vlink="#954F72">
<p class="ImprintUniqueID"></p>
<p class="ImprintUniqueID"></p>
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">Guten Tag Herr Smith,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">die folgenden Gruppen wurden erstellt und die Benutzer entsprechend der Anfrage als Mitlgieder hinzugeügt.<o:p></o:p></span></p>
<p class="MsoNormal"><b><u><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">org.local:<o:p></o:p></span></u></b></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">DistinguishedName<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">-----------------<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">CN=sec-xyz-R-Leiter-ABCD---Debitor,OU=ABC,OU=X,DC=org,DC=local<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">CN=sec-xyz-R-Leiter-ABCD---Hauptbuch,OU=ABC,OU=X,DC=org,DC=local<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">CN=sec-xyz-R-Leiter-ABCD---Kreditor,OU=ABC,OU=X,DC=org,DC=local<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">CN=sec-xyz-R-MA-ABCD---Stammdaten,OU=ABC,OU=X,DC=org,DC=local<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><b><u><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">ad.org-unit.de:<o:p></o:p></span></u></b></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">DistinguishedName<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">-----------------<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">CN=sec-xyz-R-Leiter-ABCD---Debitor,OU=Z,OU=Gruppen,OU=Service,DC=ad,DC=org-unit,DC=de<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">CN=sec-xyz-R-Leiter-ABCD---Hauptbuch,OU=Z,OU=Gruppen,OU=Service,DC=ad,DC=org-unit,DC=de<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">CN=sec-xyz-R-Leiter-ABCD---Kreditor,OU=Z,OU=Gruppen,OU=Service,DC=ad,DC=org-unit,DC=de<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">CN=sec-xyz-R-MA-ABCD---Stammdaten,OU=Z,OU=Gruppen,OU=Service,DC=ad,DC=org-unit,DC=de<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><b><u><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">example.local:<o:p></o:p></span></u></b></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">DistinguishedName<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">-----------------<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">CN=sec-xyz-R-Leiter-ABCD---Debitor,OU=ABC,OU=Admin-Gruppen,OU=Service-Bereich,DC=example,DC=local<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">CN=sec-xyz-R-Leiter-ABCD---Hauptbuch,OU=ABC,OU=Admin-Gruppen,OU=Service-Bereich,DC=example,DC=local<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">CN=sec-xyz-R-Leiter-ABCD---Kreditor,OU=ABC,OU=Admin-Gruppen,OU=Service-Bereich,DC=example,DC=local<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US">CN=sec-xyz-R-MA-ABCD---Stammdaten,OU=ABC,OU=Admin-Gruppen,OU=Service-Bereich,DC=example,DC=local<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black;mso-fareast-language:EN-US"><o:p>&nbsp;</o:p></span></p>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:black">Mit freundlichen Grüßen<o:p></o:p></span></p>
</div>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p>&nbsp;</o:p></span></p>
<div></div>
</div>
<br>
<p></p>
<p class="ImprintUniqueID">
<table class="ImprintUniqueIDTable" style="WIDTH: 100%; BORDER-COLLAPSE: collapse" cellspacing="0" cols="2" cellpadding="0" border="0">
<tbody>
<tr style="FONT-SIZE: 8pt">
<td style="FONT-SIZE: 8pt; BORDER-TOP: #cecece 1px solid; FONT-FAMILY: Verdana; WIDTH: 315px; COLOR: #a0a0a0; PADDING-TOP: 10px" valign="top" width="240">
<p class="ImprintUniqueID"><font style="FONT-SIZE: 8pt" color="#cecece" face="Verdana"></font><font style="FONT-SIZE: 8pt" color="#a1a1a1" face="Verdana">
<table style="color: #A0A0A0; font-size: 8pt; font-family: Verdana;" cellpadding="0" cellspacing="0" class="e5b45324-5a70-4aec-b580-3a0a8455ebf9Table">
<tbody>
<tr>
<td><font style="font-size:11pt;color:#000000;"><font style="color:#000000;">Christian<font style="color:#000000;">
</font>Smith</font></font></td>
</tr>
<tr>
<td><font style="color:#000000;"><font style="color:#000000;">Technik</font></font></td>
</tr>
</tbody>
</table>
</font><font style="FONT-SIZE: 8pt" color="#a1a1a1" face="Verdana"></font></p>
<p class="ImprintUniqueID">&nbsp;</p>
</td>
<td style="BORDER-TOP: #cecece 1px solid; WIDTH: 695px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; PADDING-LEFT: 10px; BORDER-LEFT: #cecece 1px solid" valign="top">
<table style="font-family:Verdana; color: #CECECE; font-size: 8pt;" cellpadding="0" cellspacing="0" class="e5b45324-5a70-4aec-b580-3a0a8455ebf9Table">
<tbody>
<tr style="">
<td align="Left"><font style="font-family:Verdana;color:#A0A0A0;font-weight:bold;"><font style="font-family:Verdana;color:#000000;"><font style="font-family:verdana;color:#000000;font-weight:normal;">Tel:</font></font></font></td>
<td align="Left"><font style="font-family:Verdana;color:#A0A0A0;"><font style="font-family:Verdana;color:#000000;">&#43;49 12 34 56 78 441</font></font></td>
</tr>
<tr style="">
<td align="Left"><font style="font-family:Verdana;color:#A0A0A0;font-weight:bold;"><font style="font-family:Verdana;color:#000000;"><font style="font-family:verdana;color:#000000;font-weight:normal;">Fax:</font></font></font></td>
<td align="Left"><font style="font-family:Verdana;color:#A0A0A0;"><font style="font-family:Verdana;color:#000000;">&#43;49 12 34 56 78 499</font></font></td>
</tr>
<tr style="">
<td align="Left" width="25%" nowrap="1"><font style="font-family:Verdana;color:#000000;font-weight:bold;"><font style="font-family:Verdana;color:#000000;"><font style="font-family:verdana;color:#000000;font-weight:normal;">Email:
</font></font></font></td>
<td align="Left"><font style="font-family:Verdana;color:#000000;"><font style="font-family:Verdana;color:#000000;"><span style="font-family:Verdana;color:#000000;text-decoration:none;"><a href="mailto:Christian.Smith@example.com" title="Click to send email to Smith, Christian" target="" style="font-family:Verdana;color:#000000;text-decoration:none;"><span style="font-family:Verdana; color:#000000; text-decoration:none;">Christian.Smith@example.com</span></a></span></font></font></td>
</tr>
<tr style="">
<td align="Left"><font style="font-family:Verdana;color:#A0A0A0;font-weight:bold;"><font style="font-family:Verdana;color:#000000;"><font style="font-family:verdana;color:#000000;font-weight:normal;">Web:</font></font></font></td>
<td align="Left"><font style="font-family:Verdana;color:#000000;"><font style="font-family:Verdana;color:#000000;"><font style="font-family:verdana;color:#000000;font-weight:normal;">www.example.com</font></font></font></td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td style="BORDER-BOTTOM: #cecece 1px solid"><font style="FONT-SIZE: 7pt; FONT-FAMILY: Verdana; COLOR: #a0a0a0" color="#cecece" face="Verdana">ABC&nbsp;KFZ- und Flugzeug B.V. &amp; Co. KG<br>
Hauptverwaltung<br>
Ost Straße 2<br>
12345 Somewhere</font></td>
<td style="BORDER-BOTTOM: #cecece 1px solid; PADDING-BOTTOM: 10px; PADDING-LEFT: 10px; BORDER-LEFT: #cecece 1px solid" valign="top">
<font style="FONT-SIZE: 7pt; FONT-FAMILY: Verdana; COLOR: #a0a0a0" color="#cecece" face="Verdana"></font></td>
</tr>
</tbody>
</table>
</p>
<font color="#000000"><!-- This is the environment stuff -->
<p class="ImprintUniqueID" style="FONT-SIZE: 7pt">
<table class="ImprintUniqueIDTable" style="WIDTH: 100%; BORDER-COLLAPSE: collapse" cellspacing="0" cols="2" cellpadding="0" border="0">
<tbody>
</tbody>
</table>
</p>
<!-- This is the start of the disclaimer -->
<p class="ImprintUniqueID" style="FONT-SIZE: 7pt"><font color="#cfcfcf" face="Verdana"><font title="Disclaimer HVW" face="Verdana"><br>
<font size="1">ABC KFZ- und Flugzeug B.V. &amp;&nbsp; Co. KG<br>
</font></font><font size="1">Sitz: Zuhause, HARA 123 Stern/Tief<br>
phG: ABC Beteiligungs B.V.<br>
Wo: Dorten, Kammer van What 1234567<br>
Auch noch: Zuhause, HRB ABC Stern/Tief<br>
Geschäftsführer: André Bob / Gery Hauer<br>
<br>
</font></font></p>
</body>
</html>

View file

@ -0,0 +1,167 @@
<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<!-- Template generated by Exclaimer Mail Disclaimers on 10:23:35 Freitag, 6 Mai 2016 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">P.ImprintUniqueID {
MARGIN: 0cm 0cm 0pt
}
LI.ImprintUniqueID {
MARGIN: 0cm 0cm 0pt
}
DIV.ImprintUniqueID {
MARGIN: 0cm 0cm 0pt
}
TABLE.ImprintUniqueIDTable {
MARGIN: 0cm 0cm 0pt
}
DIV.Section1 {
page: Section1
}
</style>
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
span.E-MailFormatvorlage17
{mso-style-type:personal-compose;
font-family:"Times New Roman",serif;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri",sans-serif;
mso-fareast-language:EN-US;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
{page:WordSection1;}
--></style>
</head>
<body style="FONT-SIZE: x-small; FONT-FAMILY: Verdana; LINE-HEIGHT: normal; TEXT-INDENT: 0px" lang="DE" link="#0563C1" vlink="#954F72">
<p class="ImprintUniqueID"></p>
<p class="ImprintUniqueID"></p>
<div class="WordSection1">
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:&quot;Times New Roman&quot;,serif"><br>
<br>
<br>
Sehr geehrte Damen und Herren,<br>
<br>
ich bin z.Zt. nicht per E-Mail erreichbar.<br>
In dringenden Fällen wenden Sie sich bitte an it-support@example.de<br>
Ihre E-Mail wird nicht weitergeleitet.<o:p></o:p></span></p>
</div>
<br>
<p></p>
<p class="ImprintUniqueID">
<table class="ImprintUniqueIDTable" style="WIDTH: 100%; BORDER-COLLAPSE: collapse" cellspacing="0" cols="2" cellpadding="0" border="0">
<tbody>
<tr style="FONT-SIZE: 8pt">
<td style="FONT-SIZE: 8pt; BORDER-TOP: #cecece 1px solid; FONT-FAMILY: Verdana; WIDTH: 315px; COLOR: #a0a0a0; PADDING-TOP: 10px" valign="top" width="240">
<p class="ImprintUniqueID"><font style="FONT-SIZE: 8pt" color="#cecece" face="Verdana"></font><font style="FONT-SIZE: 8pt" color="#a1a1a1" face="Verdana">
<table style="color: #A0A0A0; font-size: 8pt; font-family: Verdana;" cellpadding="0" cellspacing="0" class="325975d5-3d55-4a8c-a73d-e7606092ca3fTable">
<tbody>
<tr>
<td><font style="font-size:11pt;color:#000000;"><font style="color:#000000;">Christian<font style="color:#000000;">
</font>Smith</font></font></td>
</tr>
<tr>
<td><font style="color:#000000;"><font style="color:#000000;">Technik</font></font></td>
</tr>
</tbody>
</table>
</font><font style="FONT-SIZE: 8pt" color="#a1a1a1" face="Verdana"></font></p>
<p class="ImprintUniqueID">&nbsp;</p>
</td>
<td style="BORDER-TOP: #cecece 1px solid; WIDTH: 695px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; PADDING-LEFT: 10px; BORDER-LEFT: #cecece 1px solid" valign="top">
<table style="font-family:Verdana; color: #CECECE; font-size: 8pt;" cellpadding="0" cellspacing="0" class="325975d5-3d55-4a8c-a73d-e7606092ca3fTable">
<tbody>
<tr style="">
<td align="Left"><font style="font-family:Verdana;color:#A0A0A0;font-weight:bold;"><font style="font-family:Verdana;color:#000000;"><font style="font-family:verdana;color:#000000;font-weight:normal;">Tel:</font></font></font></td>
<td align="Left"><font style="font-family:Verdana;color:#A0A0A0;"><font style="font-family:Verdana;color:#000000;">&#43;49 12 34 56 78 441</font></font></td>
</tr>
<tr style="">
<td align="Left"><font style="font-family:Verdana;color:#A0A0A0;font-weight:bold;"><font style="font-family:Verdana;color:#000000;"><font style="font-family:verdana;color:#000000;font-weight:normal;">Fax:</font></font></font></td>
<td align="Left"><font style="font-family:Verdana;color:#A0A0A0;"><font style="font-family:Verdana;color:#000000;">&#43;49 12 34 56 78 499</font></font></td>
</tr>
<tr style="">
<td align="Left" width="25%" nowrap="1"><font style="font-family:Verdana;color:#000000;font-weight:bold;"><font style="font-family:Verdana;color:#000000;"><font style="font-family:verdana;color:#000000;font-weight:normal;">Email:
</font></font></font></td>
<td align="Left"><font style="font-family:Verdana;color:#000000;"><font style="font-family:Verdana;color:#000000;"><span style="font-family:Verdana;color:#000000;text-decoration:none;"><a href="mailto:Christian.Smith@example.com" title="Click to send email to Smith, Christian" target="" style="font-family:Verdana;color:#000000;text-decoration:none;"><span style="font-family:Verdana; color:#000000; text-decoration:none;">Christian.Smith@example.com</span></a></span></font></font></td>
</tr>
<tr style="">
<td align="Left"><font style="font-family:Verdana;color:#A0A0A0;font-weight:bold;"><font style="font-family:Verdana;color:#000000;"><font style="font-family:verdana;color:#000000;font-weight:normal;">Web:</font></font></font></td>
<td align="Left"><font style="font-family:Verdana;color:#000000;"><font style="font-family:Verdana;color:#000000;"><font style="font-family:verdana;color:#000000;font-weight:normal;">www.example.com</font></font></font></td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td style="BORDER-BOTTOM: #cecece 1px solid"><font style="FONT-SIZE: 7pt; FONT-FAMILY: Verdana; COLOR: #a0a0a0" color="#cecece" face="Verdana">ABC&nbsp;KFZ- und Flugzeug B.V. &amp; Co. KG<br>
Hauptverwaltung<br>
Ost Straße 2<br>
12345 Somewhere<br>
Tel.: &#43;001 1234 0000 0<br>
Fax: &#43;001 1234 0000 99</font></td>
<td style="BORDER-BOTTOM: #cecece 1px solid; PADDING-BOTTOM: 10px; PADDING-LEFT: 10px; BORDER-LEFT: #cecece 1px solid" valign="top">
<font style="FONT-SIZE: 7pt; FONT-FAMILY: Verdana; COLOR: #a0a0a0" color="#cecece" face="Verdana"></font></td>
</tr>
</tbody>
</table>
</p>
<font color="#000000"><!-- This is the environment stuff -->
<p class="ImprintUniqueID" style="FONT-SIZE: 7pt">
<table class="ImprintUniqueIDTable" style="WIDTH: 100%; BORDER-COLLAPSE: collapse" cellspacing="0" cols="2" cellpadding="0" border="0">
<tbody>
</tbody>
</table>
</p>
<!-- This is the start of the disclaimer -->
<p class="ImprintUniqueID" style="FONT-SIZE: 7pt"><font color="#cfcfcf" face="Verdana"><font title="Disclaimer HVW" face="Verdana"><br>
<font size="1">ABC KFZ- und Flugzeug B.V. &amp;&nbsp; Co. KG<br>
</font></font><font size="1">Sitz: Zuhause, HARA 123 Stern/Tief<br>
phG: ABC Beteiligungs B.V.<br>
Wo: Dorten, Kammer van What 1234567<br>
Auch noch: Zuhause, HRB ABC Stern/Tief<br>
Geschäftsführer: André Bob / Gery Hauer<br>
<br>
</font></font></p>
<p class="ImprintUniqueID" style="FONT-SIZE: 7pt"><br>
<br>
</p>
</font>&nbsp;
<p></p>
<p class="ImprintUniqueID"><font face="Verdana"></font></p>
<p></p>
<p class="ImprintUniqueID"></p>
<p class="ImprintUniqueID"></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
</body>
</html>

View file

@ -574,4 +574,86 @@ Men-----------------------'
end end
test 'signature_identify function' do
marker_template = '######SIGNATURE_MARKER######'
source = 'test'
result = 'test'
assert_equal(result, source.signature_identify(true))
source = "test\n--\nend"
result = "test\n#{marker_template}--\nend"
assert_equal(result, source.signature_identify(true))
source = "On 01/04/15 10:55, Bob Smith wrote:"
result = "#{marker_template}On 01/04/15 10:55, Bob Smith wrote:"
assert_equal(result, source.signature_identify(true))
source = "Am 03.04.2015 um 20:58 schrieb Martin Edenhofer <me@znuny.ink>:"
result = "#{marker_template}Am 03.04.2015 um 20:58 schrieb Martin Edenhofer <me@znuny.ink>:"
assert_equal(result, source.signature_identify(true))
source = "\ntest 123 \n1\n2\n3\n4\n5\n6\n7\n8\n9\n--\nBob Smith\n"
result = "\ntest 123 \n1\n2\n3\n4\n5\n6\n7\n8\n9\n#{marker_template}--\nBob Smith\n"
assert_equal(result, source.signature_identify(true))
source = "test 123 \n--no not match--\n--\nBob Smith\n"
result = "test 123 \n--no not match--\n#{marker_template}--\nBob Smith\n"
assert_equal(result, source.signature_identify(true))
source = "test 123 \n--no not match--\n -- \nBob Smith\n"
result = "test 123 \n--no not match--\n#{marker_template} -- \nBob Smith\n"
assert_equal(result, source.signature_identify(true))
source = "test 123 \n\n--\nBob Smith\n\n\n\n\n--\nBob Smith\n"
result = "test 123 \n#{marker_template}\n--\nBob Smith\n\n\n\n\n--\nBob Smith\n"
assert_equal(result, source.signature_identify(true))
source = "test 123\ntest 123\n--\nBob Smith\n"
result = "test 123\ntest 123\n#{marker_template}--\nBob Smith\n"
assert_equal(result, source.signature_identify(true))
source = "test 123\ntest 123\n--\nBob Smith\n\n"
result = "test 123\ntest 123\n#{marker_template}--\nBob Smith\n\n"
assert_equal(result, source.signature_identify(true))
# apple
# en
source = "test 123 \n--no not match--\nBob Smith\nOn 01/04/15 10:55, Bob Smith wrote:\nlalala\n--\nsome test"
result = "test 123 \n--no not match--\nBob Smith\n#{marker_template}On 01/04/15 10:55, Bob Smith wrote:\nlalala\n#{marker_template}--\nsome test"
assert_equal(result, source.signature_identify(true))
# de
source = "test 123 \n\n--no not match--\n\nBob Smith\nAm 03.04.2015 um 20:58 schrieb Bob Smith <bob@example.com>:\nlalala"
result = "test 123 \n\n--no not match--\n\nBob Smith\n#{marker_template}Am 03.04.2015 um 20:58 schrieb Bob Smith <bob@example.com>:\nlalala"
assert_equal(result, source.signature_identify(true))
# ms
# en
source = "test 123 \n\n--no not match--\n\nBob Smith\nFrom: Martin Edenhofer via Znuny Support [mailto:support@znuny.inc]\nSent: Donnerstag, 2. April 2015 10:00\nlalala</div>"
result = "test 123 \n\n--no not match--\n\nBob Smith\n#{marker_template}From: Martin Edenhofer via Znuny Support [mailto:support@znuny.inc]\nSent: Donnerstag, 2. April 2015 10:00\nlalala</div>"
assert_equal(result, source.signature_identify(true))
# de
source = "test 123 \n\n--no not match--\n\nBob Smith\nVon: Martin Edenhofer via Znuny Support [mailto:support@znuny.inc]\nGesendet: Donnerstag, 2. April 2015 10:00\nBetreff: lalala\n"
result = "test 123 \n\n--no not match--\n\nBob Smith\n#{marker_template}Von: Martin Edenhofer via Znuny Support [mailto:support@znuny.inc]\nGesendet: Donnerstag, 2. April 2015 10:00\nBetreff: lalala\n"
assert_equal(result, source.signature_identify(true))
# fr
source = "\ntest 123 \n\n--no not match--\n\nBob Smith\nDe : Martin Edenhofer via Znuny Support [mailto:support@znuny.inc]\nEnvoyé : mercredi 29 avril 2015 17:31\nObjet : lalala\n"
result = "\ntest 123 \n\n--no not match--\n\nBob Smith\n#{marker_template}De : Martin Edenhofer via Znuny Support [mailto:support@znuny.inc]\nEnvoyé : mercredi 29 avril 2015 17:31\nObjet : lalala\n"
assert_equal(result, source.signature_identify(true))
marker_template = '<span class="js-signatureMarker"></span>'
html = "<br>lalala<br>--<br>Max Mix"
result = "lalala<br>#{marker_template}--<br>Max Mix"
assert_equal(result, html.html2html_strict(true))
html = "den.<br><br><b>Von:</b> Fritz Bauer [mailto:me@example.com]<br><b>Gesendet:</b> Donnerstag, 3. Mai 2012 11:51<br><b>An:</b> John Smith<br><b>Cc:</b> Smith, John Marian; johnel.fratczak@example.com; ole.brei@example.com; Günther John | Example GmbH; bkopon@example.com; john.heisterhagen@team.example.com; sven.rocked@example.com; michael.house@example.com; tgutzeit@example.com<br><b>Betreff:</b> Re: OTRS::XXX Erweiterung - Anhänge an CI's<br><br>Hallo,<br><br>ich versuche an den Punkten"
result = "den.<br>#{marker_template}<br><b>Von:</b> Fritz Bauer [mailto:me@example.com]<br><b>Gesendet:</b> Donnerstag, 3. Mai 2012 11:51<br><b>An:</b> John Smith<br><b>Cc:</b> Smith, John Marian; johnel.fratczak@example.com; ole.brei@example.com; Günther John | Example GmbH; bkopon@example.com; john.heisterhagen@team.example.com; sven.rocked@example.com; michael.house@example.com; tgutzeit@example.com<br><b>Betreff:</b> Re: OTRS::XXX Erweiterung - Anhänge an CI&#39;s<br><br>Hallo,<br><br>ich versuche an den Punkten"
assert_equal(result, html.html2html_strict(true))
end
end end

View file

@ -7,60 +7,69 @@ class EmailSignaturDetectionTest < ActiveSupport::TestCase
# fixtures of sender a # fixtures of sender a
fixture_files = { fixture_files = {
'email_signature_detection/client_a_1.txt' => { line: 10 }, 'email_signature_detection/client_a_1.txt' => { line: 10, content_type: 'text/plain' },
'email_signature_detection/client_a_2.txt' => { line: 20 }, 'email_signature_detection/client_a_2.txt' => { line: 20, content_type: 'text/plain' },
'email_signature_detection/client_a_3.txt' => { line: 6 }, 'email_signature_detection/client_a_3.txt' => { line: 6, content_type: 'text/plain' },
} }
fixture_files_string_list = [] fixture_messages = []
fixture_files.each do |filepath, value|
fixture_files.keys.each do |filepath| value[:content] = File.new("#{Rails.root}/test/fixtures/#{filepath}", 'r').read
fixture_messages.push value
file = File.new("#{Rails.root}/test/fixtures/#{filepath}", 'r')
file_content = file.read
fixture_files[filepath][:content] = file_content
fixture_files_string_list.push(file_content)
end end
signature = SignatureDetection.find_signature(fixture_files_string_list) signature = SignatureDetection.find_signature(fixture_messages)
expected_signature = "\nMit freundlichen Grüßen\n\nBob Smith\nBerechtigungen und dez. Department\n________________________________\n\nMusik AG\nBerechtigungen und dez. Department (ITPBM)\nKastanien 2\n12345 Hornhausen\nTel.: +49 911 6760\nFax: +49 911 85 6760\nMobil: +49 173 911\nE-Mail: Bob.Smith@music.com\nhttp://www.music.com\n\nMusik AG | Kastanien 2 | 12345 Hornhausen\nSitz der AG: Hornhausen, HRB xxxxx | USt.-ID: DE 111222333444\nVorstand: Marc Smith, Weber Huber\nAufsichtsrat: Max Mix (Vors.)" expected_signature = "\nMit freundlichen Grüßen\n\nBob Smith\nBerechtigungen und dez. Department\n________________________________\n\nMusik AG\nBerechtigungen und dez. Department (ITPBM)\nKastanien 2\n12345 Hornhausen\nTel.: +49 911 6760\nFax: +49 911 85 6760\nMobil: +49 173 911\nE-Mail: Bob.Smith@music.com\nhttp://www.music.com\n\nMusik AG | Kastanien 2 | 12345 Hornhausen\nSitz der AG: Hornhausen, HRB xxxxx | USt.-ID: DE 111222333444\nVorstand: Marc Smith, Weber Huber\nAufsichtsrat: Max Mix (Vors.)"
assert_equal(expected_signature, signature) assert_equal(expected_signature, signature)
fixture_files.keys.each do |filepath| fixture_files.each do |_filepath, value|
expected_signature_position = fixture_files[filepath][:line] assert_equal(value[:line], SignatureDetection.find_signature_line(signature, value[:content], value[:content_type]))
assert_equal(expected_signature_position, SignatureDetection.find_signature_line(signature, fixture_files[filepath][:content]))
end end
end end
test 'test case II - sender b' do test 'test case II - sender b' do
fixture_files = { fixture_files = {
'email_signature_detection/client_b_1.txt' => { line: 26 }, 'email_signature_detection/client_b_1.txt' => { line: 26, content_type: 'text/plain' },
'email_signature_detection/client_b_2.txt' => { line: 4 }, 'email_signature_detection/client_b_2.txt' => { line: 4, content_type: 'text/plain' },
'email_signature_detection/client_b_3.txt' => { line: 6 }, 'email_signature_detection/client_b_3.txt' => { line: 6, content_type: 'text/plain' },
} }
fixture_files_string_list = [] fixture_messages = []
fixture_files.each do |filepath, value|
fixture_files.keys.each do |filepath| value[:content] = File.new("#{Rails.root}/test/fixtures/#{filepath}", 'r').read
fixture_messages.push value
file = File.new("#{Rails.root}/test/fixtures/#{filepath}", 'r')
file_content = file.read
fixture_files[filepath][:content] = file_content
fixture_files_string_list.push(file_content)
end end
signature = SignatureDetection.find_signature(fixture_files_string_list) signature = SignatureDetection.find_signature(fixture_messages)
expected_signature = "\nFreundliche Grüße\n\nGünter Lässig\nLokale Daten\n\nMusic GmbH\nBaustraße 123, 12345 Max City\nTelefon 0123 5432114\nTelefax 0123 5432139\nE-Mail Günter.Lässig@example.com<mailto:Günter.Lässig@example.com>\n\nExample. Zusammen für eine bessere Welt.\n[cid:image001.png@01CE92A6.EC495B60]<http://www.example.com/>\n\n[cid:image002.png@01CE92A6.EC495B60]<http://www.facebook.com/example.com>\n\n[cid:image003.png@01CE92A6.EC495B60]<http://twitter.com/example>\n\n[cid:image004.png@01CE92A6.EC495B60]<https://www.xing.com/companies/example/neu-example>\n\n[cid:image005.jpg@01CE92A6.EC495B60]<http://www.youtube.com/example>\n\n[cid:image006.png@01CE92A6.EC495B60]<http://www.example.com/no_cache/privatkunden/aktuelles/news-presse/newsletter.html>\n\nSitz der Gesellschaft: Max City, Amtsgericht Max City HRB Nr. 1234\nGeschäftsführer: Bob Smith\nVorsitzender des Aufsichtsrats: Alex Marx" expected_signature = "\nFreundliche Grüße\n\nGünter Lässig\nLokale Daten\n\nMusic GmbH\nBaustraße 123, 12345 Max City\nTelefon 0123 5432114\nTelefax 0123 5432139\nE-Mail Günter.Lässig@example.com<mailto:Günter.Lässig@example.com>\n\nExample. Zusammen für eine bessere Welt.\n[cid:image001.png@01CE92A6.EC495B60]<http://www.example.com/>\n\n[cid:image002.png@01CE92A6.EC495B60]<http://www.facebook.com/example.com>\n\n[cid:image003.png@01CE92A6.EC495B60]<http://twitter.com/example>\n\n[cid:image004.png@01CE92A6.EC495B60]<https://www.xing.com/companies/example/neu-example>\n\n[cid:image005.jpg@01CE92A6.EC495B60]<http://www.youtube.com/example>\n\n[cid:image006.png@01CE92A6.EC495B60]<http://www.example.com/no_cache/privatkunden/aktuelles/news-presse/newsletter.html>\n\nSitz der Gesellschaft: Max City, Amtsgericht Max City HRB Nr. 1234\nGeschäftsführer: Bob Smith\nVorsitzender des Aufsichtsrats: Alex Marx"
assert_equal(expected_signature, signature) assert_equal(expected_signature, signature)
fixture_files.keys.each do |filepath| fixture_files.each do |_filepath, value|
expected_signature_position = fixture_files[filepath][:line] assert_equal(value[:line], SignatureDetection.find_signature_line(signature, value[:content], value[:content_type]))
end
end
assert_equal(expected_signature_position, SignatureDetection.find_signature_line(signature, fixture_files[filepath][:content])) test 'test case III - sender c' do
fixture_files = {
'email_signature_detection/client_c_1.html' => { line: 8, content_type: 'text/html' },
'email_signature_detection/client_c_2.html' => { line: 29, content_type: 'text/html' },
'email_signature_detection/client_c_3.html' => { line: 9, content_type: 'text/html' },
}
fixture_messages = []
fixture_files.each do |filepath, value|
value[:content] = File.new("#{Rails.root}/test/fixtures/#{filepath}", 'r').read
fixture_messages.push value
end
signature = SignatureDetection.find_signature(fixture_messages)
expected_signature = "\nChristianSmith\nTechnik\n\nTel: +49 12 34 56 78 441\nFax: +49 12 34 56 78 499\nEmail: Christian.Smith@example.com\nWeb: www.example.com\nABC KFZ- und Flugzeug B.V. & Co. KG\nHauptverwaltung\nOst Straße 2\n12345 Somewhere"
assert_equal(expected_signature, signature)
fixture_files.each do |filepath, value|
assert_equal(value[:line], SignatureDetection.find_signature_line(signature, value[:content], value[:content_type]), filepath)
end end
end end