Question

    def sendmail(self, from_addr, to_addrs, msg='hello', mail_options=[],rcpt_options=[]):
            self.ehlo_or_helo_if_needed()
            esmtp_opts = []
            if self.does_esmtp:
                    # Hmmm? what's this? -ddm
                    # self.esmtp_features['7bit']=""
                    if self.has_extn('size'):
                                esmtp_opts.append("size=%d" % len(msg))
                    for option in mail_options:
                            esmtp_opts.append(option)

            (code, resp) = self.mail(from_addr, esmtp_opts)
            if code != 250:
                self.rset()
                #raise SMTPSenderRefused(code, resp, from_addr)
            senderrs = {}
            if isinstance(to_addrs, basestring):
                to_addrs = [to_addrs]
            for each in to_addrs:
                (code, resp) = self.rcpt(each, rcpt_options)
                if (code != 250) and (code != 251):
                    senderrs[each] = (code, resp)
            if len(senderrs) == len(to_addrs):
                # the server refused all our recipients
                self.rset()
                #raise SMTPRecipientsRefused(senderrs)
            (code, resp) = self.data(msg)
            if code != 250:
                self.rset()
                #raise SMTPDataError(code, resp)
            #if we got here then somebody got our mail
            return senderrs

I am trying to build my own smtplib.I am getting TypeError: 'NoneType' object is not iterable when i try
(code, resp) = self.data(msg)

self.data() is defined as- I am using self.data() to put the message to the server.

    def data(self, msg):
            self.putcmd("data")
            (code, repl) = self.getreply()
            if self.debuglevel > 0:
                    print>>stderr, "data:", (code, repl)
            if code != 354:
                    #raise SMTPDataError(code, repl)
                    print "Err"
            else:
                    q = quotedata(msg)
                    if q[-2:] != CRLF:
                            q = q + CRLF
                    q = q + "." + CRLF
                    self.send(q)
                    (code, msg) = self.getreply()
                    if self.debuglevel > 0:
                            print>>stderr, "data:", (code, msg)
                    return (code, msg)
Was it helpful?

Solution

We can't tell from the code that you have posted what self.data() is doing, but it is clear from your error that it is returning None. If you try to unpack None, you get this:

>>> (code, resp) = None
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not iterable

Posting the code for self.data() might help.

Update after extra code posted:

The code (code, repl) = self.getreply() could also be unpacking None [note: there are two instances of this in self.data()]. Is the exception raised in self.data() or in sendmail()?

Also

if code != 354:
            #raise SMTPDataError(code, repl)
            print "Err"
else:
    ...

If you get code 354, you have commented out the raise and the function now returns None. That might also be the problem.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top