def start(helo = 'localhost',
              user = nil, secret = nil, authtype = nil)   # :yield: smtp
      if block_given?
        begin
          do_start helo, user, secret, authtype
          return yield(self)
        ensure
          do_finish
        end
      else
        do_start helo, user, secret, authtype
        return self
      end
    end
Opens a TCP connection and starts the SMTP session.

=== Parameters

+helo+ is the _HELO_ _domain_ that you'll dispatch mails from; see
the discussion in the overview notes.

If both of +user+ and +secret+ are given, SMTP authentication
will be attempted using the AUTH command.  +authtype+ specifies
the type of authentication to attempt; it must be one of
:login, :plain, and :cram_md5.  See the notes on SMTP Authentication
in the overview.

=== Block Usage

When this methods is called with a block, the newly-started SMTP
object is yielded to the block, and automatically closed after
the block call finishes.  Otherwise, it is the caller's
responsibility to close the session when finished.

=== Example

This is very similar to the class method SMTP.start.

require 'net/smtp'
smtp = Net::SMTP.new('smtp.mail.server', 25)
smtp.start(helo_domain, account, password, authtype) do |smtp|
smtp.send_message msgstr, 'from@example.com', ['dest@example.com']
end

The primary use of this method (as opposed to SMTP.start)
is probably to set debugging (#set_debug_output) or ESMTP
(#esmtp=), which must be done before the session is
started.

=== Errors

If session has already been started, an IOError will be raised.

This method may raise:

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