2015-12-14 66 views
3

如果应用程序中出现404或500错误,我如何能让Flask发送电子邮件给我?我在我的config.py中插入了以下内容,我遇到了here,但我没有收到任何电子邮件。我是Flask的新手,请原谅任何错误。如何从Flask发邮件给我自己的错误日志?

from app import app 

ADMINS = ['[email protected]'] 
if not app.debug: 
    import logging 
    from logging.handlers import SMTPHandler 
    mail_handler = SMTPHandler('smtpout.secureserver.net', 
           '[email protected]', 
           ADMINS, 'YourApplication Failed', 
           credentials=('[email protected]','***'), 
           port=25) 
    mail_handler.setLevel(logging.ERROR) 
    app.logger.addHandler(mail_handler) 

我也是受了一点这条线从文档困惑:

If your mail server requires credentials, these can also be provided.

我的服务器不作为“邮件服务器”。我应该提供什么凭据?我的电子邮件托管在GoDaddy。

回答

6

你需要这样的添加凭据您的电子邮件(用户名和密码):

mail_handler = SMTPHandler(mailhost=('smtpout.secureserver.net',25), 
          fromaddr='[email protected]', 
          toaddrs=ADMINS, subject='YourApplication Failed', 
          credentials=('mail_username','mail_password')) 

在本质上,你需要登录到(从GoDaddy的)您的邮件帐户,以便能够发送电子邮件。使用的IP需要是由godaddy提供的用于STMP服务的IP(我相信它是smtpout.secureserver.net),没有SSL的端口是25,80,3535中的一个,如果您使用SSL,端口是465.

希望它有帮助!

编辑: 由于它仍然无法正常工作,所以我应该添加一个完整的最小源代码来测试它,这是quickstart最简单的hello单词示例,它修改为在发生错误时发送电子邮件并始终失败

from flask import Flask 
app = Flask(__name__) 

@app.route('/') 
def hello_world(): 
    raise Exception 
    #return 'Hello World!' 

if __name__ == '__main__': 
    ADMINS = ['[email protected]'] 
    if not app.debug: 
     import logging 
     from logging.handlers import SMTPHandler 
     mail_handler = SMTPHandler(mailhost=('smtpout.secureserver.net',25), 
          fromaddr='[email protected]', 
          toaddrs=ADMINS, subject='YourApplication Failed', 
          credentials=('[email protected]','mypassword')) 
     mail_handler.setLevel(logging.ERROR) 
     app.logger.addHandler(mail_handler) 
    app.run() 

这是你需要检查你需要使用实际的SMTP服务器重要寿:上GoDaddy的完全测试(美国)(它会在您每次访问页面时发送电子邮件)。当你登录godaddy时,点击电子邮件管理按钮(电子邮件工作区上的按钮),进入顶部菜单工具 - >服务器功能。之后,选择您的域和最后一行(SMTP),你应该会看到我提供的SMTP外出访问一个域名,在我来说,我有不同的人对不同的领域:

smtpout.asia.secureserver.net 
smtpout.secureserver.net 

找到一个您需要使用和修改我的示例代码,您应该在您的godaddy电子邮件的Web界面上立即收到电子邮件。

一旦你有正确的服务器,并使用您的凭据运行应用程序时,您会收到一封电子邮件,像这样的:

Exception on/[GET] 
Traceback (most recent call last): 
File "C:\Python27\lib\site-packages\flask\app.py", line 1817, in wsgi_app 
response = self.full_dispatch_request() 
File "C:\Python27\lib\site-packages\flask\app.py", line 1477, in full_dispatch_request 
rv = self.handle_user_exception(e) 
File "C:\Python27\lib\site-packages\flask\app.py", line 1381, in handle_user_exception 
reraise(exc_type, exc_value, tb) 
File "C:\Python27\lib\site-packages\flask\app.py", line 1475, in full_dispatch_request 
rv = self.dispatch_request() 
File "C:\Python27\lib\site-packages\flask\app.py", line 1461, in dispatch_request 
return self.view_functions[rule.endpoint](**req.view_args) 
File "hello.py", line 6, in hello_world 
raise Exception 
Exception 
+0

这很有道理,谢谢。我有修改,但不幸的是,仍然没有看到我的收件箱中的任何电子邮件发生错误。我用你的建议编辑了我的答案。我在'credentials'后添加了'port'。我安装了日志记录模块。 – mapr

+0

设置您需要使用的端口mailhost =('smtpout.secureserver.net',25)我正在编辑答案来澄清这一点。也许你需要尝试先使用另一个客户端来设置smtp服务器来检查它是否正常工作,然后配置它。另外请记住,要使用godaddy提供的信息仔细检查地址和端口,如果您不知道在哪里可以找到它,请联系客户支持部门,只需调用它即可。 –

+0

好的,谢谢。我会仔细看看的。但在第二行“info @ mydomain.com”之后,它会导致语法错误。它说'关键字arg'后面的非关键字arg。刚刚看到你的编辑后碰到这个:http://stackoverflow.com/questions/8191721/smtphandler-in-pythons-logging-module-sending-emails-one-at-a-time-how-can-is – mapr

0

有一件事你应该做的是考虑使用烧瓶邮件(https://pythonhosted.org/flask-mail/#configuring-flask-mail)。它有助于组织电子邮件过程。阅读:(http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xi-email-support

假设你没有在你的域名具有SMTP服务:

回复。证书。在您的域名注册商处设置电子邮件转发。然后设置一个Gmail帐户或其他服务来发送电子邮件。 (https://webapps.stackexchange.com/questions/66228/add-new-alias-to-gmail-without-smtp-forwarding-only-address)。 (请参阅@John的答案)

然后将[email protected]发送到[email protected]。然后,您可以通过gmail或其他服务(例如mailgun)从[email protected]发送邮件。

+0

谢谢,检查出这些资源。 – mapr