Вы использовали имя переменной msg как вложение сообщения MIMEText, так и контейнер сообщений MIMEMultipart.В приведенном ниже коде я изменил имя переменной MIMEText на strMessage.
Неожиданный случай произошел из-за того, что блок попытки не завершен.Либо добавьте что-то в блок try, чтобы завершить составной оператор:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def send_email(user, pwd, recipients, subject):
try:
with open('message.txt') as fp:
# Create a text/plain message
strMessage = MIMEText(fp.read())
recipients = []
with open('emails.txt') as f:
for line in f:
if len(line.strip()) > 0:
recipients.append(line.strip())
#container
msg = MIMEMultipart('alternative')
msg['Subject'] = 'Your reminder'
msg['From'] = 'example@gmail.com'
msg['To'] = ','.join(recipients)
msg.attach(strMessage)
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(user, pwd)
server.sendmail(user, recipients, strMessage.as_string())
server.close()
print("Sent the email!")
finally:
pass
send_email("example@gmail.com", "password", "Subject", "A reminder")
, либо полностью пропустите попытку:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def send_email(user, pwd, recipients, subject):
with open('message.txt') as fp:
# Create a text/plain message
strMessage = MIMEText(fp.read())
recipients = []
with open('emails.txt') as f:
for line in f:
if len(line.strip()) > 0:
recipients.append(line.strip())
#container
msg = MIMEMultipart('alternative')
msg['Subject'] = 'Your reminder'
msg['From'] = 'example@gmail.com'
msg['To'] = ','.join(recipients)
msg.attach(strMessage)
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(user, pwd)
server.sendmail(user, recipients, strMessage.as_string())
server.close()
print("Sent the email!")
send_email("example@gmail.com", "password", "Subject", "A reminder")