如何修复“554,交易失败:重复标头‘主题’”?

问题描述 投票:0回答:2

发送大量电子邮件时回复此错误

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())
python python-2.7 amazon-ses smtplib
2个回答
0
投票

使用

aws-lambda
时不能使用全局变量。错误在于重复的消息被写入变量
msg


0
投票

这个答案可能很晚了,但其他答案似乎并不清楚如何解决问题。

所以这里是如何解决问题的结论:

我们需要调试一下消息是否有重复数据,使用

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)

希望它能帮助别人。

© www.soinside.com 2019 - 2024. All rights reserved.