【问题标题】:program finished after send an email发送电子邮件后程序完成
【发布时间】:2015-01-08 15:31:15
【问题描述】:

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

创建的代码将无限运行,当触发事件时,我希望收到一封报告该问题的电子邮件,例如 DNS 无法解析有效域、DNS 服务关闭等,但是当收到一封电子邮件时程序退出(返回代码 0),因此电子邮件类应该包含一些我误导的代码,我已经检查了 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()

【问题讨论】:

    标签: python email client twisted


    【解决方案1】:

    是的,用户 Glyph 是对的,现在我觉得现在做这个问题就像个傻瓜:'''(

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

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

    另一个是不需要的,因为触发错误时会调用该函数,但是无论如何我都会更改它:

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

    【讨论】:

      【解决方案2】:

      您正在调用reactor.stop 以在resultDeferred 触发后停止您的程序。如果你停止这样做,你的程序将不再退出。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-05
        • 2019-08-05
        • 1970-01-01
        • 2018-05-10
        • 2015-06-07
        • 1970-01-01
        • 2016-03-26
        • 1970-01-01
        相关资源
        最近更新 更多