使用变量作为数据容器在邮件中发送附件 python

Sending an attachment in mail using a variable as data container python

我想知道是否可以使用 python 将变量(例如字符串)作为邮件附件发送。目的是避免在这个过程中制作临时文件。

例如,我想发送一个格式为 csv 的字符串作为邮件的附件,并且可能稍后可以将该附件作为文件下载到隧道的另一端。

感谢您提供的所有帮助。

编辑:它现在可以与 StringIO 一起使用,感谢您的帮助。下面回答

所以这是我现在使用的工作方法:

#!/usr/bin/python2.7.x
# -*- coding: utf-8 -*-  
#Imports
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEBase import MIMEBase
from email import encoders
from email.Utils import COMMASPACE, formatdate
import sys
try:
    from StringIO import StringIO
except:
    print("Could not import critical library StringIO")
    sys.exit(0)
import smtplib
import datetime

def run_mail(self):

    date = datetime.datetime.now()
    dateAAAAMMDD = str(date.year) + "_" + str( date.month) + "_" +str( date.day)


    pj1 = StringIO(self.pj1_data)
    pj1_name = "my_att_name_" + str(dateAAAAMMDD) + ".csv"

    pj2 = StringIO(self.pj2_data)
    pj2_name = "my_att_name2_" + str(dateAAAAMMDD) + ".txt"

    pj3 = StringIO(self.pj3_data)
    pj3_name = "my_att_name3_" + str(dateAAAAMMDD) + ".txt"

    pj =[(pj1,pj1_name), (pj2,pj2_name), (pj3,pj3_name)]

    fromaddr = 'address@something.com'
    toaddr = 'toanotheraddress@something.com'
    msg = MIMEMultipart()
    subject = 'subject dated ' + dateAAAAMMDD
    msg['From'] = fromaddr
    msg['To'] = toaddr
    msg['Subject'] = subject 

    msg.attach(MIMEText("Auto-generated script", 'plain'))

    for data, att_name in pj :
        part = MIMEBase('application', 'octet-stream')
        part.set_payload(data.read())
        encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment; filename= "%s"' % att_name)
        msg.attach(part)
    server_port = 25
    server = smtplib.SMTP('myserver.com',server_port)
    server.starttls()
    #If login required, not very secure, use either input or localhost without
    #login required
    server.login(fromaddr, 'MyPasswordGoesHere') 

    content = msg.as_string()
    server.sendmail(fromaddr,toaddr,content)


    server.quit()