Python smtplib send_message() failing, returning AttributeError: 'str' object has no attribute 'get_all'

10,656

The signature for SMTP.send_message is not the same as SMTP.sendmail. So try:

server.send_message(msg, fromaddr, toaddrs)

EDIT:

You also need to add the To: headers as a string, rather than as a list:

receivers = ['[email protected]', '[email protected]']
msg['To'] = ', '.join(receivers)
Share:
10,656
RPiAwesomeness
Author by

RPiAwesomeness

Socials Old Blog: Sudo'd Youtube Channel: AEVES Tech Rigs Desktop - Custom built, you can see the specs/build stuff here ThinkPad T540p #Skills Advanced: googlefu python Intermediate: gimp building-pcs c++ golang Acceptable: c# bash zsh rust java Absolutely No Clue: perl windows

Updated on June 14, 2022

Comments

  • RPiAwesomeness
    RPiAwesomeness almost 2 years

    I'm working on an project where I have to use the smtplib and email modules in Python 3.4 to send an email.

    I'm able to create the email itself and I'm able to connect to the server, but then it returns this Exception:

    reply: b'235 2.7.0 Accepted\r\n'
    reply: retcode (235); Msg: b'2.7.0 Accepted'
    send: 'QUIT\r\n'
    reply: b'221 2.0.0 closing connection s66sm8304113yhp.2 - gsmtp\r\n'
    reply: retcode (221); Msg: b'2.0.0 closing connection s66sm8304113yhp.2 - gsmtp'
    Traceback (most recent call last):
      File "base.py", line 108, in <module>
        send(fromaddr, toaddrs, msg)
      File "base.py", line 61, in send
        server.send_message(fromaddr, toaddrs, msg)
      File "/usr/lib/python3.4/smtplib.py", line 829, in send_message
        resent = msg.get_all('Resent-Date')
    AttributeError: 'str' object has no attribute 'get_all'
    

    The code (troublesome line linked directly to) is available here. Strangely enough, the code actually sends QUIT prior to actually sending any of the email body - not sure if that's something that would affect this.

    Does anyone know what is causing this error?

    EDIT Turns out that part of my issue was that I was using the incorrect format. send_message() requires the variables in the order of Message, From, To, while my code was sending it in the order of From, To, Message.

    However, I'm now getting this error:

    reply: b'235 2.7.0 Accepted\r\n'
    reply: retcode (235); Msg: b'2.7.0 Accepted'
    send: 'QUIT\r\n'
    reply: b'221 2.0.0 closing connection s66sm8443316yhp.2 - gsmtp\r\n'
    reply: retcode (221); Msg: b'2.0.0 closing connection s66sm8443316yhp.2 - gsmtp'
    Traceback (most recent call last):
      File "MIME-base.py", line 108, in <module>
        send(fromaddr, toaddrs, msg)
      File "MIME-base.py", line 61, in send
        server.send_message(msg, fromaddr, toaddrs)
      File "/usr/lib/python3.4/smtplib.py", line 839, in send_message
        g.flatten(msg_copy, linesep='\r\n')
      File "/usr/lib/python3.4/email/generator.py", line 109, in flatten
        self._write(msg)
      File "/usr/lib/python3.4/email/generator.py", line 189, in _write
        self._write_headers(msg)
      File "/usr/lib/python3.4/email/generator.py", line 416, in _write_headers
        self._fp.write(self.policy.fold_binary(h, v))
      File "/usr/lib/python3.4/email/_policybase.py", line 325, in fold_binary
        folded = self._fold(name, value, sanitize=self.cte_type=='7bit')
      File "/usr/lib/python3.4/email/_policybase.py", line 352, in _fold
        parts.append(h.encode(linesep=self.linesep,
    AttributeError: 'list' object has no attribute 'encode'
    
  • RPiAwesomeness
    RPiAwesomeness almost 9 years
    Thanks for pointing that out, I had missed the difference. I'm not getting that error any more, but I'm now getting this error: AttributeError: 'list' object has no attribute 'encode'. I'll update my question with the full traceback.
  • RPiAwesomeness
    RPiAwesomeness almost 9 years
    Never mind, just figured out the new error on my own. It was caused by the msg['To'] = input().split() line, since that takes the input and makes a list. Thanks, accepting your answer.
  • ekhumoro
    ekhumoro almost 9 years
    @RPiAwesomeness. Yes: you need to add each item separately (I already updated my answer).
  • TopherGopher
    TopherGopher over 5 years
    This saved me. I really wish this had been called out explicitly somewhere. Thanks @ekhumoro!
  • The Great
    The Great about 2 years
    hi, help please. even am getting same error. despite following this format. server.send_message(msg_body,message['From'],rec_list)
  • The Great
    The Great about 2 years
    My rec_list looks like below = message['To'] = ", ".join(rec_list). I also passed message['To'] instead of rec_list in send_message function but still it throws error. can help please? AttributeError: 'str' object has no attribute 'get_all'
  • The Great
    The Great about 2 years
    Here is the post - can help me please? stackoverflow.com/questions/71746290/…