Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Cronjob上的SMTPLIB电子邮件失败_Python_Cron_Smtplib - Fatal编程技术网

Python Cronjob上的SMTPLIB电子邮件失败

Python Cronjob上的SMTPLIB电子邮件失败,python,cron,smtplib,Python,Cron,Smtplib,我正试图通过smtplib从cronjob发送电子邮件。以用户或root用户身份运行python脚本可以正常工作,但是作为cron作业,我“认为”连接到服务器时会遇到问题。 代码本身如下所示: import smtplib, ssl from datetime import datetime def send_mail(subject, mail_text, to_addr): FROM = "myaddress@gmail.com" SUBJECT = subject

我正试图通过smtplib从cronjob发送电子邮件。以用户或root用户身份运行python脚本可以正常工作,但是作为cron作业,我“认为”连接到服务器时会遇到问题。 代码本身如下所示:

import smtplib, ssl
from datetime import datetime

def send_mail(subject, mail_text, to_addr):
    FROM = "myaddress@gmail.com"
    SUBJECT = subject

    TEXT = (mail_text)

    mail_user=FROM
    mail_password="<password>"
    message = """From: %s\nTo: %s\nSubject: %s\n\n%s
    """ % (FROM, TO, SUBJECT, TEXT)
    print("message")
    print(message)
    try:
        print("a")
        server = smtplib.SMTP_SSL("smtp.gmail.com", 465)
        print(server)
        print("b")
        print(server.ehlo())
        print("Login on Server")
        print(server.login(mail_user, mail_password))
        print("Sending Mail")
        print(server.sendmail(FROM, TO, message))
        print("Closing Connection")
        server.close()
        print('Successfully sent the mail')
    except Exception as e:
        print( "failed to send mail")


subject="Start-Test"
mail_text="Cron-Job started"
to_addr="somewhere@example.com"
print ("Job started:")
print datetime.now()

send_mail(subject, mail_text, to_addr)
<module 'smtplib' from '/usr/lib/python2.7/smtplib.pyc'>
Job started:
2020-01-02 14:06:53.229564
message
From: myaddress@gmail.com
To: somewhere@example.com
Subject: Start-Test

Cron-Job started

a
failed to send mail
导入smtplib、ssl
从日期时间导入日期时间
def发送邮件(主题、邮件文本、收件人):
FROM=”myaddress@gmail.com"
主语
TEXT=(邮件文本)
mail_user=FROM
mail_password=“”
消息=“发件人:%s\n收件人:%s\n对象:%s\n\n%s
“”“%(从、到、主题、文本)
打印(“消息”)
打印(信息)
尝试:
打印(“a”)
server=smtplib.SMTP_SSL(“SMTP.gmail.com”,465)
打印(服务器)
打印(“b”)
打印(server.ehlo())
打印(“在服务器上登录”)
打印(服务器登录(邮件用户、邮件密码))
打印(“发送邮件”)
打印(server.sendmail(发件人、收件人、邮件))
打印(“关闭连接”)
server.close()
打印('已成功发送邮件')
例外情况除外,如e:
打印(“发送邮件失败”)
主题=“开始测试”
mail_text=“Cron作业已启动”
地址=“somewhere@example.com"
打印(“作业已启动:”)
打印datetime.now()
发送邮件(主题、邮件文本、收件人)
如果我通过“python”从命令行运行代码,我会得到以下输出:

<module 'smtplib' from '/usr/lib/python2.7/smtplib.pyc'> 
Job started: 2020-01-02 14:06:31.20274

message From: myaddress@gmail.com 
To: somewhere@example.com 
Subject: Start-Test 
Cron-Job started 
a 
<smtplib.SMTP_SSL instance at 0x76bbab48> 
b 
(250, 'smtp.gmail.com at your service, [92.211.42.193]\nSIZE 35882577\n8BITMIME\nAUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH\nENHANCEDSTATUSCODES\nPIPELINING\nCHUNKING\nSMTPUTF8') 
Login on Server (235, '2.7.0 Accepted') 
Sending Mail {} 
Closing Connection

作业开始时间:2020-01-02 14:06:31.20274
发信人:myaddress@gmail.com 
致:somewhere@example.com 
主题:启动测试
Cron作业已启动
A.
B
(250,'smtp.gmail.com随时为您服务,[92.211.42.193]\nSIZE 35882577\n8BITMIME\nAUTH登录普通XOAUTH2普通客户端令牌OAUTHBEARER XOAUTH\nENHANCEDSTATUSCODES\nPipeling\nCHUNKING\nSMTPUTF8')
在服务器上登录(235,“接受2.7.0”)
发送邮件{}
闭合连接
但是,如果从cronjob运行相同的脚本,并将输出打印到文件中,则会得到以下结果:

import smtplib, ssl
from datetime import datetime

def send_mail(subject, mail_text, to_addr):
    FROM = "myaddress@gmail.com"
    SUBJECT = subject

    TEXT = (mail_text)

    mail_user=FROM
    mail_password="<password>"
    message = """From: %s\nTo: %s\nSubject: %s\n\n%s
    """ % (FROM, TO, SUBJECT, TEXT)
    print("message")
    print(message)
    try:
        print("a")
        server = smtplib.SMTP_SSL("smtp.gmail.com", 465)
        print(server)
        print("b")
        print(server.ehlo())
        print("Login on Server")
        print(server.login(mail_user, mail_password))
        print("Sending Mail")
        print(server.sendmail(FROM, TO, message))
        print("Closing Connection")
        server.close()
        print('Successfully sent the mail')
    except Exception as e:
        print( "failed to send mail")


subject="Start-Test"
mail_text="Cron-Job started"
to_addr="somewhere@example.com"
print ("Job started:")
print datetime.now()

send_mail(subject, mail_text, to_addr)
<module 'smtplib' from '/usr/lib/python2.7/smtplib.pyc'>
Job started:
2020-01-02 14:06:53.229564
message
From: myaddress@gmail.com
To: somewhere@example.com
Subject: Start-Test

Cron-Job started

a
failed to send mail

作业已启动:
2020-01-02 14:06:53.229564
消息
发件人:myaddress@gmail.com
致:somewhere@example.com
主题:启动测试
Cron作业已启动
A.
无法发送邮件
无论我是否以任何一种方式带来cronjob,行为都是相同的: “sudo crontab-e”或“crontab-e”。 在两个crontab中,我都有以下条目(一次一个):

@重新启动python/my_script.py>/logfile.txt

在另一个脚本中,我打印了PATH变量,这在命令行和cron选项卡之间是相同的

知道哪里出了问题吗?smtplib似乎是基于print语句(也是python解释器)正确找到的。 事先已经非常感谢了


Moadl

我的答案被删除了,尽管我认为这仍然是正确的答案,也许Jean Francois更明智,可以发布一个更正性的回复/评论,而不是删除我的

所以我会重新发布它


当脚本在重新启动后运行时,网络可能还不可用,因此smtplib无法连接到SMTP服务器。您可以在cronjob中添加短暂睡眠,或者在python脚本中添加重试

为了知道到底出了什么问题,您可以打印异常


网络无法访问
仍然与网络故障有关,您只是通过硬编码IP忽略了DNS解析错误(
名称解析中的临时故障


为了进行双重检查,只需运行@reboot cron,使用
ping-c4 8.8.8.8>/tmp/ping\u result

确定,在系统关闭一段时间后,情况会得到解决。 问题是,按照@olisch的建议,在启动后的初始时间内,网络不可访问,并且类似于@snakecharmerb和@tripleee的指针

阅读本文和调试后,其他人应注意以下几点: -从crontab输出到文件: “>文件”本身是不够的,因为这不会是打印错误。 “>文件2>&1”也将包含错误消息 -对脚本的crontab调用需要系统中的完整路径:在处理脚本时,测试期间的常用命令是: python./my_file.py 但是,cron脚本将不在该目录中,因此请使用完整路径 python/home/myname/directory/my_file.py
==>同样,如果调用中使用了2>&1,则将打印“未找到文件消息”。

我现在尝试了这两种建议,实际打印实际错误的指针已被很好地使用。启动等待时间为60秒后出现的初始错误是[Errno-3]名称解析暂时失败,我通过输入从ping响应中获取的直接IP地址“修复”了该错误。在此之后,我现在得到:“[Errno 101]网络无法访问”。当时网络已经运行了“很长”时间,我可以通过putty连接来“证明”。重新启动时?你可以在PuTTY启动时连接它吗?当然不是。@tripleee:我可以在启动重新启动命令20秒后通过putty连接。我的睡眠时间是60秒。你发布的代码中没有
sleep
。无论如何,我绝对相信这里的“网络不可用”错误消息。我目前无法访问系统,下周无法再次查看。我投入的睡眠不是在上面的原始代码中,而是通过一个shell脚本进行的,该脚本sllep运行60秒,然后调用python脚本。我目前的解决办法是每天在一个愚蠢的时间重新启动,并通过一个正常的定时cronjob按计划启动。