如何在Python中将msg的附件附加到Mime以发送电子邮件?



我想打开一个.msg文件,获取附件,并将它们发送到特定的邮件地址。我使用extract_msg,我似乎不能只将.msg中的附件附加到我的邮件中。

目前为止我有什么:

mail = f"{path}/{attachment}"
msg = extract_msg.Message(mail)
msg_sender = str(msg.sender)
msg_subj = str(msg.subject)
msg_message = str(msg.body)
email_sender = 'automailsender123@gmail.com'
password = 'XXX'
send_to_email = send_to
print("----------------------------------------------------------------------------------------------------")
print(f"Send to: {send_to}nAttachement: {attachment}n")
msgMime = MIMEMultipart()
msgMime['From'] = msg_sender
msgMime['To'] = send_to_email
msgMime['Subject'] = msg_subj
body = MIMEText(msg_message)
msgMime.attach(body)
resources_dir = "resources"
attachments_dir = os.path.join(resources_dir, "attachments")
part = MIMEBase('application', 'octet-stream')
if msg.attachments:
with tempfile.TemporaryDirectory() as tmp_dir_name:
for att in msg.attachments:
att_save_path = os.path.join(tmp_dir_name, att.longFilename)
att.save(customPath=tmp_dir_name)
attachment_stream = open(att_save_path, 'rb')
part.set_payload(attachment_stream.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % att_save_path)
msgMime.attach(part)
else: print("No attachments")
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
try:
server.login(email_sender, password)
except:
print(f"Login failed for user: {email_sender}nWith password: {password}")
text = msgMime.as_string()
server.sendmail(email_sender, send_to_email, text)
server.quit()

I get error:

File "C:UsersKenneth.VanGysegemAppDataLocalProgramsPythonPython39libshutil.py", line 596, in _rmtree_unsafe
with os.scandir(path) as scandir_it:
NotADirectoryError: [WinError 267] The directory name is invalid: 'C:\Users\XXX.XXX\AppData\Local\Temp\tmpguckqnkr\image001.jpg'

我写信给temp的唯一原因是似乎不可能将原始.msg的附件附加到Mime。

欢迎任何帮助,提供错误或更好的处理附件的方法。

编辑:加:

Traceback (most recent call last):
File "C:UsersKenneth.VanGysegemAppDataLocalProgramsPythonPython39libshutil.py", line 616, in _rmtree_unsafe
os.unlink(fullname)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\Users\KENNET~1.VAN\AppData\Local\Temp\tmpguckqnkr\image001.jpg'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:UsersKenneth.VanGysegemAppDataLocalProgramsPythonPython39libtempfile.py", line 801, in onerror
_os.unlink(path)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\Users\KENNET~1.VAN\AppData\Local\Temp\tmpguckqnkr\image001.jpg'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:UsersKenneth.VanGysegemAppDataLocalProgramsPythonPython39libtempfile.py", line 804, in onerror
cls._rmtree(path)
File "C:UsersKenneth.VanGysegemAppDataLocalProgramsPythonPython39libtempfile.py", line 812, in _rmtree
_shutil.rmtree(name, onerror=onerror)
File "C:UsersKenneth.VanGysegemAppDataLocalProgramsPythonPython39libshutil.py", line 740, in rmtree
return _rmtree_unsafe(path, onerror)
File "C:UsersKenneth.VanGysegemAppDataLocalProgramsPythonPython39libshutil.py", line 599, in _rmtree_unsafe
onerror(os.scandir, path, sys.exc_info())
File "C:UsersKenneth.VanGysegemAppDataLocalProgramsPythonPython39libshutil.py", line 596, in _rmtree_unsafe
with os.scandir(path) as scandir_it:
NotADirectoryError: [WinError 267] The directory name is invalid: 'C:\Users\KENNET~1.VAN\AppData\Local\Temp\tmpguckqnkr\image001.jpg'

不清楚Message()部分来自哪里或它究竟是做什么的。我将假设它像你希望的那样工作,并推测你可能是Outlook的受害者,幸运地找到了一个可以接受地操纵其专有信息的库。

你的代码有两个有问题的流程:即使没有提取附件,它也会发送电子邮件,即使连接到SMTP服务器失败,它也会尝试发送。你想把它们重构成

else:
print("No attachments")
sys.exit(0)

在没有提取任何内容时退出,

try:
server.login(email_sender, password)
except:
print(f"Login failed for user: {email_sender}nWith password: {password}")
sys.exit(1)

退出,当你不能继续(或只是拿出try/except,让脚本崩溃与追溯;如果仅供您个人使用,这可能是可以接受的,并且当您看到调试信息时更容易调试)。

(不是一个恰当的答案,但我觉得我也有必要指出这些问题。)

好了,伙计们,我是这样做的:

def send_mails_from_msg(attachment, send_to, path):
mail = f"{path}/{attachment}"
msg = extract_msg.Message(mail)
msg_sender = str(msg.sender)
msg_subj = str(msg.subject)
msg_message = str(msg.body)
email_sender = 'mailsender123@gmail.com'
password = 'XXXXXX'
print("----------------------------------------------------------------------------------------------------")
print(f"Send to: {send_to}nAttachement: {attachment}n")
msgMime = MIMEMultipart()
msgMime['From'] = msg_sender
msgMime['To'] = send_to
msgMime['Subject'] = msg_subj
body = MIMEText(msg_message)
msgMime.attach(body)
resources_dir = "resources"
attachments_dir = os.path.join(resources_dir, "attachments")
part = MIMEBase('application', 'octet-stream')
if msg.attachments:
for x in msg.attachments:
x.save(customPath=attachments_dir)
for files in os.listdir(attachments_dir):
print(f"Files: {files}")
attachment = open(f"{attachments_dir}/{files}", 'rb')
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; 

文件名= % s"%附件)msgMime.attach(部分)

else: print("No attachments")
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
try:
server.login(email_sender, password)
except:
print(f"Login failed for user: {email_sender}nWith password: {password}")
text = msgMime.as_string()
server.sendmail(email_sender, send_to, text)
server.quit()

现在这发送jpg与邮件,任务完成!但是…附件看起来像这样:__io。BufferedReader名称='resources_attachments_image001.jpg'_,它注册为附件,但不能打开…我正在努力解决这个问题

最新更新