如何清除MIMEBase中的所有数据(邮件模块)

5 投票
1 回答
2291 浏览
提问于 2025-04-17 03:31

我有一段代码:

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
import os

def sendMail(to, subject, text, files=[],server="smtp.gmail.com:587"):
    assert type(to)==list
    assert type(files)==list
    fro = "psaoflamand@live.com>"

    msg = MIMEMultipart()
    msg['From'] = fro
    msg['To'] = COMMASPACE.join(to)
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = subject

    msg.attach( MIMEText(text) )
    a=0
    username = 'psaoflamand@gmail.com'  
    password = 'pass'  

    # The actual mail send  


    smtp = smtplib.SMTP(server)
    smtp.starttls()  
    smtp.login(username,password)

    for file in files:
        a+=1
        print a
        part = MIMEBase('application', "octet-stream")
        part.set_payload( open(file,"rb").read() )
        Encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment; filename="%s"'
                       % os.path.basename(file))
        msg.attach(part)
        if a==21:
            smtp.sendmail(fro, to, msg.as_string() )
            a=0
            print 'sent'


    smtp.quit()


sendMail(
        ["psaoflamand@live.com"],
        "hello","cheers",
        ["Thousands of one megabyte files"]

这段代码一次发送21个文件,以避免超过Gmail的消息限制。但是问题是,MIMEBase中的数据还留着……我想问有没有办法删除MIMEBase中的所有数据?抱歉,缩进有点错。

1 个回答

3

看起来你的问题是这样的:

  1. 你创建了一个 msg
  2. 然后把21个文件添加到这个 msg 里。
  3. 接着发送这个消息。
  4. 之后又添加了21个文件,这样现在总共有42个文件了。
  5. 再发送一次;这个第二个消息的大小是第一个的两倍。
  6. 然后又添加了21个文件,总数变成63个。
  7. 再次发送;现在这个消息变得相当大了。
  8. 然后继续这样做。

a==21 的时候,你应该重新开始,创建一个新的 msg 对象,而不是继续往旧的里面添加更多文件。

另外,你也可以尝试在添加新文件之前,先把已经存在的21个附件删除;不过重新开始可能更简单,因为你已经有了创建新消息的代码,只需要把它整理成一个“开始新消息”的函数就可以了。

撰写回答