如何用Python和win32同时打开多个邮件而不发送?

0 投票
2 回答
1317 浏览
提问于 2025-04-18 08:26

我需要给很多不同的人发送很多邮件,并且每封邮件都有很多附件。我希望在发送之前能先查看这些邮件,并添加可能需要的其他附件。目前这段代码只能打开一个邮件窗口,必须先发送或关闭这个窗口才能打开下一个。我该怎么做才能让所有的邮件窗口同时打开并且可见呢?

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) 这个命令,可以让窗口以无模式的方式显示出来。

撰写回答