【问题标题】:smtplib disconnected when sending multiple emails发送多封电子邮件时 smtplib 断开连接
【发布时间】:2014-08-31 05:58:25
【问题描述】:

我正在尝试使用 SMTPlib 通过 python 发送电子邮件。我可以以标准方式发送一封电子邮件。现在,我想发送多封电子邮件,应该有一种方法可以在发送电子邮件之前不登录,每次都退出服务器。我尝试了以下。我将所有内容都包装在一个 SendEmail 类中,并在其 init() 方法中连接到服务器:

class SendEmail:

def __init__(self):
    self.username='username@yahoo.com';
    self.password='password';
    self.server=smtplib.SMTP('smtp.mail.yahoo.com',587);
    self.server.starttls();
    self.server.login(self.username,self.password);

现在,我尝试使用类的 SendAnEmail() 方法发送多封电子邮件:

def SendAnEmail(self,reciever):
    message='blah';

    try:
        self.server.sendmail(self.username,reciever,message);
        print 'Message Sent'
    except:
        self.server.quit();
        self.server=None;

当我声明类的一个瞬间,并第一次调用 SendAnEmail() 时,它可以工作。 当我第二次调用它时,它给了我一个错误,说服务器已断开连接。 由于我没有销毁类实例,服务器是如何断开连接的? 以及周围的方法是什么。每次发送电子邮件时我都应该连接、登录和退出吗?

所以,在主函数中:

def main():
    mail0=SendEmail();
    mail0.SendAnEmail('reciever1@yahoo.com');#this works
    time.sleep(60);
    mail0.SendAnEmail('reciever2@yahoo.com');#this does not work

【问题讨论】:

    标签: python email smtplib


    【解决方案1】:

    删除time.sleep(60) - 雅虎不会等待那么久(30 秒?)并且会关闭连接。

    其他几件事:

    1. Python 在行尾不需要分号
    2. sendmail() 接受收件人列表,因此您可以一次性向多个收件人发送电子邮件。

    【讨论】:

    • 这是我的主要问题。 SMTPlib 连接是否仅用于发送一封电子邮件?我认为 server.login() 类似于登录以在浏览器中阅读电子邮件,我登录,发送一堆电子邮件,并保持登录状态直到我注销。所以 server.login() 不能那样工作吗?我知道 Python 并不“需要”分号。这只是我的 CPP 习惯。是的,我也可以接收多个收件人,但我只想检查为什么 SMTP 在多次调用同一类实例之间断开连接?
    • 您是否真的尝试过取消 60 秒睡眠,然后在同一个 SMTP 实例上发送多封电子邮件?你会发现它会起作用。 SMTP 服务器不会让您的连接永远保持打开状态,如果没有任何活动,它会在不到 60 秒的时间后关闭连接(或注销)——我猜大概是 30 秒。您可以自己尝试这些简单的测试。
    • 好的,我尝试通过更改 60 秒睡眠。这行得通。非常感谢。
    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 2012-02-16
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    相关资源
    最近更新 更多