【问题标题】:How do I schedule an email to send at a certain time using cron and smtp, in python?如何在 python 中使用 cron 和 smtp 安排电子邮件在特定时间发送?
【发布时间】:2020-05-08 00:24:21
【问题描述】:

到目前为止,我只能发送电子邮件。这是我的代码:

import smtplib

email_user = 'myemail@gmail.com'
server = smtplib.SMTP ('smtp.gmail.com', 587)
server.starttls()
server.login(email_user, 'email pass')

#SET TIME HERE?
from crontab import CronTab

#EMAIL
message = 'sending this from python!'
server.sendmail(email_user, email_user, message)
server.quit()

我正在努力设定发送电子邮件的时间。如果有人也能帮我弄清楚如何添加附件,那就太好了!

【问题讨论】:

  • 你的操作系统是什么?
  • Windows 是我的操作系统

标签: python email cron smtp smtplib


【解决方案1】:

假设您的 send_email() 函数已经在工作,我会这样做:

import datetime as dt
import time
import smtplib

def send_email():
    email_user = 'myemail@gmail.com'
    server = smtplib.SMTP ('smtp.gmail.com', 587)
    server.starttls()
    server.login(email_user, 'email pass')

    #EMAIL
    message = 'sending this from python!'
    server.sendmail(email_user, email_user, message)
    server.quit()

send_time = dt.datetime(2018,8,26,3,0,0) # set your sending time in UTC
time.sleep(send_time.timestamp() - time.time())
send_email()
print('email sent')

如果你想定期发送邮件,你可以这样做:

import datetime as dt
import time
import smtplib

def send_email():
    email_user = 'myemail@gmail.com'
    server = smtplib.SMTP ('smtp.gmail.com', 587)
    server.starttls()
    server.login(email_user, 'email pass')

    #EMAIL
    message = 'sending this from python!'
    server.sendmail(email_user, email_user, message)
    server.quit()

def send_email_at(send_time):
    time.sleep(send_time.timestamp() - time.time())
    send_email()
    print('email sent')

first_email_time = dt.datetime(2018,8,26,3,0,0) # set your sending time in UTC
interval = dt.timedelta(minutes=2*60) # set the interval for sending the email

send_time = first_email_time
while True:
    send_email_at(send_time)
    send_time = send_time + interval

您还可以生成一个线程并让该线程处理电子邮件的发送。

【讨论】:

  • 很抱歉,我真的是新手。你能解释一下第 4 行括号内的值是什么意思吗?
  • @这里的格式是dt.datetime(年、月、日、时、分、秒)
  • 我收到未定义 send_email 的错误。
  • 这就是为什么我写了“假设你已经有你的 send_email() 函数工作”,只需将你的代码发送到 send_email() 函数下。
  • @这里太好了,请接受我的回答,这样我就有足够的积分来评论其他人的问题:P
【解决方案2】:

使用 CRON 发送电子邮件的最佳方式是使用 Postfix 和 mailutils。按照以下步骤发送包含 cron 作业结果/错误的电子邮件。

第 1 步 - 安装 Postfix

首先,更新包数据库:

sudo apt update

接下来,安装mailtuils:

sudo apt install mailutils

最后,安装后缀:

sudo apt install postfix

在安装过程即将结束时,您将看到一个类似于下图中的窗口。默认选项是 Internet 站点。这是本教程的推荐选项,因此请按 TAB,然后按 ENTER

选择无配置

第 2 步 - 配置 Postfix

sudo nano /etc/postfix/main.cf

然后将下面的代码粘贴到空文件上。

mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only

mydestination = $myhostname, localhost.$your_domain, $your_domain

保存并关闭文件。 最后,重启 Postfix。

sudo systemctl restart postfix

第 3 步 - 测试 SMTP 服务器

echo "This is the body of the email" | mail -s "This is the subject line" your_email_address

【讨论】:

    猜你喜欢
    • 2015-11-19
    • 2011-04-19
    • 1970-01-01
    • 2022-01-06
    • 2016-03-20
    • 1970-01-01
    • 2021-08-04
    • 2014-11-12
    • 2011-05-30
    相关资源
    最近更新 更多