小编Mar*_*tey的帖子

如何使用python smtplib向多个收件人发送电子邮件?

经过多次搜索后,我无法找到如何使用smtplib.sendmail发送给多个收件人.问题是每次发送邮件时邮件标题似乎包含多个地址,但事实上只有第一个收件人才会收到电子邮件.

问题似乎是email.Message模块期望与smtplib.sendmail()函数不同的东西.

简而言之,要发送给多个收件人,您应将标头设置为逗号分隔的电子邮件地址字符串.但该sendmail()参数to_addrs应该是电子邮件地址列表.

from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
import smtplib

msg = MIMEMultipart()
msg["Subject"] = "Example"
msg["From"] = "me@example.com"
msg["To"] = "malcom@example.com,reynolds@example.com,firefly@example.com"
msg["Cc"] = "serenity@example.com,inara@example.com"
body = MIMEText("example email body")
msg.attach(body)
smtp = smtplib.SMTP("mailhost.example.com", 25)
smtp.sendmail(msg["From"], msg["To"].split(",") + msg["Cc"].split(","), msg.as_string())
smtp.quit()
Run Code Online (Sandbox Code Playgroud)

python email message smtp smtplib

180
推荐指数
12
解决办法
20万
查看次数

如何在不延迟任务的情况下优雅地重新启动Celery

我们使用Celery和我们的Django webapp来管理离线任务; 其中一些任务可以运行长达120秒.

每当我们进行任何代码修改时,我们都需要重新启动Celery以重新加载新的Python代码.我们当前的解决方案是将SIGTERM发送到主Celery进程(kill -s 15 `cat /var/run/celeryd.pid`),然后等待它死并重新启动它(python manage.py celeryd --pidfile=/var/run/celeryd.pid [...]).

由于长时间运行的任务,这通常意味着关闭将花费一两分钟,在此期间不会处理任何新任务,从而导致当前站点上的用户显着延迟.我正在寻找一种方法告诉Celery关闭,但随后立即启动一个新的Celery实例来开始运行新任务.

事情并没有工作:

  • 将SIGHUP发送到主进程:这导致Celery尝试通过执行热关闭然后重新启动来"重启".这不仅需要很长时间,甚至还不起作用,因为显然新工艺在旧工艺死亡之前启动,因此新工艺会ERROR: Pidfile (/var/run/celeryd.pid) already exists. Seems we're already running? (PID: 13214)立即抱怨并死亡.(这看起来像芹菜本身的一个错误;我让他们知道它.)
  • 将SIGTERM发送到主进程,然后立即启动新实例:与Pidfile相同的问题.
  • 完全禁用Pid文件:如果没有它,我们无法告诉30个Celery进程中哪一个是我们希望它进行热关闭时需要发送SIGTERM的主要进程.我们也没有可靠的方法来检查主要过程是否仍然存在.

linux django pid celery celeryd

24
推荐指数
2
解决办法
1万
查看次数

标签 统计

celery ×1

celeryd ×1

django ×1

email ×1

linux ×1

message ×1

pid ×1

python ×1

smtp ×1

smtplib ×1