SMTP:邮件未通过 AWS Glue Python 作业发送

Posted

技术标签:

【中文标题】SMTP:邮件未通过 AWS Glue Python 作业发送【英文标题】:SMTP : Mail not getting sent through AWS Glue Python job 【发布时间】:2021-02-02 08:22:09 【问题描述】:

我正在尝试通过 AWS Glue 作业发送邮件。邮件将包含从 s3 存储桶获取的多个附件。根据日志,它一直运行到 server.login()。它在 server.sendmail() 函数中失败。 以下是代码-

def sendEmail(TO, SUBJECT, BODY_html):
    msg = MIMEMultipart('alternative')
    msg['Subject'] = SUBJECT
    msg['From'] = SENDER
    msg['To'] = ','.join(RECIPIENT + TO)
    part1 = MIMEText(BODY_HTML, 'html')
    msg.attach(part1)
    s3 = boto3.resource('s3')
    bucket = s3.Bucket('sample-bucket')
    for obj in bucket.objects.filter(Delimiter='/', Prefix='sample-folder/'):
        filename =  ((obj.key).split("/")[1])
        s3_object = s3_obj.s3_get_object(sample-bucket, 'sample-folder/'+ filename)
        body = s3_object['Body'].read()
        part = MIMEApplication(body, filename)
        part.add_header("Content-Disposition", 'attachment', filename=filename)
        msg.attach(part)
    try:
        server = smtplib.SMTP(HOST, PORT)
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(USERNAME_SMTP, PASSWORD_SMTP)
        server.sendmail(SENDER, RECIPIENT, msg.as_string()) ***--Error***
        server.close()
        print (msg)
        print ("Email sent")

我收到以下错误 -

Error: (554, b'Transaction failed: Expected \'=\', got "null"')

有什么问题?

【问题讨论】:

什么是 SMTP HOST @stdunbar 这是一个 AWS 主机 SENDER 怎么样?确保它看起来不错并且没有空格字符。 @stdunbar 是的,一切看起来都不错。 你有没有先在本地机器/aws lambda 上测试过这个? 【参考方案1】:

我得到了答案。问题在于从 s3 读取文件的方式。第一次迭代的输出是 -

样本桶/样本文件夹/

所以,它采用了一个空对象并且失败了。所以,我只是跳过了迭代中的第一个对象并执行了整个操作。有效。 请在下面找到最终代码 -

def sendEmail(TO, SUBJECT, BODY_HTML):
    msg = MIMEMultipart('alternative')
    msg['Subject'] = SUBJECT
    msg['From'] = SENDER
    msg['To'] = ','.join(RECIPIENT + TO)
    part1 = MIMEText(BODY_HTML, 'html')
    msg.attach(part1)
    s3 = boto3.resource('s3')
    bucket = s3.Bucket('sample-bucket')
    **it = iter(bucket.objects.filter(Delimiter='/', Prefix='sample-folder/'))
    next(it, None)
    for obj in it:**
        filename =  ((obj.key).split("/")[1])
        s3_object = s3_obj.s3_get_object(sample-bucket, 'sample-folder/'+ filename)
        body = s3_object['Body'].read()
        part = MIMEApplication(body, filename)
        part.add_header("Content-Disposition", 'attachment', filename=filename)
        msg.attach(part)
    try:
        server = smtplib.SMTP(HOST, PORT)
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(USERNAME_SMTP, PASSWORD_SMTP)
        server.sendmail(SENDER, RECIPIENT, msg.as_string()) 
        server.close()
        print (msg)
        print ("Email sent")

【讨论】:

以上是关于SMTP:邮件未通过 AWS Glue Python 作业发送的主要内容,如果未能解决你的问题,请参考以下文章

通过 SMTP 使用 AWS SES 发送电子邮件,错误 421

具有下推谓词的 AWS Glue Dynamic_frame 未正确过滤

使用第三方 smtp 服务器时的 AWS EC2 电子邮件发送限制

未执行 Aurora 目标的 AWS Glue Pre 和 Post 操作

Python 发送邮件

未通过 google smtp 发送的电子邮件