Bug #2241 ยป smtp_rcptto.patch
| lib/net/smtp.rb (working copy) | ||
|---|---|---|
|
include SMTPError
|
||
|
end
|
||
|
# Represents a fatal SMTP error (error code 5xx, except for 500)
|
||
|
# Represents SMTP error code 550, user unknown
|
||
|
class SMTPUnknownUser < ProtoFatalError
|
||
|
include SMTPError
|
||
|
end
|
||
|
|
||
|
# Represents a fatal SMTP error (error code 5xx, except for 500 and 550)
|
||
|
class SMTPFatalError < ProtoFatalError
|
||
|
include SMTPError
|
||
|
end
|
||
| ... | ... | |
|
# * Net::SMTPAuthenticationError
|
||
|
# * Net::SMTPServerBusy
|
||
|
# * Net::SMTPSyntaxError
|
||
|
# * Net::SMTPUnknownUser
|
||
|
# * Net::SMTPFatalError
|
||
|
# * Net::SMTPUnknownError
|
||
|
# * IOError
|
||
| ... | ... | |
|
# * Net::SMTPAuthenticationError
|
||
|
# * Net::SMTPServerBusy
|
||
|
# * Net::SMTPSyntaxError
|
||
|
# * Net::SMTPUnknownUser
|
||
|
# * Net::SMTPFatalError
|
||
|
# * Net::SMTPUnknownError
|
||
|
# * IOError
|
||
| ... | ... | |
|
#
|
||
|
# * Net::SMTPServerBusy
|
||
|
# * Net::SMTPSyntaxError
|
||
|
# * Net::SMTPUnknownUser
|
||
|
# * Net::SMTPFatalError
|
||
|
# * Net::SMTPUnknownError
|
||
|
# * IOError
|
||
| ... | ... | |
|
def send_message(msgstr, from_addr, *to_addrs)
|
||
|
raise IOError, 'closed session' unless @socket
|
||
|
mailfrom from_addr
|
||
|
rcptto_list to_addrs
|
||
|
data msgstr
|
||
|
ok_users, unknown_users = rcptto_list to_addrs.flatten
|
||
|
res = data msgstr
|
||
|
raise SMTPUnknownUser, "Unknown users: #{unknown_users.join', '}, mail delivered to #{ok_users.join', '}" if not unknown_users.empty?
|
||
|
res
|
||
|
end
|
||
|
alias send_mail send_message
|
||
| ... | ... | |
|
#
|
||
|
# * Net::SMTPServerBusy
|
||
|
# * Net::SMTPSyntaxError
|
||
|
# * Net::SMTPUnknownUser
|
||
|
# * Net::SMTPFatalError
|
||
|
# * Net::SMTPUnknownError
|
||
|
# * IOError
|
||
| ... | ... | |
|
def open_message_stream(from_addr, *to_addrs, &block) # :yield: stream
|
||
|
raise IOError, 'closed session' unless @socket
|
||
|
mailfrom from_addr
|
||
|
rcptto_list to_addrs
|
||
|
data(&block)
|
||
|
ok_users, unknown_users = rcptto_list to_addrs.flatten
|
||
|
res = data(&block)
|
||
|
raise SMTPUnknownUser, "Failed to deliver for #{unknown_users.join', '}, succesful for #{ok_users.join', '}" if not unknown_users.empty?
|
||
|
res
|
||
|
end
|
||
|
alias ready open_message_stream # obsolete
|
||
| ... | ... | |
|
def rcptto_list(to_addrs)
|
||
|
raise ArgumentError, 'mail destination not given' if to_addrs.empty?
|
||
|
to_addrs.flatten.each do |addr|
|
||
|
rcptto addr
|
||
|
unknown_users = []
|
||
|
to_addrs.each do |addr|
|
||
|
begin
|
||
|
rcptto addr
|
||
|
rescue SMTPUnknownUser
|
||
|
unknown_users << addr
|
||
|
end
|
||
|
end
|
||
|
if unknown_users.length == to_addrs.flatten.length
|
||
|
raise SMTPUnknownUser, "Unknown users: #{unknown_users.join', '}"
|
||
|
else
|
||
|
[to_addrs - unknown_users, unknown_users]
|
||
|
end
|
||
|
end
|
||
|
def rcptto(to_addr)
|
||
| ... | ... | |
|
when /\A4/ then SMTPServerBusy
|
||
|
when /\A50/ then SMTPSyntaxError
|
||
|
when /\A53/ then SMTPAuthenticationError
|
||
|
when /\A550/ then SMTPUnknownUser
|
||
|
when /\A5/ then SMTPFatalError
|
||
|
else SMTPUnknownError
|
||
|
end
|
||