发送大量电子邮件时回复此错误
554, Transaction failed: Duplicate header subject
。我正在使用 smtplib
+ aws SES。对于所有消息,标头必须相同。我该如何修复这个错误?如果发送没有主题的消息,一切正常。
import smtplib
import json
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
args = []
msg = MIMEMultipart('alternative')
msg['From'] = '[email protected]'
html = open('mail.html').read()
EMAIL_HOST = 'email-smtp...'
EMAIL_HOST_USER = 'sss'
EMAIL_HOST_PASSWORD = 'ssssss'
EMAIL_PORT = 587
def lambda_handler(event, context):
body = event['Records'][0]['Sns']['Message']
global args
args = json.loads(body)['args']
set_worker(json.loads(body)['method'])()
return 'success'
def set_worker(method):
return {
'email' : email
}.get(method, 'Not found')
def email():
global msg, html
name = args[0]
title = args[1]
msg_body = args[2]
email = args[3]
url = args[4]
subject = "Test"
msg['Subject'] = subject
msg['To'] = email
html = html.format(title, community_name, title, msg_body, community_name)
mime_text = MIMEText(html, 'html')
msg.attach(mime_text)
send_message()
def send_message():
mail = smtplib.SMTP(EMAIL_HOST, EMAIL_PORT)
mail.ehlo()
mail.starttls()
mail.login(EMAIL_HOST_USER, EMAIL_HOST_PASSWORD)
mail.sendmail(msg['From'], msg['To'], msg.as_string())
使用
aws-lambda
时不能使用全局变量。错误在于重复的消息被写入变量msg
。
这个答案可能很晚了,但其他答案似乎并不清楚如何解决问题。
所以这里是如何解决问题的结论:
我们需要调试一下消息是否有重复数据,使用
print(msg.as_string())
,如果有重复数据,则:
重新创建
message = MIMEMultipart()
:
之前(创建消息作为全局变量):
message = MIMEMultipart()
def login():
try:
server = smtplib.SMTP(SMTP_SERVER, port=SMTP_PORT)
server.ehlo()
server.starttls()
server.ehlo()
server.login(SMTP_USERNAME, SMTP_PASSWORD)
return server
except Exception as e:
log_message = "SMTP Server login error: ", e
print(log_message)
logger.info(log_message)
def send_html_email():
message["Subject"] = "治験参加のキャンセルを受け付けました"
message["From"] = EMAIL_SENDER
message["To"] = recipient
message.attach(MIMEText(body, "html"))
message_body = message.as_string()
log_message = f"Sending a email to {recipient} ..."
print(log_message)
logger.info(log_message)
server = login()
server.sendmail(EMAIL_SENDER, recipient, message_body)
log_message = "Email sent successfully"
print(log_message)
logger.info(log_message)
之后(重新创建消息):
def login():
try:
server = smtplib.SMTP(SMTP_SERVER, port=SMTP_PORT)
server.ehlo()
server.starttls()
server.ehlo()
server.login(SMTP_USERNAME, SMTP_PASSWORD)
return server
except Exception as e:
log_message = "SMTP Server login error: ", e
print(log_message)
logger.info(log_message)
def send_html_email():
```
# change here
```
message = MIMEMultipart() # Re-create the message
```
# end changed
```
message["Subject"] = "治験参加のキャンセルを受け付けました"
message["From"] = EMAIL_SENDER
message["To"] = recipient
message.attach(MIMEText(body, "html"))
message_body = message.as_string()
log_message = f"Sending a email to {recipient} ..."
print(log_message)
logger.info(log_message)
server = login()
server.sendmail(EMAIL_SENDER, recipient, message_body)
log_message = "Email sent successfully"
print(log_message)
logger.info(log_message)
希望它能帮助别人。