251 lines
5.6 KiB
Ruby
251 lines
5.6 KiB
Ruby
#--
|
|
# Copyright (c) 1998-2003 Minero Aoki <aamine@loveruby.net>
|
|
#
|
|
# Permission is hereby granted, free of charge, to any person obtaining
|
|
# a copy of this software and associated documentation files (the
|
|
# "Software"), to deal in the Software without restriction, including
|
|
# without limitation the rights to use, copy, modify, merge, publish,
|
|
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
# permit persons to whom the Software is furnished to do so, subject to
|
|
# the following conditions:
|
|
#
|
|
# The above copyright notice and this permission notice shall be
|
|
# included in all copies or substantial portions of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
#
|
|
# Note: Originally licensed under LGPL v2+. Using MIT license for Rails
|
|
# with permission of Minero Aoki.
|
|
#++
|
|
|
|
#:stopdoc:
|
|
require 'nkf'
|
|
#:startdoc:
|
|
|
|
module TMail
|
|
|
|
class Mail
|
|
|
|
def send_to( smtp )
|
|
do_send_to(smtp) do
|
|
ready_to_send
|
|
end
|
|
end
|
|
|
|
def send_text_to( smtp )
|
|
do_send_to(smtp) do
|
|
ready_to_send
|
|
mime_encode
|
|
end
|
|
end
|
|
|
|
def do_send_to( smtp )
|
|
from = from_address or raise ArgumentError, 'no from address'
|
|
(dests = destinations).empty? and raise ArgumentError, 'no receipient'
|
|
yield
|
|
send_to_0 smtp, from, dests
|
|
end
|
|
private :do_send_to
|
|
|
|
def send_to_0( smtp, from, to )
|
|
smtp.ready(from, to) do |f|
|
|
encoded "\r\n", 'j', f, ''
|
|
end
|
|
end
|
|
|
|
def ready_to_send
|
|
delete_no_send_fields
|
|
add_message_id
|
|
add_date
|
|
end
|
|
|
|
NOSEND_FIELDS = %w(
|
|
received
|
|
bcc
|
|
)
|
|
|
|
def delete_no_send_fields
|
|
NOSEND_FIELDS.each do |nm|
|
|
delete nm
|
|
end
|
|
delete_if {|n,v| v.empty? }
|
|
end
|
|
|
|
def add_message_id( fqdn = nil )
|
|
unless @message_id_enforced
|
|
self.message_id = ::TMail::new_message_id(fqdn)
|
|
end
|
|
end
|
|
|
|
def add_date
|
|
self.date = Time.now
|
|
end
|
|
|
|
def mime_encode
|
|
if parts.empty?
|
|
mime_encode_singlepart
|
|
else
|
|
mime_encode_multipart true
|
|
end
|
|
end
|
|
|
|
def mime_encode_singlepart
|
|
self.mime_version = '1.0'
|
|
b = body
|
|
if NKF.guess(b) != NKF::BINARY
|
|
mime_encode_text b
|
|
else
|
|
mime_encode_binary b
|
|
end
|
|
end
|
|
|
|
def mime_encode_text( body )
|
|
self.body = NKF.nkf('-j -m0', body)
|
|
self.set_content_type 'text', 'plain', {'charset' => 'iso-2022-jp'}
|
|
self.encoding = '7bit'
|
|
end
|
|
|
|
def mime_encode_binary( body )
|
|
self.body = [body].pack('m')
|
|
self.set_content_type 'application', 'octet-stream'
|
|
self.encoding = 'Base64'
|
|
end
|
|
|
|
def mime_encode_multipart( top = true )
|
|
self.mime_version = '1.0' if top
|
|
self.set_content_type 'multipart', 'mixed'
|
|
e = encoding(nil)
|
|
if e and not /\A(?:7bit|8bit|binary)\z/i === e
|
|
raise ArgumentError,
|
|
'using C.T.Encoding with multipart mail is not permitted'
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
#:stopdoc:
|
|
class DeleteFields
|
|
|
|
NOSEND_FIELDS = %w(
|
|
received
|
|
bcc
|
|
)
|
|
|
|
def initialize( nosend = nil, delempty = true )
|
|
@no_send_fields = nosend || NOSEND_FIELDS.dup
|
|
@delete_empty_fields = delempty
|
|
end
|
|
|
|
attr :no_send_fields
|
|
attr :delete_empty_fields, true
|
|
|
|
def exec( mail )
|
|
@no_send_fields.each do |nm|
|
|
delete nm
|
|
end
|
|
delete_if {|n,v| v.empty? } if @delete_empty_fields
|
|
end
|
|
|
|
end
|
|
#:startdoc:
|
|
|
|
#:stopdoc:
|
|
class AddMessageId
|
|
|
|
def initialize( fqdn = nil )
|
|
@fqdn = fqdn
|
|
end
|
|
|
|
attr :fqdn, true
|
|
|
|
def exec( mail )
|
|
mail.message_id = ::TMail::new_msgid(@fqdn)
|
|
end
|
|
|
|
end
|
|
#:startdoc:
|
|
|
|
#:stopdoc:
|
|
class AddDate
|
|
|
|
def exec( mail )
|
|
mail.date = Time.now
|
|
end
|
|
|
|
end
|
|
#:startdoc:
|
|
|
|
#:stopdoc:
|
|
class MimeEncodeAuto
|
|
|
|
def initialize( s = nil, m = nil )
|
|
@singlepart_composer = s || MimeEncodeSingle.new
|
|
@multipart_composer = m || MimeEncodeMulti.new
|
|
end
|
|
|
|
attr :singlepart_composer
|
|
attr :multipart_composer
|
|
|
|
def exec( mail )
|
|
if mail._builtin_multipart?
|
|
then @multipart_composer
|
|
else @singlepart_composer end.exec mail
|
|
end
|
|
|
|
end
|
|
#:startdoc:
|
|
|
|
#:stopdoc:
|
|
class MimeEncodeSingle
|
|
|
|
def exec( mail )
|
|
mail.mime_version = '1.0'
|
|
b = mail.body
|
|
if NKF.guess(b) != NKF::BINARY
|
|
on_text b
|
|
else
|
|
on_binary b
|
|
end
|
|
end
|
|
|
|
def on_text( body )
|
|
mail.body = NKF.nkf('-j -m0', body)
|
|
mail.set_content_type 'text', 'plain', {'charset' => 'iso-2022-jp'}
|
|
mail.encoding = '7bit'
|
|
end
|
|
|
|
def on_binary( body )
|
|
mail.body = [body].pack('m')
|
|
mail.set_content_type 'application', 'octet-stream'
|
|
mail.encoding = 'Base64'
|
|
end
|
|
|
|
end
|
|
#:startdoc:
|
|
|
|
#:stopdoc:
|
|
class MimeEncodeMulti
|
|
|
|
def exec( mail, top = true )
|
|
mail.mime_version = '1.0' if top
|
|
mail.set_content_type 'multipart', 'mixed'
|
|
e = encoding(nil)
|
|
if e and not /\A(?:7bit|8bit|binary)\z/i === e
|
|
raise ArgumentError,
|
|
'using C.T.Encoding with multipart mail is not permitted'
|
|
end
|
|
mail.parts.each do |m|
|
|
exec m, false if m._builtin_multipart?
|
|
end
|
|
end
|
|
|
|
end
|
|
#:startdoc:
|
|
end # module TMail
|