Отправка электронного письма с вложением НЕСКОЛЬКИМ людям

Я действительно новичок в отправке писем в python. Я могу отправлять отдельные электронные письма с вложением, несколько электронных писем без одного, но мой код не будет работать для отправки нескольких электронных писем И вложения.

    msg = MIMEMultipart()
    fromaddr = email_user
    toaddr = ["email"]
    cc = ["email2"]
    bcc = ["email3"]

    subject = "This is the subject"
    body = 'Message for the email' 
    msg = "From: %s\r\n" % fromaddr+ "To: %s\r\n" % toaddr + "CC: %s\r\n" % ",".join(cc) + "Subject: %s\r\n" % subject + "\r\n" + body
    toaddr = toaddr + cc + bcc
    msg.attach(MIMEText(body,'plain'))
    filename ="excelfile.xlsx" 
    attachment=open(filename,'rb')
    part = MIMEBase('application','octet-stream')
    part.set_payload((attachment).read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition',"attachment; filename= "+filename)
    msg.attach(part)
    text = msg.as_string()
    server = smtplib.SMTP('smtp.gmail.com',587)
    server.starttls()
    server.login(email_user,email_password)
    server.sendmail(fromaddr, toaddr, message) 
    server.quit()

Я получаю следующую ошибку... AttributeError: объект 'str' не имеет атрибута 'attach'


person coder1234    schedule 22.05.2019    source источник
comment
Вы переписываете переменную msg из MIMEMultipart в Str в строке msg = "From: %s\r\n" % fromaddr+......   -  person Shuvojit    schedule 22.05.2019
comment
Ага, понятно. Как тогда добавить сообщение и вложение?   -  person coder1234    schedule 22.05.2019
comment
Я ничего не знаю о классе MIMEMultipart и его API, но я только что заметил, что вы перезаписываете переменную. Возможно, вы захотите изучить его документацию.   -  person Shuvojit    schedule 22.05.2019


Ответы (1)


Вы можете добиться этого с помощью MIMEMultipart и MIMEText (вот документы: https://docs.python.org/3.4/library/email-examples.html)

В основном вы просто создаете вложение с помощью:

msg=MIMEMultipart()
part = MIMEBase('application', "octet-stream")
part.set_payload(open("attachment.txt", "rb").read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="attachment.txt"')

и прикрепите его к письму:

msg.attach(part)

Вот полный код:

import smtplib                                                                          #import libraries for sending Emails(with attachment)
#this is to attach the attachment file
from email.mime.multipart import MIMEMultipart
#this is for attaching the body of the mail
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

server = smtplib.SMTP('smtp.gmail.com', 587)                                            #connects to Email server
server.starttls()
server.user="your@email" 
server.password="yourpassw"
server.login(server.user, server.password)                                              #log in to server

#creates attachment
msg=MIMEMultipart()
part = MIMEBase('application', "octet-stream")
part.set_payload(open("attachment.txt", "rb").read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="attachment.txt"')

#attach the attachment
msg.attach(part)

#attach the body
msg.attach(MIMEText("your text"))

#sends mail with attachment
server.sendmail(server.user, ["user@1", "user@2", ...], msg=(msg.as_string()))
server.quit()
person Phoenix Flight    schedule 22.05.2019
comment
Пожалуйста, добавьте хотя бы объяснение к вашему ответу, чтобы вас не понизили, не публикуйте просто чистый код. - person mattdaspy; 22.05.2019
comment
это имеет смысл, но куда вы помещаете тело письма?? - person coder1234; 22.05.2019