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)}
    end
Opens a message writer stream and gives it to the block.
The stream is valid only in the block, and has these methods:

puts(str = '')::       outputs STR and CR LF.
print(str)::           outputs STR.
printf(fmt, *args)::   outputs sprintf(fmt,*args).
write(str)::           outputs STR and returns the length of written bytes.
<<(str)::              outputs STR and returns self.

If a single CR ("\r") or LF ("\n") is found in the message,
it is converted to the CR LF pair.  You cannot send a binary
message with this method.

=== Parameters

+from_addr+ is a String representing the source mail address.

+to_addr+ is a String or Strings or Array of Strings, representing
the destination mail address or addresses.

=== Example

Net::SMTP.start('smtp.example.com', 25) do |smtp|
smtp.open_message_stream('from@example.com', ['dest@example.com']) do |f|
f.puts 'From: from@example.com'
f.puts 'To: dest@example.com'
f.puts 'Subject: test message'
f.puts
f.puts 'This is a test message.'
end
end

=== Errors

This method may raise:

* Net::SMTPServerBusy
* Net::SMTPSyntaxError
* Net::SMTPFatalError
* Net::SMTPUnknownError
* Net::ReadTimeout
* IOError