lib/postmark/message_extensions/mail.rb
module Mail
class Message
attr_accessor :delivered, :postmark_response
def delivered?
self.delivered
end
def tag(val = nil)
default 'TAG', val
end
def tag=(val)
header['TAG'] = val
end
def track_links(val = nil)
self.track_links=(val) unless val.nil?
header['TRACK-LINKS'].to_s
end
def track_links=(val)
header['TRACK-LINKS'] = ::Postmark::Inflector.to_postmark(val)
end
def track_opens(val = nil)
self.track_opens=(val) unless val.nil?
header['TRACK-OPENS'].to_s
end
def track_opens=(val)
header['TRACK-OPENS'] = (!!val).to_s
end
def metadata(val = nil)
if val
@metadata = val
else
@metadata ||= {}
end
end
def metadata=(val)
@metadata = val
end
def postmark_attachments=(value)
Kernel.warn("Mail::Message#postmark_attachments= is deprecated and will " \
"be removed in the future. Please consider using the native " \
"attachments API provided by Mail library.")
@_attachments = value
end
def postmark_attachments
return [] if @_attachments.nil?
Kernel.warn("Mail::Message#postmark_attachments is deprecated and will " \
"be removed in the future. Please consider using the native " \
"attachments API provided by Mail library.")
::Postmark::MessageHelper.attachments_to_postmark(@_attachments)
end
def template_alias(val = nil)
return self[:postmark_template_alias] && self[:postmark_template_alias].to_s if val.nil?
self[:postmark_template_alias] = val
end
attr_writer :template_model
def template_model(model = nil)
return @template_model if model.nil?
@template_model = model
end
def message_stream(val = nil)
self.message_stream = val unless val.nil?
header['MESSAGE-STREAM'].to_s
end
def message_stream=(val)
header['MESSAGE-STREAM'] = val
end
def templated?
!!template_alias
end
def prerender
raise ::Postmark::Error, 'Cannot prerender a message without an associated template alias' unless templated?
unless delivery_method.is_a?(::Mail::Postmark)
raise ::Postmark::MailAdapterError, "Cannot render templates via #{delivery_method.class} adapter."
end
client = delivery_method.api_client
template = client.get_template(template_alias)
response = client.validate_template(template.merge(:test_render_model => template_model || {}))
raise ::Postmark::InvalidTemplateError, response unless response[:all_content_is_valid]
self.body = nil
subject response[:subject][:rendered_content]
text_part do
body response[:text_body][:rendered_content]
end
html_part do
content_type 'text/html; charset=UTF-8'
body response[:html_body][:rendered_content]
end
self
end
def text?
if defined?(super)
super
else
has_content_type? ? !!(main_type =~ /^text$/i) : false
end
end
def html?
text? && !!(sub_type =~ /^html$/i)
end
def body_html
if multipart? && html_part
html_part.decoded
elsif html?
decoded
end
end
def body_text
if multipart? && text_part
text_part.decoded
elsif text? && !html?
decoded
elsif !html?
body.decoded
end
end
def export_attachments
export_native_attachments + postmark_attachments
end
def export_headers
[].tap do |headers|
self.header.fields.each do |field|
key, value = field.name, field.value
next if reserved_headers.include? key.downcase
headers << { "Name" => key, "Value" => value }
end
end
end
def to_postmark_hash
ready_to_send!
::Postmark::MailMessageConverter.new(self).run
end
protected
def pack_attachment_data(data)
::Postmark::MessageHelper.encode_in_base64(data)
end
def export_native_attachments
attachments.map do |attachment|
{
"Name" => attachment.filename,
"Content" => pack_attachment_data(attachment.body.decoded),
"ContentType" => attachment.content_type,
"ContentID" => attachment.inline? ? attachment.url : nil
}.delete_if { |_k, v| v.nil? }
end
end
def reserved_headers
%q[
return-path x-pm-rcpt
from reply-to
sender received
date content-type
cc bcc
subject tag
attachment to
track-opens track-links
postmark-template-alias
message-stream
]
end
end
end