2014-02-03 19:23:00 +00:00
|
|
|
# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
|
2013-06-12 15:59:58 +00:00
|
|
|
|
2012-04-13 16:42:25 +00:00
|
|
|
require 'mail'
|
|
|
|
|
2014-12-27 15:25:58 +00:00
|
|
|
module Channel::EmailBuild
|
2012-04-13 16:42:25 +00:00
|
|
|
|
2014-12-27 14:07:49 +00:00
|
|
|
=begin
|
|
|
|
|
2014-12-27 15:25:58 +00:00
|
|
|
mail = Channel::EmailBuild.build(
|
|
|
|
:from => 'sender@example.com',
|
|
|
|
:to => 'recipient@example.com',
|
|
|
|
:body => 'somebody with some text',
|
|
|
|
:content_type => 'text/plain',
|
2014-12-27 14:07:49 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
2014-12-29 23:25:57 +00:00
|
|
|
def self.build(attr, notification = false)
|
2012-04-13 16:42:25 +00:00
|
|
|
mail = Mail.new
|
|
|
|
|
|
|
|
# set organization
|
|
|
|
organization = Setting.get('organization')
|
|
|
|
if organization then;
|
2012-07-28 16:36:47 +00:00
|
|
|
mail['Organization'] = organization.to_s
|
2012-04-13 16:42:25 +00:00
|
|
|
end
|
2012-08-06 06:29:54 +00:00
|
|
|
|
2012-04-13 16:42:25 +00:00
|
|
|
# notification
|
|
|
|
if notification
|
|
|
|
attr['X-Loop'] = 'yes'
|
|
|
|
attr['Precedence'] = 'bulk'
|
|
|
|
attr['Auto-Submitted'] = 'auto-generated'
|
|
|
|
end
|
2012-08-06 06:29:54 +00:00
|
|
|
|
2014-12-27 14:07:49 +00:00
|
|
|
#attr['X-Powered-BY'] = 'Zammad - Support/Helpdesk (http://www.zammad.org/)'
|
|
|
|
attr['X-Mailer'] = 'Zammad Mail Service (1.x)'
|
2012-08-06 06:29:54 +00:00
|
|
|
|
2012-04-13 16:42:25 +00:00
|
|
|
# set headers
|
2014-12-27 14:07:49 +00:00
|
|
|
attr.each do |key, value|
|
|
|
|
next if key.to_s == 'attachments'
|
|
|
|
next if key.to_s == 'body'
|
|
|
|
next if key.to_s == 'content_type'
|
|
|
|
mail[key.to_s] = value.to_s
|
|
|
|
end
|
|
|
|
|
|
|
|
# add html part
|
|
|
|
if attr[:content_type] && attr[:content_type] == 'text/html'
|
2014-12-30 14:08:20 +00:00
|
|
|
html_alternative = Mail::Part.new do
|
2014-12-27 14:07:49 +00:00
|
|
|
content_type 'text/html; charset=UTF-8'
|
2014-12-29 15:39:59 +00:00
|
|
|
|
|
|
|
# complete check
|
2015-01-08 14:55:52 +00:00
|
|
|
html_document = Channel::EmailBuild.html_complete_check( attr[:body] )
|
2014-12-29 15:39:59 +00:00
|
|
|
|
2015-01-08 14:55:52 +00:00
|
|
|
body html_document
|
2012-04-13 16:42:25 +00:00
|
|
|
end
|
2014-12-27 14:07:49 +00:00
|
|
|
|
|
|
|
# generate plain part
|
2014-12-27 15:25:58 +00:00
|
|
|
attr[:body] = attr[:body].html2text
|
2012-04-13 16:42:25 +00:00
|
|
|
end
|
|
|
|
|
2014-12-27 14:07:49 +00:00
|
|
|
# add plain text part
|
2014-12-30 14:08:20 +00:00
|
|
|
text_alternative = Mail::Part.new do
|
2014-12-27 14:07:49 +00:00
|
|
|
content_type 'text/plain; charset=UTF-8'
|
2012-04-13 16:42:25 +00:00
|
|
|
body attr[:body]
|
|
|
|
end
|
|
|
|
|
2014-12-30 14:08:20 +00:00
|
|
|
# build email without any attachments
|
|
|
|
if !html_alternative && ( !attr[:attachments] || attr[:attachments].empty? )
|
|
|
|
mail.content_type 'text/plain; charset=UTF-8'
|
|
|
|
mail.body attr[:body]
|
|
|
|
return mail
|
|
|
|
end
|
|
|
|
|
|
|
|
# build email with attachments
|
|
|
|
alternative_bodies = Mail::Part.new { content_type 'multipart/alternative' }
|
|
|
|
alternative_bodies.add_part text_alternative
|
|
|
|
|
|
|
|
if html_alternative
|
|
|
|
html_container = Mail::Part.new { content_type 'multipart/related' }
|
|
|
|
html_container.add_part html_alternative
|
|
|
|
alternative_bodies.add_part html_container
|
|
|
|
|
|
|
|
# place to add inline attachments related to html alternative
|
|
|
|
end
|
|
|
|
|
|
|
|
mail.add_part alternative_bodies
|
|
|
|
|
2012-04-13 16:42:25 +00:00
|
|
|
# add attachments
|
|
|
|
if attr[:attachments]
|
|
|
|
attr[:attachments].each do |attachment|
|
2014-12-30 14:08:20 +00:00
|
|
|
if attachment.class == Hash
|
|
|
|
attachment['content-id'] = nil
|
|
|
|
mail.attachments[ attachment[:filename] ] = attachment
|
|
|
|
else
|
|
|
|
mail.attachments[attachment.filename] = {
|
|
|
|
:content_type => attachment.preferences['Content-Type'],
|
|
|
|
:mime_type => attachment.preferences['Mime-Type'],
|
|
|
|
:content => attachment.content,
|
|
|
|
'content-id' => nil,
|
|
|
|
}
|
|
|
|
end
|
2012-04-13 16:42:25 +00:00
|
|
|
end
|
|
|
|
end
|
2014-10-22 21:00:11 +00:00
|
|
|
mail
|
2012-04-13 16:42:25 +00:00
|
|
|
end
|
2014-12-29 15:39:59 +00:00
|
|
|
|
|
|
|
=begin
|
|
|
|
|
|
|
|
full_html_document_string = Channel::EmailBuild.html_complete_check( html_string )
|
|
|
|
|
|
|
|
=end
|
|
|
|
|
|
|
|
def self.html_complete_check(html)
|
|
|
|
return html if html =~ /<html>/i
|
|
|
|
|
2015-01-08 23:01:41 +00:00
|
|
|
css = "font-family:'Helvetica Neue', Helvetica, Arial, Geneva, sans-serif; font-size: 12px;"
|
2014-12-29 15:39:59 +00:00
|
|
|
|
|
|
|
html = <<HERE
|
|
|
|
<!DOCTYPE html>
|
|
|
|
<html>
|
|
|
|
<head>
|
2014-12-29 23:31:57 +00:00
|
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
2015-01-08 23:01:41 +00:00
|
|
|
<style type="text/css">
|
|
|
|
body {
|
|
|
|
width:90% !important;
|
|
|
|
-webkit-text-size-adjust:90%;
|
|
|
|
-ms-text-size-adjust:90%;
|
|
|
|
#{css};
|
|
|
|
}
|
|
|
|
img {
|
|
|
|
outline:none; text-decoration:none; -ms-interpolation-mode: bicubic;
|
|
|
|
}
|
|
|
|
a img {
|
|
|
|
border:none;
|
|
|
|
}
|
|
|
|
table td {
|
|
|
|
border-collapse: collapse;
|
|
|
|
}
|
|
|
|
table {
|
2015-01-09 11:53:44 +00:00
|
|
|
border-collapse: collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;
|
|
|
|
}
|
|
|
|
p, table, div, td {
|
|
|
|
max-width: 600px;
|
2015-01-08 23:01:41 +00:00
|
|
|
}
|
|
|
|
p {
|
|
|
|
margin: 0;
|
|
|
|
}
|
2015-01-09 11:53:44 +00:00
|
|
|
blockquote, pre {
|
|
|
|
margin: 0px;
|
|
|
|
padding: 8px 12px 8px 12px;
|
2015-01-08 23:01:41 +00:00
|
|
|
}
|
2015-01-09 11:53:44 +00:00
|
|
|
|
2015-01-08 23:01:41 +00:00
|
|
|
</style>
|
2014-12-29 15:39:59 +00:00
|
|
|
<head>
|
2014-12-29 17:21:41 +00:00
|
|
|
<body style="#{css}">#{html}</body>
|
2014-12-29 15:39:59 +00:00
|
|
|
</html>
|
|
|
|
HERE
|
|
|
|
|
|
|
|
html
|
|
|
|
end
|
2015-04-27 14:15:29 +00:00
|
|
|
end
|