Exchangelib Python gửi email

Vì vậy, trước khi chúng ta bắt đầu, chính xác Dịch vụ Web Exchange [EWS] là gì? . Nó cho phép các nhà phát triển trích xuất dữ liệu như hộp thư, lịch, tác vụ, v.v., từ đó cho phép họ sử dụng dữ liệu này trong các ứng dụng của riêng họ. API này tỏ ra rất hữu ích và mạnh mẽ vì nó cho phép Outlook dễ dàng tích hợp vào mọi thứ

Sự khác biệt giữa PowerShell so với Python là gì?

Exchange Web Services chủ yếu được xây dựng để PowerShell sử dụng nhưng nhiều nhà phát triển yêu thích tính linh hoạt và nhiều tác vụ có thể được thực hiện bằng Python nên họ tìm cách sử dụng Python để truy cập EWS thay thế

Giống như tôi đã nói Python là một ngôn ngữ rất mạnh vì nó là ngôn ngữ có mục đích chung có thể được sử dụng cho nhiều mục đích, từ phát triển web đến học máy. Trong khi đó, PowerShell là ngôn ngữ kịch bản chủ yếu được sử dụng để tự động hóa tác vụ

Mặc dù có sự khác biệt khi chúng ta nhìn vào hai ngôn ngữ, nhưng chúng cho thấy rất nhiều điểm tương đồng vì cả hai đều hướng đối tượng. Vì vậy, biết cái này hay cái kia sẽ cho phép bạn dễ dàng chuyển sang sử dụng cái kia

Vì vậy, trước tiên hãy so sánh hai ngôn ngữ

Cài đặt các mô-đun và thư viện

#Python3:

pip install 
#PowerShell:

Install-Module -Name 

Nhập mô-đun và thư viện

#Python3:

 import 
#PowerShell

Import-Module 

Yếu tố làm cho Python3 trở nên mạnh mẽ là khả năng truy cập vào các thư viện và mô-đun mở rộng có thể làm bất cứ điều gì. Vì vậy, ở đây chúng ta có thể thấy cách cả Python và PowerShell có thể dễ dàng cài đặt và nhập các mô-đun/thư viện


Tiện ích mở rộng.
Trăn. . py / PowerShell. . ps1 / Mô-đun PowerShell. . psm1
Đây là các phần mở rộng tương ứng cho các tệp Python và PowerShell.

mã cơ bản

hello_variable = 'Hello Word'
print[hello_variable]

if 'H' in hello_variable:
    print['H Found']

for i in hello_variable:
    print[i]
$hello_variable = 'Hello Word'
Write-Output $hello_variable

if[$hello_variable -like "H*"]{
  Write-Output 'H Found'
}

for [$i -in $hello_variable]{
  Write-Output $hello_variable
}

Vì vậy, ở đây chúng ta có thể thấy hai đoạn mã ngắn thể hiện sự giống nhau giữa Python và PowerShell


Biến. Vì vậy, trên dòng đầu tiên của mỗi đoạn mã, chúng ta có thể thấy cách cả hai ngôn ngữ khai báo các biến của chúng. Nó gần như giống hệt ngoại trừ thực tế là PowerShell sử dụng '$' trước tên biến của chúng


In/xuất. Trên dòng thứ hai của mỗi đoạn mã, chúng ta thấy cách in/xuất của cả hai ngôn ngữ. Một lần nữa, rất giống nhau về định dạng ngoại trừ cú pháp khác nhau

câu lệnh if. Vì vậy, câu lệnh if được hiển thị trong cả hai đoạn mã sẽ kiểm tra xem có H trong biến hay không và nếu có thì in ra thông báo. Ở đây chúng ta có thể thấy rằng hai ngôn ngữ bắt đầu có một chút khác biệt vì cú pháp của Python có biến để kiểm tra ở bên phải trong khi PowerShell có nó ở bên trái

cho vòng lặp. Bây giờ quay trở lại với vòng lặp for này, cú pháp gần như giống hệt nhau một lần nữa nhưng các vòng lặp này thực hiện những việc khác nhau với vòng lặp Python in ra từng chữ cái trong biến và vòng lặp PowerShell for in ra biến theo một số lần nhất định

Bằng cách so sánh hai đoạn mã này, chúng ta có thể thấy PowerShell và Python giống nhau như thế nào về những gì chúng có thể làm nhưng lại khác nhau về cú pháp. Do đó, chúng tôi sẽ dễ dàng kết nối với EWS bằng Python mặc dù PowerShell là tiêu chuẩn

Kết nối với Exchange Web Services bằng PowerShell

Trước tiên, chúng tôi sẽ cần cài đặt PowerShell và API được quản lý EWS. Chúng ta có thể sử dụng brew để cài đặt PowerShell

#Use brew to install powershell:

brew cask install powershell

#Use this command to check if PowerShell was downloaded successfully:

pwsh

Sau đó, bạn có thể cài đặt API được quản lý EWS từ trang web của Microsoft

function Connect-EWS {
    param[
        [parameter[Mandatory = $True]]
        [PSCredential]
        $Credential,
        [parameter[Mandatory = $True]]
        [string]
        $Domain,
        [parameter[Mandatory = $True]]
        [string]
        $AutoDiscoverUrl
        
    ]

    # First import the DLL, else none of the EWS classes will be available

    Try{
        Import-Module -Name "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
    }
    Catch{
        Write-Error "Error importing C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
        Write-Error $_.Exception
        Break
    }
    
    # Set the domain in networkcredential - don't know if this is the way to do it but it works.
    $Credential.GetNetworkCredential[].Domain = $Domain

    # Create ExchangeCredential object from regular [PSCredential]
    $ExchangeCredential = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials[$Credential.Username, $Credential.GetNetworkCredential[].Password, $Credential.GetNetworkCredential[].Domain]
    
    # Create the ExchangeService object
    $ExchangeService = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService 
    $ExchangeService.UseDefaultCredentials = $true 
    
    # Add the ExchangeCredential to the ExchangeService
    $ExchangeService.Credentials = $ExchangeCredential
    
    # {$true} is needed if it's office 365 with a redirect on the autodiscovery. I think there's a lot more secure ways to check if
    # a redirection is correct.
    $ExchangeService.AutodiscoverUrl[$AutoDiscoverUrl, {$true}]
    
    # Return the object
    return $ExchangeService
}
Nguồn. https. // tự động hóa. com/Using-the-EWS-API-with-Powershell/

Đây là một chức năng cơ bản có thể được sử dụng để kết nối với EWS bằng PowerShell. Như bạn có thể thấy ở đây, cần có các tham số tên miền và thông tin xác thực để tạo kết nối với EWS. Nó trả về một đối tượng $ExchangeService sẽ được sử dụng để liên kết các dịch vụ khác nhau như lịch, hộp thư đến, v.v. Sau đó, từ đó, chúng tôi có thể gọi các điểm cuối của các dịch vụ đó để truy xuất dữ liệu, chẳng hạn như nhận tất cả thư của bạn trong hộp thư đến

Bây giờ hãy xem cách chúng tôi làm điều đó trong Python

Làm cách nào để kết nối với Dịch vụ Web Exchange bằng Python3?

Một lần nữa, vì EWS được xây dựng để sử dụng với PowerShell để chúng tôi kết nối với nó bằng Python, chúng tôi sẽ cần sự trợ giúp của thư viện có tên Exchangelib

Vì vậy, trước tiên chúng ta cần cài đặt thư viện với pip

________số 8

Vì vậy, tôi chỉ sử dụng bản cài đặt thông thường nhưng bạn có thể sử dụng các bản cài đặt khác nếu bạn muốn hỗ trợ kerberos hoặc sspi, đây là giao thức xác thực mạng và api
win32 được sử dụng cho các hoạt động liên quan đến bảo mật .

Vì vậy, đây là cách lần đầu tiên tôi thử kết nối với EWS

from exchangelib import DELEGATE, Credentials, Account 

credentials = Credentials[
    username = 'MYWINDOMAIN\\myusername', #or myusername@email.com
    password = 'password'
]

test_account = Account[
    primary_smtp_address = 'myusername@email.com',
    credentials = credentials,
    autodiscover = True,
    access_type = DELEGATE
]

# Print first 100 inbox messages in reverse order
for item in test_account.inbox.all[].order_by['-datetime_received'][:100]:
    print[item.subject, item.body, item.attachments]

Vì vậy, trước tiên chúng tôi đã nhập DELEGATE, Account, Credentials từ thư viện Exchangelib

DELEGATE là loại quyền truy cập được sử dụng khi chủ tài khoản chính được ủy quyền thực hiện các hành động trên tài khoản

Credentials là một chức năng được sử dụng để xác định thông tin đăng nhập của tài khoản. Như bạn có thể thấy từ đoạn mã mà thông tin đăng nhập lấy tên người dùng và mật khẩu. Người dùng có thể được cung cấp ở hai định dạng. Một là MYWINDOMAIN\myusername với MYWINDOMAIN là tên miền cửa sổ của bạn và myusername là tên người dùng của tài khoản Outlook 365 của bạn. Sau đó, có một số máy chủ sẽ chỉ cho phép tên người dùng là địa chỉ smtp chính, đây là email chính mà bạn đang lấy dữ liệu hoặc thực hiện các hành động từ đó

Vì vậy, tôi đã sử dụng tên người dùng được xác định làm địa chỉ smtp chính và sau đó là mật khẩu làm mật khẩu của tài khoản Outlook 365 của mình

Tài khoản là một lớp được sử dụng để khởi tạo tài khoản mà chúng ta sẽ lấy dữ liệu từ đó. Ở đây chúng tôi vượt qua trong 4 đối số. Một là địa chỉ smtp chính. Thứ hai là thông tin đăng nhập mà chúng tôi đã xác định trước đó. Thứ ba là tự động phát hiện khai báo boolean có nghĩa là chúng tôi muốn Exchangelib tự động khớp chúng tôi với đúng máy chủ Exchange. Đối số cuối cùng là loại truy cập mà chúng ta chuyển vào DELEGATE mà chúng ta đã thảo luận ở trên

Về cơ bản, đây là tất cả những gì chúng tôi cần làm để kết nối với EWS. Để kiểm tra kết nối, chúng tôi có một đoạn mã ngắn sẽ in ra 100 thư hộp thư đến đầu tiên theo thứ tự ngược lại

Mặc dù chạy mã này gây ra lỗi cho tôi

#PowerShell:

Install-Module -Name 
0

Tôi thấy rằng điều này xảy ra do giao thức tự động phát hiện thực sự rất mong manh và một số máy chủ sẽ không hỗ trợ máy chủ Exchangelib này, vì vậy, một cách để giải quyết vấn đề này là kết nối trực tiếp với máy chủ bằng cách tạo một cấu hình mới

#PowerShell:

Install-Module -Name 
1

Vì vậy, chúng tôi có thể chỉ định tên máy chủ theo cách thủ công bằng cách sử dụng chức năng Cấu hình. Đầu tiên chúng ta cần nhập nó và sau đó chúng ta sẽ truyền 2 đối số cho hàm. Cái đầu tiên là tên máy chủ và cái thứ hai là thông tin đăng nhập mà chúng tôi đã xác định trước đó

Vì vậy, để tìm tên máy chủ, trước tiên chúng tôi đăng nhập vào triển vọng 365> biểu tượng bánh răng ở trên cùng bên phải> xem tất cả cài đặt triển vọng> chọn thư ở phía bên trái> nhấp vào đồng bộ hóa email> sao chép tên máy chủ trong cài đặt pop hoặc imap

Chọn biểu tượng bánh răng ở trên cùng bên phải của triển vọng.
Chọn xem tất cả cài đặt triển vọng.
Chọn thư > đồng bộ hóa email > Cài đặt POP/IMAP > Tên máy chủ.

Với cấu hình này, cuối cùng chúng tôi cũng có thể kết nối với EWS mà không gặp bất kỳ lỗi nào

Trong bài viết này, chúng ta có thể xem cách chúng ta có thể sử dụng Python với Exchangelib để kết nối với Dịch vụ Web Exchange. Chúng ta cũng đã biết PowerShell và Python giống nhau như thế nào, do đó chúng ta hiểu thêm về cách Python có thể kết nối với EWS mặc dù thông thường chúng ta phải sử dụng PowerShell

Trong bài viết tiếp theo, chúng ta sẽ khám phá thêm những gì chúng ta có thể làm với Python và Exchangelib với EWS

Wilson Song, Thực tập sinh kỹ sư phần mềm tại HacWare. HacWare đo lường các hành vi rủi ro và tự động hóa nhận thức bảo mật để chống lại các cuộc tấn công xâm phạm email doanh nghiệp. HacWare được hỗ trợ bởi TechStars NYC và CyberNYC

Chủ Đề