程序在发送电子邮件后完成

时间:2014-11-11 22:30:01

标签: python email client twisted

电子邮件类已经过测试,并且具有在使用有效凭据时发送电子邮件的功能。当我使用扭曲的多种协议时,问题就出现了;例如,协议扭曲邮件和扭曲的DNS或扭曲的IRC。

创建的代码将无休止地运行,当触发事件时,我希望收到报告问题的电子邮件,例如DNS无法解析有效域,DNS服务已关闭等等,但收到电子邮件时程序退出(返回代码0),因此类Email应该包含一些我误导的代码,我已经检查了API,但是没有关于我遗漏的内容的线索。

我目前用来发送电子邮件的课程:

class Email:
def __init__(self):
    threading.Thread.__init__(self)
    self.smtp_server = "SMTP"
    self.user_name = "MAIL@DOMAIN"
    self.user_password = "MAIL_PASSWORD"
    self.portTLS = 587
    self.portSSL = 465

def sendEmail(self, m):
    contextFactory = ClientContextFactory()
    contextFactory.method = SSLv3_METHOD

    resultDeferred = Deferred()
    senderFactory = ESMTPSenderFactory(
    self.user_name,
    self.user_password,
    self.user_name,
    m.to,
    m.text,
    resultDeferred,
    contextFactory=contextFactory)

    reactor.connectTCP(self.smtp_server, self.portTLS, senderFactory)
    resultDeferred.addCallbacks(self.cbSentMessage, self.ebSentMessage)
    return resultDeferred

def cbSentMessage(self, result):
    print "Message sent"
    reactor.stop()

def ebSentMessage(self, err):
    err.printTraceback()
    reactor.stop()

2 个答案:

答案 0 :(得分:0)

reactor.stop点火后,您正在致电resultDeferred以停止您的计划。如果你停止这样做,你的程序将不再退出。

(另外,你应该摆脱对threading.Thread.__init__的调用,这是不必要的,几乎肯定会导致其他错误。)

答案 1 :(得分:0)

是的,用户雕文是对的,现在我觉得自己感觉自己像现在这样做的傻瓜:'''(

解决方案是在回调函数上删除reactor.stop(),因此这些函数现在为:

 def cbSentMessage(self, result):
    print "Message sent"

在另一个中是不必要的,因为当一个错误被触发时调用该函数,但是无论如何我都改变了它:

 def ebSentMessage(self, err):
    err.printTraceback()