首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只有当代码不在函数或类中时,才能使用smtplib向mailtrap发送电子邮件

只有当代码不在函数或类中时,才能使用smtplib向mailtrap发送电子邮件
EN

Stack Overflow用户
提问于 2020-02-04 00:53:19
回答 1查看 333关注 0票数 3

这个问题与python: sending a mail, fails when inside a "with" block有些相似。

我正在使用Python (3.6)向mailtrap发送电子邮件。Mailtrap实际上为您提供了smtplib的集成代码,如下所示:

代码语言:javascript
复制
import smtplib

sender = "Private Person <from@smtp.mailtrap.io>"
receiver = "A Test User <to@smtp.mailtrap.io>"

message = f"""\
Subject: Hi Mailtrap
To: {receiver}
From: {sender}

This is a test e-mail message."""

with smtplib.SMTP("smtp.mailtrap.io", 2525) as server:
    server.login("<MYUSER>", "<MYPASSWORD>")
    server.sendmail(sender, receiver, message)

如果我将上面的代码放在一个模块中并运行它,上面的代码就可以正常工作。我转到mailtrap并验证电子邮件是否在那里。但是,我想将其封装在如下的函数中:

代码语言:javascript
复制
import smtplib
from socket import gaierror


def test():
    sender = "Test Dev <from@smtp.mailtrap.io>"
    receiver = "Test User <to@smtp.mailtrap.io>"
    message = f"""\
    Subject: Hi there
    To: {receiver}
    From: {sender}

    TESTING"""

    try:
        with smtplib.SMTP("smtp.mailtrap.io", 2525) as server:
            server.login("<MYUSER>", "<MYPASSWORD")
            print("Sending email")
            server.sendmail(sender, receiver, message)
        print('Sent')


    except (gaierror, ConnectionRefusedError):
        print('Failed to connect to the server. Bad connection settings?')
    except smtplib.SMTPServerDisconnected:
        print('Failed to connect to the server. Wrong user/password?')
    except smtplib.SMTPException as e:
        print('SMTP error occurred: ' + str(e))

if __name__ == "__main__":
    test()

这不管用。为什么?下面是输出:output image没有连接错误或任何其他异常。然而,我去了mailtrap,在那里找不到电子邮件。

这是一个邮件陷阱问题,还是与smtplib有关?我为这件事绞尽脑汁

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-29 17:14:02

我也有同样的问题,我不能理解它。我确实注意到,当我将消息设为空字符串时,它起作用了。

经过令人尴尬的长时间搜索后,我找到了这个post,它为我指明了解决方案。

您必须设置电子邮件的MIME类型。因此,不只是传递一个字符串,而是传递一个消息对象:

代码语言:javascript
复制
message = MIMEText("TEST!")
    message["Subject"] = "Alert!"
    message["From"] = sender
    message["To"] = receiver

..。然后最终

代码语言:javascript
复制
server.sendmail(sender, receiver, message.as_string())

我的完整发送电子邮件功能如下所示:

代码语言:javascript
复制
    def send_mail(self):
    message = MIMEText("TEST!")
    message["Subject"] = "Alert!"
    message["From"] = sender
    message["To"] = receiver
    try:
        context = ssl.create_default_context()

        with smtplib.SMTP(smtp_server, port) as server:
            server.set_debuglevel(1)
            server.ehlo()  # Can be omitted
            server.starttls(context=context)
            server.ehlo()  # Can be omitted
            server.login(login, password)
            server.sendmail(sender, receiver, message.as_string())
        print('Sent')
    except (gaierror, ConnectionRefusedError):
        print('Failed to connect to the server. Bad connection settings?')
    except smtplib.SMTPServerDisconnected:
        print('Failed to connect to the server. Wrong user/password?')
    except smtplib.SMTPException as e:
        print('SMTP error occurred: ' + str(e))
    except Exception as e:
        print('everything else')

不幸的是,您必须在message对象和sendemail函数中指定发送者和接收者。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60043733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档