【问题标题】:sending email via outlook using win32com and adding signature file使用 win32com 通过 Outlook 发送电子邮件并添加签名文件
【发布时间】:2017-06-17 11:09:51
【问题描述】:

我正在使用 Python 3.5 自动化一些工作电子邮件。我们不能使用 smtp。必须通过win32com控制outlook来完成。我已经全部工作了。我可以创建一个 html 电子邮件。我可以给它一个电子邮件地址,如果它是打开的 Outlook 配置文件中的活动电子邮件地址,它将从该地址发送。我可以添加抄送、密送、主题等。

我的问题是添加存储在 Outlook 中的签名。我已经读过 Outlook 签名没有暴露,因此我不能像 SendUsingAccount 或 mail.CC 字段那样简单地调用它们。

我的替代方法是让用户使用 tkinter 和 askopenfilename() 指定文件。

这在大多数情况下都有效。用户指定签名文件位置一次。我将它存储在我的 tkinter 程序在启动时读取的数据文件中。用户生成电子邮件并发送。

问题是我正在从签名文件中读取 HTML 并将其存储在一个变量中,然后将其附加到现有的 HTMLBody。

它有效。但是签名文件 HTML 中包含的任何图片都不会显示。

我尝试编写一个额外的脚本,将 html 文件中图片的简写地址替换为 FULL 目录,希望能够修复它。不行。

有什么方法可以确保签名文件中包含的任何图片都实际显示在电子邮件中???

这是我的签名文件 HTML 阅读器/编辑器

def altersigfile(file):
    fullDir = file
    newDir = fullDir.rsplit("\\",1)[0]
    subDir = fullDir.rsplit("\\", 1)[1]
    subDir = subDir.replace(" ", "%20")
    subDir = subDir.strip(".htm")
    subDir += "_files"
    newDir += "/" + subDir
    newDir = newDir.replace("\\", "/")
    newsigfile = ""

    with open(fullDir,"r") as file:
        for line in file:

            if "src=" in line:
                check = ""
                newline = ""
                check = r'src="' + subDir
                newline = re.sub(subDir, newDir, line)
                newsigfile += newline

            else:
                newsigfile += line



    return newsigfile

这是我的电子邮件脚本:

def emailer(sendFrom, sendTo, subject, cc, bcc, body, sigfile=None,     auto=False, useSig=False):
ol = win32.Dispatch('Outlook.Application')
msg = ol.CreateItem(0)

#DO NOT CHANGE: the below script is the only way you were able to get outlook to register what email you give it. 
b=False
for i in range(1,ol.Session.Accounts.Count+1):

    if ol.Session.Accounts.Item(i).SmtpAddress == sendFrom:
        sendFrom = ol.Session.Accounts.Item(i)
        b=True
        break

if b==False:
    messagebox.showinfo("Invalid Address",
                        """The email address you entered ({email}), is not an authorized outlook email address. Please verify the email address you provided and make sure it is authorized in your outlook.""".format(email = sendFrom))
    return

msg._oleobj_.Invoke(*(64209, 0, 8, 0, sendFrom))
#end of DO NOT CHANGE

msg.To = sendTo
msg.Subject = subject

if cc:
    msg.CC = sendFrom

if bcc:
    msg.BCC = ol.Session.Accounts.Item(1).SmtpAddress

msg.HTMLBody = body


#currently this does add the sigfile html file held by outlook. However... the picture doesnt load. :(

if useSig==True:
    signature = altersigfile(sigfile)
    msg.HTMLBody += signature
    print(msg.HTMLBody)

所以重申一下。除了签名文件中包含的图片不会显示之外,上述所有方法都适用。这是唯一错误的事情,我似乎无法找到使其工作的方法。 任何帮助将不胜感激。谢谢。

附:抱歉第二批代码中的格式。对于我的生活,我似乎无法正确格式化。

【问题讨论】:

    标签: python email outlook


    【解决方案1】:

    以防万一有人好奇。这就是我在空闲时的做法:

    import win32com.client as win32
    import re
    ol = win32.Dispatch('Outlook.Application')
    msg = ol.CreateItem(0)
    msg.GetInspector
    bodystart = re.search("<body.*?>", msg.HTMLBody)
    msg.HTMLBody = re.sub(bodystart.group(), bodystart.group()+"Hello this is a test body", msg.HTMLBody)
    

    这里的关键部分是正则表达式。 基本上是以下行:

    bodystart = re.search("<body.*?>", msg.HTMLBody)
    

    上面的代码行查找“body”的精确字符串,后跟任意数量的任何字符“.*”,但不是以贪婪的方式“?”然后以“>”结尾 一旦我有了它,我只需将匹配的字符串替换为匹配的字符串+我想要的电子邮件正文中的任何内容。 g2g。

    【讨论】:

      【解决方案2】:

      其他几个选项。

      1. Redemption 通过RDOSession.Signatures 集合公开签名,其RDOSignature 对象公开将签名(文本、图像、样式)复制到指定消息的ApplyTo 方法。

        李> 1234563 @ 财产。只要您调用MailItem.DisplayMailItem.GetInspector,只要您尚未使用Body 或HTMLBody 属性设置邮件正文,邮件正文就会添加签名。您现在要做的就是读取HTMLBody 属性(只有签名),将您的文本合并到该值中,然后将HTMLBody 属性设置回来。请注意,您不能简单地连接两个 HTML 字符串,它们必须合并。

      【讨论】:

      • 我不能使用救赎。我读到有商业用途收费。我不能让我的公司就此签字。至于第二个。合并它们到底是什么意思?我理解连接字符串。但是如何合并 HTML 字符串?我有一个会议。如果您不回答,我会在所述会议后尝试谷歌搜索。感谢您到目前为止的帮助。
      • 搜索&lt;body子字符串的位置,然后找到下一个&gt;字符的位置(这样你就可以处理带有属性的body标签),然后在后面插入你的HTML最后一个&gt; - 这样你的文本将在邮件正文的开头结束。
      • 刚刚结束我的会议。我明白你的意思。我完全可以做到。感谢您的帮助。我会试试这个,希望今晚晚些时候让你知道。
      猜你喜欢
      • 2015-11-19
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 2015-11-13
      • 2014-08-30
      • 2011-09-14
      • 2012-03-03
      相关资源
      最近更新 更多