我正在使用以下函数在我的python脚本中发送带有两个附件的电子邮件:
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
...
def sendMail(sender_name, to, subject, text, files=None,server="localhost"):
assert type(to)==list
if files:
assert type(files)==list
print "Files: ",files
fro = sender_name
msg = MIMEMultipart()
msg['From'] = fro
msg['To'] = COMMASPACE.join(to)
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
msg.attach( MIMEText(text) )
if files:
for file in files:
# ************** File attaching - Start **************
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)
# ************** File attaching - End **************
server.set_debuglevel(1)
server.ehlo()
server.starttls()
server.ehlo()
server.sendmail(fro, to, msg.as_string())
server.quit()
我收到了邮件,附件就在那里,但由于某种原因,它们被截断了一些。我的猜测是我在编码过程中遗漏了一些东西。
例如:
附件1:原始文件字节数为1433902,而新字节数为1433600
附件2:原始文件字节数为2384703,而新字节数为2383872
有什么想法吗?
答案 0 :(得分:2)
发现问题。结果我尝试在写入过程的缓冲区完全刷新之前发送文件。
因此,这是一个同步问题,而不是编码问题。
对此感到抱歉,感谢帮帮!
答案 1 :(得分:1)
它可能与您当前的base64.MAXBINSIZE
有关吗? Encoders.encode_base64
在内部使用base64.encodestring
。 base64.MAXBINSIZE
的默认值为57,可以尝试将其设置得更大:base64.MAXBINSIZE = 65536
答案 2 :(得分:0)
如果文件已经写好 - 请确保.close()文件并重新打开()/。读取()它以获取有效负载。
我的问题源于时机,这解决了我的问题。