首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python快速/高效地发送邮件

python快速/高效地发送邮件
EN

Stack Overflow用户
提问于 2013-11-19 11:14:16
回答 2查看 1.1K关注 0票数 0

我创建了一个小型python脚本,将大约11000封邮件(作为*.eml)转发到我的邮件服务器。邮件附有CSV文件,包含每日能量测量的数据。

因此,我的方法是正确的工作,但它需要近20分钟左右发送邮件!有什么办法加快速度吗?

代码语言:javascript
复制
#! /usr/bin/env python
import os, sys
import email, smtplib


storage_folder = "data/export"
storage_header = 0

mail_server = 'server-address'
mail_username = 'mail-user'
mail_password = 'mail-password'

mail_to = 'mail-address-to'
mail_from = 'mail-sender'


def load_local_mails(file_folder):
    #: scan desired folder for *.eml files
    email_body = []

    for dirname, dirnames, filenames in os.walk(file_folder):
        for filename in filenames:
            if filename.endswith('eml'):
                f = open(os.path.join(dirname, filename))
                email_body.append(f.read())
    return email_body


def send_mail(email_body):
    #: send mails
    smtp = smtplib.SMTP(mail_server, 587)
    smtp.starttls()
    smtp.login(mail_username, mail_password)

    for idx, item in enumerate(email_body):
        m = email.message_from_string(item)
        m.replace_header("From", mail_from)
        m.replace_header("To", mail_to)
        m.replace_header("Subject", m['subject'])

        smtp.sendmail(mail_from, mail_to, m.as_string())
        print "Forwarding mail %d/%d: '%s' from '%s' to %s " % (idx+1, len(email_body), m['subject'], m['date'], mail_to)

    smtp.quit()


def main():
    if len(sys.argv) > 1:
        if sys.argv[1] == '--start':
            send_mail(load_local_mails(sys.argv[2]))

    else:
        exit("Don't know what to do? :(. Goodbye")


if __name__ == '__main__':
    main()

更新:我能够管理直接(SCP)上传到qmail环境中的特定文件夹。我认为这是最快的解决办法!不管怎样,谢谢你的建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-19 11:57:00

嗯,你没有提供太多的数据,但20分钟看起来并不是非常不合理的数量如此之多的电子邮件与smtp协议。使用smtp,您必须与服务器交换5条消息。

  1. helo
  2. 寄自
  3. 寄给
  4. 数据
  5. 退出

假设目标为10 to ping时,只会给11k * 50ms = 550s造成网络延迟开销。大约是10分钟。

然后你需要实际打开和阅读11k文件但是您没有指定发送的数据的大小。也许它能占到剩下的时间。特别是如果您说您发送了csv数据文件。

如果不改变您使用的技术解决方案,就很难加快速度。但是我建议以二进制的方式传输数据,最好是使用压缩。对于csv文件来说,压缩应该是有意义的。

票数 2
EN

Stack Overflow用户

发布于 2013-11-19 12:03:10

由于这是一个网络绑定任务,您可以通过将任务拆分成较小的批并并行执行来加快它的速度。

使用这种方法,您应该可以轻松地减少几分钟。

这里有很多lib来做这件事,我个人会选择gevent,但是如果您想坚持使用标准库,您可以坚持使用多进程/线程处理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20069981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档