如何允许使用python对Outlook进行编程访问?

2024-10-02 02:41:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

enter image description here

我想要的是允许access通过在单独的线程中操作窗口弹出窗口(窗口挂起主线程)来执行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)

Tags: selfifinitdefwindowbmallowoutlook
1条回答
网友
1楼 · 发布于 2024-10-02 02:41:37

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

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

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

Security Behavior of the Outlook Object Model文章中阅读更多关于这方面的内容

您也可以考虑使用Outlook构建的低级代码,而不提供安全性问题——扩展MAPI。考虑在该API周围使用任何第三方包装,如Redemption。如果这不是一个选项,那么看看Outlook Security Manager组件,它允许在运行时动态抑制Outlook安全问题

相关问题 更多 >

    热门问题