def data(msgstr = nil, &block)   #:yield: stream
      if msgstr and block
        raise ArgumentError, "message and block are exclusive"
      end
      unless msgstr or block
        raise ArgumentError, "message or block is required"
      end
      res = critical {
        check_continue get_response('DATA')
        if msgstr
          @socket.write_message msgstr
        else
          @socket.write_message_by_block(&block)
        end
        recv_response()
      }
      check_response res
      res
    end
def data(msgstr = nil, &block)   #:yield: stream
      if msgstr and block
        raise ArgumentError, "message and block are exclusive"
      end
      unless msgstr or block
        raise ArgumentError, "message or block is required"
      end
      res = critical {
        check_continue get_response('DATA')
        if msgstr
          @socket.write_message msgstr
        else
          @socket.write_message_by_block(&block)
        end
        recv_response()
      }
      check_response res
      res
    end
This method sends a message.
 If +msgstr+ is given, sends it as a message.
 If block is given, yield a message writer stream.
 You must write message before the block is closed.

   # Example 1 (by string)
   smtp.data(<<EndMessage)
   From: john@example.com
   To: betty@example.com
   Subject: I found a bug

   Check vm.c:58879.
   EndMessage

   # Example 2 (by block)
   smtp.data {|f|
     f.puts "From: john@example.com"
     f.puts "To: betty@example.com"
     f.puts "Subject: I found a bug"
     f.puts ""
     f.puts "Check vm.c:58879."
   }