66 lines
1.8 KiB
Ruby
66 lines
1.8 KiB
Ruby
=begin rdoc
|
|
|
|
= Attachment handling file
|
|
|
|
=end
|
|
|
|
require 'kconv'
|
|
require 'stringio'
|
|
|
|
module TMail
|
|
class Attachment < StringIO
|
|
attr_accessor :original_filename, :content_type
|
|
alias quoted_filename original_filename
|
|
end
|
|
|
|
class Mail
|
|
def has_attachments?
|
|
attachment?(self) || multipart? && parts.any? { |part| attachment?(part) }
|
|
end
|
|
|
|
# Returns true if this part's content main type is text, else returns false.
|
|
# By main type is meant "text/plain" is text. "text/html" is text
|
|
def text_content_type?
|
|
self.header['content-type'] && (self.header['content-type'].main_type == 'text')
|
|
end
|
|
|
|
def inline_attachment?(part)
|
|
part['content-id'] || (part['content-disposition'] && part['content-disposition'].disposition == 'inline' && !part.text_content_type?)
|
|
end
|
|
|
|
def attachment?(part)
|
|
part.disposition_is_attachment? || (!part.content_type.nil? && !part.text_content_type?) unless part.multipart?
|
|
end
|
|
|
|
def attachments
|
|
if multipart?
|
|
parts.collect { |part| attachment(part) }.flatten.compact
|
|
elsif attachment?(self)
|
|
[attachment(self)]
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def attachment(part)
|
|
if part.multipart?
|
|
part.attachments
|
|
elsif attachment?(part)
|
|
content = part.body # unquoted automatically by TMail#body
|
|
file_name = (part['content-location'] && part['content-location'].body) ||
|
|
part.sub_header('content-type', 'name') ||
|
|
part.sub_header('content-disposition', 'filename') ||
|
|
'noname'
|
|
|
|
return if content.blank?
|
|
|
|
attachment = TMail::Attachment.new(content)
|
|
attachment.original_filename = file_name.strip unless file_name.blank?
|
|
attachment.content_type = part.content_type
|
|
attachment
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|