【问题标题】:How to allow programmatic access to Outlook with python?如何允许使用 python 以编程方式访问 Outlook?
【发布时间】:2021-07-09 22:52:29
【问题描述】:

我正在寻找覆盖 Outlook 警告的解决方案:

我想要的是通过在单独的线程中对窗口弹出窗口进行操作(窗口暂停主线程)来允许访问 api 10 分钟。 请注意,与赎回库、更新信任中心设置或注册表相关的解决方法不适用于我的工作环境。

此时的代码检测到窗口,从下拉菜单中选择“10 分钟”选项,但未能将焦点设置为“允许”按钮并最终单击它。

class OutlookAccess_Watcher(QRunnable):


   def __init__(self):
       super().__init__()

   def run(self):

       while True:
        
            if win32gui.FindWindowEx(win32gui.FindWindow(None, "Microsoft Outlook"), 0, "Static", "DAL=on"):
                window = win32gui.FindWindow(None, "Microsoft Outlook")
                combo_btn = win32gui.FindWindowEx(window, 0, "Button", "&Allow access for")

                if win32gui.SendMessage(combo_btn, BM_GETCHECK, 0, 0):
                     combo_box = get_combobox_id(objects_window_finder(window))
                     win32gui.SendMessage(combo_box, win32con.CB_SETCURSEL, 3, 0)
                     allow_btn = win32gui.FindWindowEx(window, 0, "Button", "Allow")
                     win32gui.SendMessage(allow_btn, BM_CLICK, 0, 0)
                     break
                else:
                    win32gui.SendMessage(combo_btn, BM_CLICK, 0, 0)
            else:
               time.sleep(1)

def run():
    base = olBase() # class carrying the outlook app object obtained by win32com.client.gencache.EnsureDispatch("Outlook.Application")
    mail = base.get_items()[0] # -> list of original mails objects (COM)
    
    threadpool = QThreadPool()
    threadpool.start(OutlookAccess_Watcher())

    try:
        body = mail.Body # warning appears and stops main thread here

    except:
        pass

    print(body)



 if __name__ == '__main__':
    run()

感谢大家的支持。我设法通过在按钮上执行单击(鼠标事件)来实现我的目标。更新下面的代码,以防将来有人遇到这个问题。

class OutlookAccess_Watcher(QRunnable):

    def __init__(self):
        super().__init__()


    def run(self):

        while True:

            if win32gui.FindWindowEx(win32gui.FindWindow(None, "Microsoft Outlook"), 0, "Static", "DAL=on"):
                window = win32gui.FindWindow(None, "Microsoft Outlook")
                combo_btn = win32gui.FindWindowEx(window, 0, "Button", "&Allow access for")

                if win32gui.SendMessage(combo_btn, BM_GETCHECK, 0, 0):
                
                    combo_box = get_combobox_id(objects_window_finder(window))
                    win32gui.SendMessage(combo_box, win32con.CB_SETCURSEL, 3, 0)
                    allow_btn = win32gui.FindWindowEx(window, 0, "Button", "Allow")

                    windll.user32.BlockInput(True) # blocking user
                    mouse_X, mouse_Y = win32gui.GetCursorPos() # getting cursor original postion

                    allow_X, allow_Y,_,_ = win32gui.GetWindowRect(allow_btn) # getting posotion of Allow button

                    win32api.SetCursorPos((allow_X,allow_Y)) # moving cursor to Allow button location

                    # performing click
                    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,
                    allow_X,allow_Y,0,0)
                
                    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,
                    allow_X,allow_Y,0,0)


                    win32api.SetCursorPos((mouse_X, mouse_Y)) # restoring original position
                    windll.user32.BlockInput(False) # unblocking user
                    break

                else:
                    win32gui.SendMessage(combo_btn, BM_CLICK, 0, 0)
            else:
                time.sleep(1)

【问题讨论】:

  • 你可能只想使用 pyautogui。
  • 正如其他人提到的,您可以使用 pyautogui 并将鼠标位置设置为按钮所在的位置,然后使其按下鼠标按钮
  • 感谢您的快速回复。不幸的是,我将无法使用 pyautogui。我有一个固定的软件包列表,可以分发给我办公室的用户。对于使用 win32gui 的任何建议,我将不胜感激。

标签: python outlook threadpool win32com win32gui


【解决方案1】:

您似乎遇到了 Outlook 安全问题。如果您尝试访问任何受保护的属性或方法,它也可能是 Outlook 发出的提示。您会收到安全提示/异常,因为 Outlook 是通过以下方式之一在客户端计算机上配置的:

  • 使用默认的 Outlook 安全设置(即未设置组策略)
  • 使用组策略定义的安全设置,但未应用编程访问策略
  • 使用组策略定义的安全设置,当防病毒软件处于非活动状态或过期时发出警告

如果系统上安装了任何最新的防病毒软件,您可以创建一个组策略来防止显示安全提示,或者只是关闭这些警告(不建议这样做)。

Security Behavior of the Outlook Object Model 文章中了解更多信息。

您还可以考虑使用构建 Outlook 且不会产生安全问题的低级代码 - 扩展 MAPI。考虑在该 API 周围使用任何第三方包装器,例如 Redemption。如果这不是一个选项,请查看Outlook Security Manager 组件,它允许在运行时即时抑制 Outlook 安全问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多