简体   繁体   中英

TypeError: 'NoneType' object is not iterable :smtplib

    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)

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM