【问题标题】:How to speed up sending file using smtp如何使用 smtp 加快发送文件的速度
【发布时间】:2019-02-15 21:11:17
【问题描述】:

我正在设置一个程序,它会截取屏幕截图并将其发送到我的电子邮件,我想加快这个过程,因为它将在一秒钟内拍摄多个屏幕截图并将其发送到我的电子邮件但由于验证过程很长,它会破坏我的程序本身并导致滞后。

我尝试将登录过程和发送过程分开,将其置于功能之外,但它没有发送电子邮件。我想知道我应该如何构建它。

def 发送电子邮件(文件名): # 创建 SMTP 会话 发送 = smtplib.SMTP('smtp.gmail.com', 587)

# start TLS for security
sendss.starttls()
email = '___@gmail.com'
password = 'password'


email = 'name@gmail.com'
password = 'pass'
send_to_email = 'pass@gmail.com'
subject = 'Person on Cam 1'
message = 'Person sighted'
msg = MIMEMultipart()
msg['From'] = email
msg['To'] = send_to_email
msg['Subject'] = subject
msg.attach(MIMEText(message, 'plain'))

attachment = open(filename, 'rb') 

part = MIMEBase('application', 'octet_stream')

part.set_payload((attachment).read())


encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= "+filename) 

msg.attach(part) 
text = msg.as_string()
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(email, password)
text = msg.as_string()
server.sendmail(email, send_to_email, text)
server.quit()

它发送电子邮件但速度很慢。我想减少发送一封电子邮件所浪费的时间。

【问题讨论】:

  • 延迟几乎肯定是由于您可用的上行带宽,而不是代码本身。最好的办法是在截屏后创建一个新进程来发送邮件,但是你只会在后台堆积一堆进程,因为你根本无法比你更快地发送图片生成它们。
  • @chepner 但它也必须一遍又一遍地连接到 smtp。一旦我解决了这个问题,我就会减少它被调用的时间。

标签: python performance smtp


【解决方案1】:

使用一个 SMTP 会话发送多封电子邮件

您可以保持打开的 smtp 会话(重复使用 server 对象)并使用它来发送多封电子邮件。

SMTP 服务器在发送“不是第一封”电子邮件之前使用RSET(重置)命令来检查是否可以重用 SMTP 会话。

https://docs.python.org/2/library/smtplib.html

还支持与标准 SMTP/ESMTP 命令 HELP、RSET、NOOP、MAIL、RCPT 和 DATA 对应的低级方法。通常这些不需要直接调用,所以这里没有记录。详情请查阅模块代码。

【讨论】:

    【解决方案2】:

    根据您的提供商,SMTP 连接会在几秒钟后超时。 可以使用 noop 命令测试连接状态并捕获错误(在超时错误的情况下),然后在 Exception 中调用 reconnect 函数。

    一个简单的代码来测试连接超时前多久:

    import smtplib
    import time
    
    def login():
       global server
    
       username = 'user@domain.org'
       password = 'password'
    
    
       server = smtplib.SMTP_SSL("mail.domain.org", 465)
       logged = server.login(username, password)
    
       print('logded in:', logged, '\n')
       return logged
    
    for i in range(30):
      def test_conn_open():
         try:
            stat = server.noop()[0]
            #Do anything for example send mail
            #server.sendmail(username, dest_mail, fullmessage)
         except:  
            stat = -1
            login() # login again if timeout happens
            test_conn_open()  #Ensures mail is sent on the current loop even if timeout happens
       
        print(stat, " ", i + 1)
        return True if stat == 250 else False
    
      r = test_conn_open()
      print(r)
      time.sleep(1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 2011-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多