[Tutor] Mail? What's that?

Luke Paireepinart rabidpoobear at gmail.com
Thu Dec 6 06:47:32 CET 2007

Ricardo Aráoz wrote:
> So I eventually got to sending mail with python.
> Some articles, trying and google led me to this script:
> import smtplib
> import time
> date = time.ctime(time.time( ))
> >From = 'mymail at gmail.com'
> To = ['othermail at hotmail.com', 'YetOtherMail at yahoo.com']
> Subj = 'Hi'
> text = ('From: %s\nTo: %s\nDate: %s\nSubject: %s\n\n'
>                          % (From, ';'.join(To), date, Subj))
> s = smtplib.SMTP('smtp.gmail.com')
> s.set_debuglevel(1)
> s.ehlo()
> s.starttls()
> s.ehlo()
> s.login('foo', 'bar')
> s.sendmail(From, To, text)
> s.close()
> So, if there's someone who really knows this stuff in the neighborhood
> I'd like to ask a couple of questions.
> What is ehlo and why do I have to call it twice? And set_debuglevel?
> If I where to connect through other smtp server the sequence would be
> the exactly the same, say yahoo or hotmail?
> Are From: To: Date: and Subject: mandatory in the contents of the
> email(text)?  Do I have to put "real" address in  From when calling
> sendmail()? And in the contents?
> Ok, if someone can answer these I'll be grateful.
> Ricardo
Ricardo -
I say this in the nicest way possible, but did you RTFM? :)
Python has built-in help support on modules.
You should start there, do some Googling, and if you're stumped, get 
some help.  Not for any other reason than it'll probably get you 1) more 
experience at navigating the docs, and 2) a quicker, probably more 
detailed response.

So using Help, we get:

 >>> import smtplib
 >>> help(smtplib)
Help on module smtplib:

    smtplib - SMTP/ESMTP client class.


[snip 10 pages of documentation]

 >>> help(smtplib.SMTP.set_debuglevel)
Help on method set_debuglevel in module smtplib:

set_debuglevel(self, debuglevel) unbound smtplib.SMTP method
    Set the debug output level.
    A non-false value results in debug messages for connection and for all
    messages sent to and received from the server.

 >>> help(smtplib.SMTP.ehlo)
Help on method ehlo in module smtplib:

ehlo(self, name='') unbound smtplib.SMTP method
    SMTP 'ehlo' command.
    Hostname to send for this command defaults to the FQDN of the local

 >>> help(smtplib.SMTP.sendmail)
Help on method sendmail in module smtplib:

sendmail(self, from_addr, to_addrs, msg, mail_options=[], 
rcpt_options=[]) unbound smtplib.SMTP method
    This command performs an entire mail transaction.
    The arguments are:
        - from_addr    : The address sending this mail.
        - to_addrs     : A list of addresses to send this mail to.  A bare
                         string will be treated as a list with 1 address.
        - msg          : The message to send.
        - mail_options : List of ESMTP options (such as 8bitmime) for the
                         mail command.
        - rcpt_options : List of ESMTP options (such as DSN commands) for
                         all the rcpt commands.
    If there has been no previous EHLO or HELO command this session, this
    method tries ESMTP EHLO first.  If the server does ESMTP, message size
    and each of the specified options will be passed to it.  If EHLO
    fails, HELO will be tried and ESMTP options suppressed.
    This method will return normally if the mail is accepted for at least
    one recipient.  It returns a dictionary, with one entry for each
    recipient that was refused.  Each entry contains a tuple of the SMTP
    error code and the accompanying error message sent by the server.
    This method may raise the following exceptions:
     SMTPHeloError          The server didn't reply properly to
                            the helo greeting.
     SMTPRecipientsRefused  The server rejected ALL recipients
                            (no mail was sent).
     SMTPSenderRefused      The server didn't accept the from_addr.
     SMTPDataError          The server replied with an unexpected
                            error code (other than a refusal of
                            a recipient).
    Note: the connection will be open even after an exception is raised.
     >>> import smtplib
     >>> s=smtplib.SMTP("localhost")
tolist=["one at one.org","two at two.org","three at three.org","four at four.org"]
     >>> msg = '''\
     ... From: Me at my.org
     ... Subject: testin'...
     ... This is a test '''
     >>> s.sendmail("me at my.org",tolist,msg)
     { "three at three.org" : ( 550 ,"User unknown" ) }
     >>> s.quit()
    In the above example, the message was accepted for delivery to three
    of the four addresses, and one was rejected, with the error code
    550.  If all addresses are accepted, then the method will return an
    empty dictionary.


So mess around in the built-in docs, then check python.org's docs, and 
let us know what you find :)
Also, try experimenting! pass it stuff that you don't think will work 
just to see if maybe it does :D

More information about the Tutor mailing list