Merge branch 'develop' of github.com:martini/zammad into develop
This commit is contained in:
commit
0ace20fb4b
9 changed files with 293 additions and 89 deletions
|
@ -1,15 +1,25 @@
|
||||||
class App.ControllerTable extends App.Controller
|
class App.ControllerTable extends App.Controller
|
||||||
|
|
||||||
minColWidth: 20
|
minColWidth: 20
|
||||||
|
|
||||||
constructor: (params) ->
|
constructor: (params) ->
|
||||||
for key, value of params
|
for key, value of params
|
||||||
@[key] = value
|
@[key] = value
|
||||||
|
|
||||||
@table = @tableGen(params)
|
# apply personal preferences
|
||||||
|
data = @preferencesGet()
|
||||||
|
if data['order']
|
||||||
|
for key, value of data['order']
|
||||||
|
@[key] = value
|
||||||
|
|
||||||
if @el
|
@headerWidth = {}
|
||||||
@el.append( @table )
|
if data['headerWidth']
|
||||||
|
for key, value of data['headerWidth']
|
||||||
|
@headerWidth[key] = value
|
||||||
|
|
||||||
|
@render()
|
||||||
|
|
||||||
|
render: =>
|
||||||
|
@html(@tableGen())
|
||||||
|
|
||||||
###
|
###
|
||||||
|
|
||||||
|
@ -51,6 +61,7 @@ class App.ControllerTable extends App.Controller
|
||||||
value
|
value
|
||||||
|
|
||||||
new App.ControllerTable(
|
new App.ControllerTable(
|
||||||
|
table_id: 'some_id_to_idientify_user_based_table_preferences'
|
||||||
el: element
|
el: element
|
||||||
overview: ['host', 'user', 'adapter', 'active']
|
overview: ['host', 'user', 'adapter', 'active']
|
||||||
model: App.Channel
|
model: App.Channel
|
||||||
|
@ -98,38 +109,38 @@ class App.ControllerTable extends App.Controller
|
||||||
|
|
||||||
###
|
###
|
||||||
|
|
||||||
tableGen: (data) ->
|
tableGen: =>
|
||||||
if !data.model
|
if !@model
|
||||||
data.model = {}
|
@model = {}
|
||||||
overview = data.overview || data.model.configure_overview || []
|
overview = @overview || @model.configure_overview || []
|
||||||
attributes = data.attributes || data.model.configure_attributes || {}
|
attributes = @attributes || @model.configure_attributes || {}
|
||||||
attributes = App.Model.attributesGet(false, attributes)
|
attributes = App.Model.attributesGet(false, attributes)
|
||||||
destroy = data.model.configure_delete
|
destroy = @model.configure_delete
|
||||||
|
|
||||||
# check if table is empty
|
# check if table is empty
|
||||||
if _.isEmpty(data.objects)
|
if _.isEmpty(@objects)
|
||||||
table = App.view('generic/admin/empty')
|
table = App.view('generic/admin/empty')
|
||||||
explanation: data.explanation
|
explanation: @explanation
|
||||||
return $(table)
|
return $(table)
|
||||||
|
|
||||||
# group by
|
# group by
|
||||||
if data.groupBy
|
if @groupBy
|
||||||
|
|
||||||
# remove group by attribute from header
|
# remove group by attribute from header
|
||||||
overview = _.filter(
|
overview = _.filter(
|
||||||
overview
|
overview
|
||||||
(item) ->
|
(item) ->
|
||||||
return item if item isnt data.groupBy
|
return item if item isnt @groupBy
|
||||||
return
|
return
|
||||||
)
|
)
|
||||||
|
|
||||||
# get new order
|
# get new order
|
||||||
groupObjects = _.groupBy(
|
groupObjects = _.groupBy(
|
||||||
data.objects
|
@objects
|
||||||
(item) ->
|
(item) ->
|
||||||
return '' if !item[data.groupBy]
|
return '' if !item[@groupBy]
|
||||||
return item[data.groupBy].displayName() if item[data.groupBy].displayName
|
return item[@groupBy].displayName() if item[@groupBy].displayName
|
||||||
item[data.groupBy]
|
item[@groupBy]
|
||||||
)
|
)
|
||||||
groupOrder = []
|
groupOrder = []
|
||||||
for group, value of groupObjects
|
for group, value of groupObjects
|
||||||
|
@ -143,41 +154,71 @@ class App.ControllerTable extends App.Controller
|
||||||
)
|
)
|
||||||
|
|
||||||
# create new data array
|
# create new data array
|
||||||
data.objects = []
|
@objects = []
|
||||||
for group in groupOrder
|
for group in groupOrder
|
||||||
data.objects = data.objects.concat groupObjects[group]
|
@objects = @objects.concat groupObjects[group]
|
||||||
groupObjects[group] = [] # release old array
|
groupObjects[group] = [] # release old array
|
||||||
|
|
||||||
# get header data
|
# get header data
|
||||||
header = []
|
headers = []
|
||||||
for item in overview
|
for item in overview
|
||||||
headerFound = false
|
headerFound = false
|
||||||
for attributeName, attribute of attributes
|
for attributeName, attribute of attributes
|
||||||
if attributeName is item
|
if attributeName is item
|
||||||
headerFound = true
|
headerFound = true
|
||||||
header.push attribute
|
if @headerWidth[attribute.name]
|
||||||
|
attribute.style = "width: #{@headerWidth[attribute.name]}px"
|
||||||
|
headers.push attribute
|
||||||
else
|
else
|
||||||
rowWithoutId = item + '_id'
|
rowWithoutId = item + '_id'
|
||||||
if attributeName is rowWithoutId
|
if attributeName is rowWithoutId
|
||||||
headerFound = true
|
headerFound = true
|
||||||
header.push attribute
|
if @headerWidth[attribute.name]
|
||||||
|
attribute.style = "width: #{@headerWidth[attribute.name]}px"
|
||||||
|
headers.push attribute
|
||||||
|
|
||||||
|
if @orderDirection && @orderBy
|
||||||
|
for header in headers
|
||||||
|
if header.name is @orderBy
|
||||||
|
@objects = _.sortBy(
|
||||||
|
@objects
|
||||||
|
(item) ->
|
||||||
|
# if we need to sort translated col.
|
||||||
|
if header.translate
|
||||||
|
App.i18n.translateInline(item[header.name])
|
||||||
|
# if we need to sort a relation
|
||||||
|
if header.relation
|
||||||
|
if item[header.name]
|
||||||
|
App[header.relation].find(item[header.name]).displayName()
|
||||||
|
else
|
||||||
|
''
|
||||||
|
else
|
||||||
|
item[header.name]
|
||||||
|
)
|
||||||
|
if @orderDirection is 'DESC'
|
||||||
|
header.sortOrderIcon = ['arrow-down', 'table-sort-arrow']
|
||||||
|
@objects = @objects.reverse()
|
||||||
|
else
|
||||||
|
header.sortOrderIcon = ['arrow-up', 'table-sort-arrow']
|
||||||
|
else
|
||||||
|
header.sortOrderIcon = undefined
|
||||||
|
|
||||||
# execute header callback
|
# execute header callback
|
||||||
if data.callbackHeader
|
if @callbackHeader
|
||||||
for callback in data.callbackHeader
|
for callback in @callbackHeader
|
||||||
header = callback(header)
|
headers = callback(headers)
|
||||||
|
|
||||||
# get content
|
# get content
|
||||||
@log 'debug', 'table', 'header', header, 'overview', 'objects', data.objects
|
@log 'debug', 'table', 'header', headers, 'overview', 'objects', @objects
|
||||||
table = App.view('generic/table')(
|
table = App.view('generic/table')(
|
||||||
header: header
|
header: headers
|
||||||
objects: data.objects
|
objects: @objects
|
||||||
checkbox: data.checkbox
|
checkbox: @checkbox
|
||||||
radio: data.radio
|
radio: @radio
|
||||||
groupBy: data.groupBy
|
groupBy: @groupBy
|
||||||
class: data.class
|
class: @class
|
||||||
destroy: destroy
|
destroy: destroy
|
||||||
callbacks: data.callbackAttributes
|
callbacks: @callbackAttributes
|
||||||
)
|
)
|
||||||
|
|
||||||
# convert to jquery object
|
# convert to jquery object
|
||||||
|
@ -189,15 +230,15 @@ class App.ControllerTable extends App.Controller
|
||||||
#mouseover: 'alias'
|
#mouseover: 'alias'
|
||||||
|
|
||||||
# bind col.
|
# bind col.
|
||||||
if data.bindCol
|
if @bindCol
|
||||||
for name, item of data.bindCol
|
for name, item of @bindCol
|
||||||
if item.events
|
if item.events
|
||||||
position = 0
|
position = 0
|
||||||
if data.checkbox
|
if @checkbox
|
||||||
position += 1
|
position += 1
|
||||||
hit = false
|
hit = false
|
||||||
|
|
||||||
for headerName in header
|
for headerName in headers
|
||||||
if !hit
|
if !hit
|
||||||
position += 1
|
position += 1
|
||||||
if headerName.name is name || headerName.name is "#{name}_id"
|
if headerName.name is name || headerName.name is "#{name}_id"
|
||||||
|
@ -216,9 +257,9 @@ class App.ControllerTable extends App.Controller
|
||||||
)
|
)
|
||||||
|
|
||||||
# bind row
|
# bind row
|
||||||
if data.bindRow
|
if @bindRow
|
||||||
if data.bindRow.events
|
if @bindRow.events
|
||||||
for event, callback of data.bindRow.events
|
for event, callback of @bindRow.events
|
||||||
do (table, event, callback) ->
|
do (table, event, callback) ->
|
||||||
if cursorMap[event]
|
if cursorMap[event]
|
||||||
table.find('tbody > tr').css( 'cursor', cursorMap[event] )
|
table.find('tbody > tr').css( 'cursor', cursorMap[event] )
|
||||||
|
@ -229,9 +270,9 @@ class App.ControllerTable extends App.Controller
|
||||||
)
|
)
|
||||||
|
|
||||||
# bind bindCheckbox
|
# bind bindCheckbox
|
||||||
if data.bindCheckbox
|
if @bindCheckbox
|
||||||
if data.bindCheckbox.events
|
if @bindCheckbox.events
|
||||||
for event, callback of data.bindCheckbox.events
|
for event, callback of @bindCheckbox.events
|
||||||
do (table, event, callback) ->
|
do (table, event, callback) ->
|
||||||
table.delegate('input[name="bulk"]', event, (e) ->
|
table.delegate('input[name="bulk"]', event, (e) ->
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
|
@ -241,18 +282,21 @@ class App.ControllerTable extends App.Controller
|
||||||
)
|
)
|
||||||
|
|
||||||
# bind on delete dialog
|
# bind on delete dialog
|
||||||
if data.model && destroy
|
if @model && destroy
|
||||||
table.delegate('[data-type="destroy"]', 'click', (e) =>
|
table.delegate('[data-type="destroy"]', 'click', (e) =>
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
itemId = $(e.target).parents('tr').data('id')
|
itemId = $(e.target).parents('tr').data('id')
|
||||||
item = data.model.find(itemId)
|
item = @model.find(itemId)
|
||||||
new App.ControllerGenericDestroyConfirm(
|
new App.ControllerGenericDestroyConfirm(
|
||||||
item: item
|
item: item
|
||||||
container: @container
|
container: @container
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# if we have a personalised table
|
||||||
|
if @table_id
|
||||||
|
|
||||||
# enable resize column
|
# enable resize column
|
||||||
table.on 'mousedown', '.js-col-resize', @onColResizeMousedown
|
table.on 'mousedown', '.js-col-resize', @onColResizeMousedown
|
||||||
table.on 'click', '.js-col-resize', @stopPropagation
|
table.on 'click', '.js-col-resize', @stopPropagation
|
||||||
|
@ -261,7 +305,7 @@ class App.ControllerTable extends App.Controller
|
||||||
table.on 'click', '.js-sort', @sortByColumn
|
table.on 'click', '.js-sort', @sortByColumn
|
||||||
|
|
||||||
# enable checkbox bulk selection
|
# enable checkbox bulk selection
|
||||||
if data.checkbox
|
if @checkbox
|
||||||
|
|
||||||
# click first tr>td, catch click
|
# click first tr>td, catch click
|
||||||
table.delegate('tr > td:nth-child(1)', event, (e) ->
|
table.delegate('tr > td:nth-child(1)', event, (e) ->
|
||||||
|
@ -285,7 +329,7 @@ class App.ControllerTable extends App.Controller
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
return table
|
table
|
||||||
|
|
||||||
stopPropagation: (event) =>
|
stopPropagation: (event) =>
|
||||||
event.stopPropagation()
|
event.stopPropagation()
|
||||||
|
@ -322,11 +366,47 @@ class App.ControllerTable extends App.Controller
|
||||||
rightColumnKey = @resizeTargetRight.attr('data-column-key')
|
rightColumnKey = @resizeTargetRight.attr('data-column-key')
|
||||||
|
|
||||||
# save table changed widths
|
# save table changed widths
|
||||||
# @storeColWidths [
|
storeColWidths = [
|
||||||
# { key: leftColumnKey, width: leftWidth }
|
{ key: leftColumnKey, width: leftWidth }
|
||||||
# { key: rightColumnKey, width: rightWidth }
|
{ key: rightColumnKey, width: rightWidth }
|
||||||
# ]
|
]
|
||||||
|
|
||||||
|
@log 'error', @table_id, 'leftColumnKey', leftColumnKey, leftWidth, 'rightColumnKey', rightColumnKey, rightWidth
|
||||||
|
@preferencesStore('headerWidth', leftColumnKey, leftWidth)
|
||||||
|
@preferencesStore('headerWidth', rightColumnKey, rightWidth)
|
||||||
|
|
||||||
sortByColumn: (event) =>
|
sortByColumn: (event) =>
|
||||||
column = $(event.currentTarget).closest('[data-column-key]').attr('data-column-key')
|
column = $(event.currentTarget).closest('[data-column-key]').attr('data-column-key')
|
||||||
|
|
||||||
# sort
|
# sort
|
||||||
|
if @orderBy isnt column
|
||||||
|
@orderBy = column
|
||||||
|
@orderDirection = 'ASC'
|
||||||
|
else
|
||||||
|
if @orderDirection is 'ASC'
|
||||||
|
@orderDirection = 'DESC'
|
||||||
|
else
|
||||||
|
@orderDirection = 'ASC'
|
||||||
|
|
||||||
|
@log 'debug', @table_id, 'sortByColumn', @orderBy, 'direction', @orderDirection
|
||||||
|
@preferencesStore('order', 'orderBy', @orderBy)
|
||||||
|
@preferencesStore('order', 'orderDirection', @orderDirection)
|
||||||
|
@render()
|
||||||
|
|
||||||
|
preferencesStore: (type, key, value) ->
|
||||||
|
data = @preferencesGet()
|
||||||
|
if !data[type]
|
||||||
|
data[type] = {}
|
||||||
|
if !data[type][key]
|
||||||
|
data[type][key] = {}
|
||||||
|
data[type][key] = value
|
||||||
|
localStorage.setItem(@preferencesStoreKey(), JSON.stringify(data))
|
||||||
|
|
||||||
|
preferencesGet: =>
|
||||||
|
storeKey = @preferencesStoreKey()
|
||||||
|
data = localStorage.getItem(storeKey)
|
||||||
|
return {} if !data
|
||||||
|
JSON.parse(data)
|
||||||
|
|
||||||
|
preferencesStoreKey: =>
|
||||||
|
"tablePreferences:#{@table_id}"
|
||||||
|
|
|
@ -273,19 +273,6 @@ class Table extends App.Controller
|
||||||
headers.unshift(0)
|
headers.unshift(0)
|
||||||
headers[0] = attribute
|
headers[0] = attribute
|
||||||
headers
|
headers
|
||||||
callbackSortOrderHeader = (headers) =>
|
|
||||||
return headers if !@overview
|
|
||||||
return headers if !@overview.order
|
|
||||||
return headers if !@overview.order.by
|
|
||||||
for header in headers
|
|
||||||
if header.name is @overview.order.by
|
|
||||||
if @overview.order.direction is 'DESC'
|
|
||||||
header.sortOrderIcon = ['arrow-down', 'table-sort-arrow']
|
|
||||||
else
|
|
||||||
header.sortOrderIcon = ['arrow-up', 'table-sort-arrow']
|
|
||||||
else
|
|
||||||
header.sortOrderIcon = undefined
|
|
||||||
headers
|
|
||||||
callbackIcon = (value, object, attribute, header, refObject) ->
|
callbackIcon = (value, object, attribute, header, refObject) ->
|
||||||
value = ' '
|
value = ' '
|
||||||
attribute.class = object.iconClass()
|
attribute.class = object.iconClass()
|
||||||
|
@ -294,12 +281,15 @@ class Table extends App.Controller
|
||||||
value
|
value
|
||||||
|
|
||||||
new App.ControllerTable(
|
new App.ControllerTable(
|
||||||
|
table_id: "ticket_overview_#{@overview_id}"
|
||||||
overview: @overview.view.s
|
overview: @overview.view.s
|
||||||
el: @$('.table-overview')
|
el: @$('.table-overview')
|
||||||
model: App.Ticket
|
model: App.Ticket
|
||||||
objects: ticket_list_show
|
objects: ticket_list_show
|
||||||
checkbox: checkbox
|
checkbox: checkbox
|
||||||
groupBy: @overview.group_by
|
groupBy: @overview.group_by
|
||||||
|
orderBy: @overview.order.by
|
||||||
|
orderDirection: @overview.order.direction
|
||||||
bindRow:
|
bindRow:
|
||||||
events:
|
events:
|
||||||
'click': openTicket
|
'click': openTicket
|
||||||
|
@ -307,7 +297,7 @@ class Table extends App.Controller
|
||||||
# customer_id:
|
# customer_id:
|
||||||
# events:
|
# events:
|
||||||
# 'mouseover': popOver
|
# 'mouseover': popOver
|
||||||
callbackHeader: [ callbackIconHeader, callbackSortOrderHeader ]
|
callbackHeader: [ callbackIconHeader ]
|
||||||
callbackAttributes:
|
callbackAttributes:
|
||||||
icon:
|
icon:
|
||||||
[ callbackIcon ]
|
[ callbackIcon ]
|
||||||
|
|
|
@ -547,6 +547,15 @@ class App.TicketZoom extends App.Controller
|
||||||
# validate article
|
# validate article
|
||||||
articleParams = @formParam( @$('.article-add') )
|
articleParams = @formParam( @$('.article-add') )
|
||||||
console.log 'submit article', articleParams
|
console.log 'submit article', articleParams
|
||||||
|
|
||||||
|
# check if attachment exists but no body
|
||||||
|
attachmentCount = @$('.article-add .textBubble .attachments .attachment').length
|
||||||
|
if !articleParams['body'] && attachmentCount > 0
|
||||||
|
if !confirm( App.i18n.translateContent('Please fill also some text in!') )
|
||||||
|
@formEnable(e)
|
||||||
|
@autosaveStart()
|
||||||
|
return
|
||||||
|
|
||||||
if articleParams['body']
|
if articleParams['body']
|
||||||
articleParams.from = @Session.get().displayName()
|
articleParams.from = @Session.get().displayName()
|
||||||
articleParams.ticket_id = ticket.id
|
articleParams.ticket_id = ticket.id
|
||||||
|
@ -590,8 +599,7 @@ class App.TicketZoom extends App.Controller
|
||||||
|
|
||||||
# check attachment
|
# check attachment
|
||||||
if articleParams['body']
|
if articleParams['body']
|
||||||
if App.Utils.checkAttachmentReference( articleParams['body'] )
|
if App.Utils.checkAttachmentReference( articleParams['body'] ) && attachmentCount < 1
|
||||||
if @$('.article-add .textBubble .attachments .attachment').length < 1
|
|
||||||
if !confirm( App.i18n.translateContent('You use attachment in text but no attachment is attached. Do you want to continue?') )
|
if !confirm( App.i18n.translateContent('You use attachment in text but no attachment is attached. Do you want to continue?') )
|
||||||
@formEnable(e)
|
@formEnable(e)
|
||||||
@autosaveStart()
|
@autosaveStart()
|
||||||
|
|
|
@ -15,8 +15,8 @@
|
||||||
<% end %>
|
<% end %>
|
||||||
<% for item, i in @header: %>
|
<% for item, i in @header: %>
|
||||||
<th<%= " class='#{ item.className }'" if item.className %><%= " style='#{ item.style }'" if item.style %> data-column-key="<%= item.name %>">
|
<th<%= " class='#{ item.className }'" if item.className %><%= " style='#{ item.style }'" if item.style %> data-column-key="<%= item.name %>">
|
||||||
<div class="table-column-head">
|
<div class="table-column-head js-sort">
|
||||||
<div class="table-column-title js-sort">
|
<div class="table-column-title">
|
||||||
<%- @T( item.display ) %>
|
<%- @T( item.display ) %>
|
||||||
</div>
|
</div>
|
||||||
<div class="table-column-sortIcon">
|
<div class="table-column-sortIcon">
|
||||||
|
|
|
@ -536,6 +536,7 @@ returns
|
||||||
|
|
||||||
return if !email
|
return if !email
|
||||||
return if email.empty?
|
return if email.empty?
|
||||||
|
return if email !~ /@/
|
||||||
|
|
||||||
# save/update avatar
|
# save/update avatar
|
||||||
avatar = Avatar.auto_detection(
|
avatar = Avatar.auto_detection(
|
||||||
|
|
|
@ -107,6 +107,44 @@ class AgentTicketActionLevel6Test < TestCase
|
||||||
value: 'test 6 - ticket 1-1',
|
value: 'test 6 - ticket 1-1',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# add attachment without body
|
||||||
|
@browser.execute_script( "App.TestHelper.attachmentUploadFake('.active .article-add .textBubble .attachments')" )
|
||||||
|
|
||||||
|
# submit form
|
||||||
|
click(
|
||||||
|
css: '.active .js-submit',
|
||||||
|
)
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
# check warning
|
||||||
|
alert = @browser.switch_to.alert
|
||||||
|
alert.dismiss()
|
||||||
|
|
||||||
|
ticket_update(
|
||||||
|
data: {
|
||||||
|
body: 'now submit should work',
|
||||||
|
},
|
||||||
|
do_not_submit: true,
|
||||||
|
)
|
||||||
|
|
||||||
|
# submit form
|
||||||
|
click(
|
||||||
|
css: '.active .js-submit',
|
||||||
|
)
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
# discard changes should gone away
|
||||||
|
watch_for_disappear(
|
||||||
|
css: '.content.active .js-reset',
|
||||||
|
value: '(Discard your unsaved changes.|Verwerfen der)',
|
||||||
|
no_quote: true,
|
||||||
|
)
|
||||||
|
ticket_verify(
|
||||||
|
data: {
|
||||||
|
body: '',
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
#
|
#
|
||||||
# ticket customer change checks
|
# ticket customer change checks
|
||||||
#
|
#
|
||||||
|
|
|
@ -1076,7 +1076,7 @@ wait untill text in selector disabppears
|
||||||
element.clear
|
element.clear
|
||||||
|
|
||||||
# workaround, sometimes focus is not triggered
|
# workaround, sometimes focus is not triggered
|
||||||
element.send_keys( data[:customer] )
|
element.send_keys( data[:customer] + '*' )
|
||||||
sleep 3.5
|
sleep 3.5
|
||||||
|
|
||||||
# check if pulldown is open, it's not working stable via selenium
|
# check if pulldown is open, it's not working stable via selenium
|
||||||
|
|
63
test/fixtures/mail35.box
vendored
Normal file
63
test/fixtures/mail35.box
vendored
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
From MAILER-DAEMON Wed Oct 21 14:42:20 2015
|
||||||
|
Return-Path: <>
|
||||||
|
X-Original-To: info@example.com
|
||||||
|
Delivered-To: znuny-sales@arber.example.com
|
||||||
|
Received-SPF: pass (emea01-am1-obe.outbound.protection.example.com: Sender is authorized to use 'emea01-am1-obe.outbound.protection.example.com' in 'helo' identity (mechanism 'include:spf.protection.example.com' matched)) receiver=arber.example.com; identity=helo; helo=emea01-am1-obe.outbound.protection.example.com; client-ip=7.5.1.1
|
||||||
|
Received: from emea01-am1-obe.outbound.protection.example.com (mail-am1hn0251.outbound.protection.example.com [7.5.1.1])
|
||||||
|
by arber.example.com (Postfix) with ESMTPS id C45775FE6A
|
||||||
|
for <info@example.com>; Wed, 21 Oct 2015 14:42:20 +0200 (CEST)
|
||||||
|
Received: from DB5PR07MB1224.eurprd07.example.com (10.164.41.30) by
|
||||||
|
DB5PR07MB1271.eurprd07.example.com (10.164.41.149) with Microsoft SMTP
|
||||||
|
Server (TLS) id 15.1.306.13; Wed, 21 Oct 2015 12:42:19 +0000
|
||||||
|
Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=<>;
|
||||||
|
Received: from [10.254.48.3] (7.1.5.1) by
|
||||||
|
DB5PR07MB1224.eurprd07.example.com (10.164.41.30) with Microsoft SMTP
|
||||||
|
Server (TLS) id 15.1.306.13; Wed, 21 Oct 2015 12:42:17 +0000
|
||||||
|
Content-Type: text/plain; charset="iso-8859-1"
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Transfer-Encoding: quoted-printable
|
||||||
|
Content-Description: Mail message body
|
||||||
|
Subject: Darlehen bieten jetzt bewerben
|
||||||
|
To: Recipients
|
||||||
|
From: "finances8@firstfinanceloanfirm.example.com"
|
||||||
|
Date: Wed, 21 Oct 2015 13:42:12 +0100
|
||||||
|
Reply-To: <firstfinanceloanfirm@example.com>
|
||||||
|
X-Originating-IP: [7.1.5.1]
|
||||||
|
X-ClientProxiedBy: HE1PR08CA0021.eurprd08.example.com (2.1.1.3) To
|
||||||
|
DB5PR07MB1224.eurprd07.example.com (2.1.1.3)
|
||||||
|
Message-ID: <DB5PR07MB1224A6CA607D429AF81150DCB8380@DB5PR07MB1224.eurprd07.example.com>
|
||||||
|
X-Microsoft-Exchange-Diagnostics: 1;DB5PR07MB1224;2:DvCxn5dPPr2amttb4PujSx7+t6AMFJ+bMPumYN+Dk+H69oto3H01nPU6iR11JyZqjYuc39aPa1k5lilg1WbAYYC0kHdc2mKQP3cz6inS9RukNIIjp80dpFcfU8yflVZsNY8ZgQpWUUY7t8/8kVwNIk4irQFGZXQoXvabUNTR0WE=;3:cJIJTbFfruxjzzq+oDnnGOByaWjKlJGDX3cpo5L+mAR1hw2L5a0fZMkF3wYG+q+GZ8gm2Ylq6Mqhfe6fE0w4uQLvzgqAmKpB3fRRKpApA2W/raC1ervusTDeQp52bwLkuFDfafHeNQyk2ZKMsnFPdQ==;25:ZG++cyGnY1E1dIVYBdN/Zy/fWvaRwl1E1dSpIYrR18AaPp28qkBntNH1fJG8RZLm/ZyOXWGw9Yj6u9ycoyUSCUKmNWSPdSSUfbAoKlwBnZLbzpwmYToJzorzroT+EVXsCkCrGkfMfok+gjpl9H+9az4RQrW8rhwMhSIdA/Ilc3Kd+rNgBJ4sOSqGS7nTbtZHBbW81iXT++s4ab0Jh5KvMc43ue6tDVfHYc3rd1Trr7bBGV+iyE0wtgg164SEMp+3mOaFVMI6UmnL+IDj+bOZGA==
|
||||||
|
X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DB5PR07MB1224;
|
||||||
|
X-Microsoft-Antispam-PRVS: <DB5PR07MB1224BD6289731C40EBA17926B8380@DB5PR07MB1224.eurprd07.example.com>
|
||||||
|
X-Exchange-Antispam-Report-Test: UriScan:;
|
||||||
|
X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(520078)(8121501046)(3002001)(102115026)(6004014)(6003046);SRVR:DB5PR07MB1224;BCL:0;PCL:0;RULEID:;SRVR:DB5PR07MB1224;
|
||||||
|
X-Microsoft-Exchange-Diagnostics: 1;DB5PR07MB1224;4:nnPVuJcrP/HGkCckgwKl7aJvC3EaZ0krj8ntX+WiSR1I+giYX9zPNwiki/7fIAWLYxxG0/aIQ//rReEVZrd/V2EH+PiNIDAHyVGNKBrGHB2R8P4vyh1fHBs8j1bEKNxn+t+4cFXEs7HYuSej9JY/BnQ34PnAsyViJtlWyibsUufjDNziP9JprRSgQf5zcSyffl73Ut0tY6pbX0v9ACVplnon07EhYYRfiBeu2cl6omrPINzMKDUt0BHunryPvXPOMl59CjTavddWiX0aJp/6ZwjF9R7nmgg9hS265qdEUOVhUPEe7cXjC8J3MLvq0auhgaJJVzNtmif56p4CW4eq2XMFbLthte3ORVmY9D8dhcR7tnHh/k9DLTx4zxUrFQWQPx86GNoo4mNssG4uGzUnHtetiDh9OtJbEL6s0aDZQVg=;23:0DFgc9QSh0ZIGritIv/KheEacJ7MAOinGXlKMABgvrIv9kljhHyju2F3owCE3OSUEedBv1vFu2s8OZnJ4m39lvMSxNIrow2MI29QxsoczYojmWHTECeAvkzJ4BYOhR4V0+iv1k1j4jDPFc9eVVY1Wel/ZJuS5DUIdNND9DnUwA2Zyzjm7ng7LF0znPz49lTbW/dkVCg6w4poryjMKWF3+xxT8Wefz7IonyAj+rI666JjaHVgk4puOoRAnDMHdvBF;5:P3QUjzpnvXNdNhdd5ZBd2CjBrl8LjhhxuAV/rMzKVdJCZh8FW6/ILeucXd8JU98DA8RrICLmdb1hbv2KBz4KexXoUD/VQYTn2qAjNqeIChjcjflvgsf6PwlPh4bs9HD+VK8NUSzGd21NkCznQFJaAQ==;24:JiXy13k+O7JUOG7IkzPwFd4RbRutN4QyGqlwL0SWbYsF86ynPrmE0/MLL0JCRqEzzED4KqdqJ2pQ1w86dG0EcA==
|
||||||
|
X-Forefront-PRVS: 073631BD3D
|
||||||
|
X-Forefront-Antispam-Report: SFV:SPM;SFS:(10019020)(6009001)(6049001)(5005620100007);DIR:OUT;SFP:1501;SCL:9;SRVR:DB5PR07MB1224;H:[10.254.48.3];FPR:;SPF:None;PTR:InfoNoRecords;LANG:de;
|
||||||
|
Received-SPF: None (protection.example.com: [10.254.48.3] does not designate
|
||||||
|
permitted sender hosts)
|
||||||
|
SpamDiagnosticOutput: 1:22
|
||||||
|
SpamDiagnosticMetadata: 00000000%2D0000%2D0000%2D0000%2D000000000000
|
||||||
|
X-Microsoft-Exchange-Diagnostics: 1;DB5PR07MB1224;20:zTAZboReXzFThEimKWUfvgFhjfgaw9a0rToyXCe6+Kb8dHZcQ9EjKmYZWkE62uOnvD4VLpAKakk1FJwRcDxBBA==
|
||||||
|
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Oct 2015 12:42:17.1900
|
||||||
|
(UTC)
|
||||||
|
X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted
|
||||||
|
X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB5PR07MB1224
|
||||||
|
X-Microsoft-Exchange-Diagnostics: 1;DB5PR07MB1271;2:5HuMfuoIxYZexWzVgqBch/cN+KXYALcB840unggr+hi7mPMTcPb63gD0Z0sgz1HuRne2t9tCnGlWIfcn7XCzXAAHvuIYuHjTHbFaj/WV0iy94Ehgo6XuM5GfqRlGTuUa/LyJi/BcfZ0jchcBrVjVt0Izn4+UB09P6yRq1/A0YjA=;23:mJyNLyB8E9W7POa18G8yfp1BVI8DgT6RzrItoW2V7KLBKMxiHx443g93/0YeXjBYWpeaIaMy5B9GA5i17vOeCKJZs+LimKbls83Ia+npZB7SXdJj6mBaWAdGwmW9lJ8ePnh1YjSS2oNXepT+uy7E6FZPxqWh3HDN8GJ8u/LJzupxeISrRds+T9crHSexnyVz
|
||||||
|
X-OriginatorOrg: firstfinanceloanfirm.example.com
|
||||||
|
X-UID: 3783
|
||||||
|
Status: RO
|
||||||
|
Content-Length: 397
|
||||||
|
Lines: 10
|
||||||
|
|
||||||
|
Beantworten :firstfinancelender@example.com
|
||||||
|
|
||||||
|
Ich Mr.Squires Peter ist eine zuverl=E4ssige Kreditangebot mit einer
|
||||||
|
Rate von 1.5% f=FCr den Zeitraum von 1 bis 40yrs nur, von der minimalen
|
||||||
|
von 5,000.00euro sie an die maximale Menge an 150,000.000.00euro, so
|
||||||
|
dass f=FCr mehr Details, wenn interessiert kontaktieren Sie mich unter
|
||||||
|
|
||||||
|
firstfinancelender@example.com
|
||||||
|
|
||||||
|
Beantworten :firstfinancelender@example.com
|
||||||
|
|
|
@ -1953,6 +1953,30 @@ Some Text',
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
data: IO.read('test/fixtures/mail35.box'),
|
||||||
|
success: true,
|
||||||
|
result: {
|
||||||
|
0 => {
|
||||||
|
priority: '2 normal',
|
||||||
|
title: 'Darlehen bieten jetzt bewerben',
|
||||||
|
},
|
||||||
|
1 => {
|
||||||
|
sender: 'Customer',
|
||||||
|
type: 'email',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
verify: {
|
||||||
|
users: [
|
||||||
|
{
|
||||||
|
firstname: '',
|
||||||
|
lastname: '',
|
||||||
|
fullname: '"finances8@firstfinanceloanfirm.example.com"',
|
||||||
|
email: '"finances8@firstfinanceloanfirm.example.com"',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
},
|
||||||
]
|
]
|
||||||
process(files)
|
process(files)
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue