Send e-mail to multiple CC and multiple TO recipients simultaneously using python
Asked Answered
S

2

3

Tried with only multiple to and multiple cc individually, which works fine but when i try both i get an error:

File

"path\Continuum\anaconda2\envs\mypython\lib\smtplib.py", line 870, in sendmail senderrs[each] = (code, resp) TypeError: unhashable type: 'list'"

Code:

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.application import MIMEApplication

strFrom = '[email protected]'

cc='[email protected], [email protected]'

to='[email protected],[email protected]'

msg = MIMEMultipart('related')
msg['Subject'] = 'Subject'
msg['From'] = strFrom
msg['To'] =to
msg['Cc']=cc

#msg['Bcc']= strBcc

msg.preamble = 'This is a multi-part message in MIME format.'


msgAlternative = MIMEMultipart('alternative')
msg.attach(msgAlternative)

msgText = MIMEText('This is the alternative plain text message.')
msgAlternative.attach(msgText)


msgText = MIMEText('''<html>

<body><p>Hello<p>
        </body>
        </html> '''.format(**locals()), 'html')
msgAlternative.attach(msgText)



import smtplib
smtp = smtplib.SMTP()
smtp.connect('smtp address')
smtp.ehlo()
smtp.sendmail(strFrom, to, msg.as_string())
smtp.quit()
Sayed answered 2/3, 2018 at 4:40 Comment(2)
Please post the calling code.Vision
If you can't put anything useful in the text/plain part, maybe you should not be producing multipart/alternative at all. (I know some people do this as an empty gesture towards some spam filters which require this, but you are really doing your recipients a disservice by sending them junk.)Graciagracie
E
7

Attaching To or from should be a string and sendmail should always be in the form of the list.

cc=['[email protected]', '[email protected]']

to=['[email protected]','[email protected]']

msg['To'] =','.join(to)

msg['Cc']=','.join(cc)   

toAddress = to + cc    

smtp.sendmail(strFrom, toAddress, msg.as_string())
Epifaniaepifano answered 24/5, 2018 at 7:16 Comment(2)
@GufranHasan can you please tell me reason for downvote so i would improve my answer??Epifaniaepifano
I didn't downvote dear. Just I edit your post for users attraction.Buss
G
4

The to parameter should be a list of all the addresses you wish to send the message to. The division in To: and Cc: is basically for display purposes only; SMTP simply has a single sequence of recipients which translate to one RCPT TO command for each address.

def addresses(addrstring):
    """Split in comma, strip surrounding whitespace."""
    return [x.strip() for x in addrstring.split(',')]

smtp.sendmail(strFrom, addresses(to) + addresses(cc), msg.as_string())
Graciagracie answered 2/3, 2018 at 5:49 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.