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

2

9

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'
Simonetta answered 27/4, 2015 at 15:13 Comment(0)
F
10

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)
Flanders answered 27/4, 2015 at 15:55 Comment(7)
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.Simonetta
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.Simonetta
@RPiAwesomeness. Yes: you need to add each item separately (I already updated my answer).Flanders
This saved me. I really wish this had been called out explicitly somewhere. Thanks @ekhumoro!Kentish
hi, help please. even am getting same error. despite following this format. server.send_message(msg_body,message['From'],rec_list)Aklog
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'Aklog
Here is the post - can help me please? #71746790Aklog
L
1

What caused the error for me was the fact that I was mistakingly using send_message instead of sendmail, which are similar but have different argument types

Longoria answered 19/4, 2023 at 6:8 Comment(1)
Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.Harlin

© 2022 - 2024 — McMap. All rights reserved.