如何用Python和win32同时打开多个邮件而不发送?
我需要给很多不同的人发送很多邮件,并且每封邮件都有很多附件。我希望在发送之前能先查看这些邮件,并添加可能需要的其他附件。目前这段代码只能打开一个邮件窗口,必须先发送或关闭这个窗口才能打开下一个。我该怎么做才能让所有的邮件窗口同时打开并且可见呢?
def mailer(text, subject, recipient, attachments):
import win32com.client as win32
list(attachments)
outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
mail.To = recipient
mail.Subject = subject
mail.HtmlBody = text
for each in attachments:
mail.Attachments.Add(Source=each)
mail.Display(True)
mailer("", " TEST 1", test_address, "")
mailer("", " TEST 2", test_address, "")
mailer("", " TEST 3", test_address, "")
mailer("", " TEST 4", test_address, "")
2 个回答
0
一般来说,Python中的语句是按顺序执行的。
如果你有一个这样的脚本:
print "a"
print "b"
print "c"
print "d"
那么你期望的输出结果会是:
$ play.py
a
b
c
d
运行时发生的事情是这样的:
mailer("", " TEST 1", test_address, "")
mailer("", " TEST 2", test_address, "")
mailer("", " TEST 3", test_address, "")
mailer("", " TEST 4", test_address, "")
Python会按照你给出的顺序来执行这些语句。所以mailer("", " TEST 2", test_address, "")只有在mailer("", " TEST 1", test_address, "")执行完毕后才会运行,依此类推,直到最后一条语句执行完。
那你该怎么解决这个问题呢?
我首先想到的就是看看Python的多进程包:http://docs.python.org/library/multiprocessing.html
你可以把代码改成类似这样的:
from multiprocessing import Process
def mailer(text, subject, recipient, attachments):
import win32com.client as win32
list(attachments)
outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
mail.To = recipient
mail.Subject = subject
mail.HtmlBody = text
for each in attachments:
mail.Attachments.Add(Source=each)
mail.Display(True)
if __name__ == '__main__':
Process(mailer("", " TEST 1", test_address, ""))
Process(mailer("", " TEST 2", test_address, "")
Process(mailer("", " TEST 3", test_address, "")
Process(mailer("", " TEST 4", test_address, "")
到底是使用这个包,还是其他包(比如这里的线程包:https://docs.python.org/2/library/threading.html),甚至是第三方库,实际上取决于你想同时处理多少条消息,以及每条消息对CPU和内存的需求。
3
调用 mail.display(false)
这个命令,可以让窗口以无模式的方式显示出来。