在Web服务器上运行时Python脚本中断

在Web服务器上运行时Python脚本中断,python,Python,我对Python(以及一般的开发)比较陌生,因此如果能提供任何帮助,我将不胜感激 我已经构建了一个在本地机器上运行的脚本,如果可能的话,我想在我的Web服务器上作为计划任务运行它 该脚本检查专用电子邮件帐户中的新电子邮件,如果主题符合某些条件,则会在文本文件中附加任务纸格式的文本,我将使用工作流(iOS)设置将这些任务添加到omnifocus中 我最初遇到以下错误: NameError: name 'email' is not defined subject = msg['subject'].

我对Python(以及一般的开发)比较陌生,因此如果能提供任何帮助,我将不胜感激

我已经构建了一个在本地机器上运行的脚本,如果可能的话,我想在我的Web服务器上作为计划任务运行它

该脚本检查专用电子邮件帐户中的新电子邮件,如果主题符合某些条件,则会在文本文件中附加任务纸格式的文本,我将使用工作流(iOS)设置将这些任务添加到omnifocus中

我最初遇到以下错误:

NameError: name 'email' is not defined
subject = msg['subject'].split()
AttributeError
:
'NoneType' object has no attribute 'split'
End of script output before headers: omnifocus.py
因此,我添加了“导入电子邮件”,现在出现以下错误:

NameError: name 'email' is not defined
subject = msg['subject'].split()
AttributeError
:
'NoneType' object has no attribute 'split'
End of script output before headers: omnifocus.py
我不确定哪里出了问题,因为它在本地工作,但在我的服务器上不工作。我可以为此设置一个raspberry pi,但因为我已经为一个Web服务器付费了,如果它能为我运行它就太好了

我的代码:

#! /bin/usr/python

import imaplib
import email

ORG_EMAIL   = "@xxx.com"
FROM_EMAIL  = "omnifocus" + ORG_EMAIL
FROM_PWD    = "xxxxxxxxxx"
SMTP_SERVER = "smtp.stackmail.com"
SMTP_PORT   = 993
IMAP_SERVER = 'imap.stackmail.com'

mail = imaplib.IMAP4_SSL(SMTP_SERVER)
mail.login(FROM_EMAIL,FROM_PWD)
mail.select('inbox')
type, data = mail.search(None, 'ALL')
mail_ids = data[0]
id_list = mail_ids.split()

result = []


for i in id_list:
    typ, data = mail.fetch(i, '(RFC822)' )
    msg = email.message_from_string(data[0][1].decode('utf-8'))
    subject = msg['subject'].split()


    if subject[-1] == 'Accepted':
        job_id = subject[-2]
        tp = 'Quote ' + job_id + ' Accepted @autodone(true)\n\t- Complete Site Report @due(5:00 pm) @tag(Work : Computer)\n\t\t' + 'http://xxxxxxx.com?ARGUMENTS=-ALITEJOBDETAIL&jobid=' + job_id
        result.append(tp)
    elif subject[-2] == 'Quote':
        job_id = subject[-1]
        tp = 'Quote ' + job_id + ' Sent @autodone(true)\n\t- 3 day follow up @due(3 days 5:00 pm) @tag(iPhone : Calls)\n\t\t' + 'http://xxxxxxx.com?ARGUMENTS=-ALITEJOBDETAIL&jobid=' + job_id + '\n\t- 7 day follow up @due(7 days 5:00 pm) @tag(iPhone : Calls)\n\t\t' + 'http://xxxxxxx.com?ARGUMENTS=-ALITEJOBDETAIL&jobid=' + job_id + '\n\t- 13 day follow up @due(13 days 5:00 pm) @tag(iPhone : Calls)\n\t\t' + 'http://xxxxxxx.com?PRGNAME=master&ARGUMENTS=-ALITEJOBDETAIL&jobid=' + job_id
        result.append(tp)

    # delete emails, deactivated during test stage
    #mail.store(i, '+FLAGS', '\\Deleted')

taskpaper = '\n'.join(result)

with open('taskpaper.txt', mode='a') as txt:
    f.write('\n' + taskpaper)

可能您的一条消息没有
主题
标题,因此无法获取它。 说明如果使用不存在的标头调用订阅运算符,则该运算符返回
None

\uuuu getitem\uuuu(名称)

返回命名标头字段的值。名称不应包含冒号字段分隔符。如果缺少标头,则返回
None
;一个人永远不会长大

请注意,如果命名字段在消息头中出现多次,那么将返回哪些字段值是未定义的。使用该方法获取所有现有命名头的值


您的环境中可能缺少电子邮件包。。。您是否执行过pip安装电子邮件或类似操作?您可以添加打印语句,将主题变量和msg变量的值写入控制台。这将告诉您在调用电子邮件模块的过程中是否出现了问题,并且没有向您返回有效的msg变量。@JozefCechovsky它已安装,或者他将无法使
导入电子邮件
语句正常工作。谢谢大家,不幸的是,我无法使用pip安装新软件包(共享主机)@dfundako非常感谢您提供此技巧,这是添加到知识库的基本内容,非常感谢。为了更新,我最终修改了脚本并在iPhone上的Pythonista中运行它(而不是在服务器上使用此版本并解析使用工作流创建的文本文件)。最终得到了一个更简单的过程,最重要的是,它可以工作!我认为问题在于锁定的服务器缺少一个包,或者Python 2.7可能存在问题。我正在学习Python3,但是后来我意识到我的服务器运行的是2.7,并且由于我没有Python2的经验,我对我的代码是否符合2.7没有信心。谢谢你的帮助!感谢您的回复,但所有电子邮件都有一个主题行(帐户中有三封电子邮件,if语句中的每种条件各有一封,加上一封不匹配的邮件),代码在我的Mac上运行良好。我最终修改了脚本,并在我的手机上用Pythonista运行它(而不是将其与工作流结合使用)更简单,工作也更完美!谢谢你的时间建议!