2008-11-13 38 views
16

Tôi cần kết nối với hộp thư Exchange trong tập lệnh Python, mà không cần sử dụng bất kỳ thiết lập cấu hình nào trên máy cục bộ (kể cả sử dụng Outlook). Nếu tôi sử dụng win32com để tạo MAPI.Session tôi có thể đăng nhập (bằng phương thức Logon()) với cấu hình hiện có, nhưng tôi muốn chỉ cung cấp mật khẩu tên người dùng &.Kết nối với hộp thư Exchange bằng Python

Điều này có khả thi không? Nếu có, ai đó có thể cung cấp mã ví dụ? Tôi thích nếu nó chỉ sử dụng thư viện chuẩn và gói pywin32. Thật không may, cho phép truy cập IMAP cho máy chủ Exchange (và sau đó sử dụng imaplib) là không thể.

Trong trường hợp cần thiết: tất cả tập lệnh sẽ thực hiện đang kết nối với hộp thư và chạy qua các thư trong Hộp thư đến, truy xuất nội dung. Tôi có thể xử lý viết mã cho điều đó, nếu tôi có thể nhận được kết nối ngay từ đầu!

Để làm rõ về Outlook: Outlook sẽ được cài đặt trên máy cục bộ nhưng không có bất kỳ thiết lập tài khoản nào (nghĩa là tất cả thư viện thích hợp sẽ có sẵn nhưng tôi cần hoạt động độc lập với bất kỳ thiết lập nào bên trong Outlook).

Trả lời

1

Tôi chắc rằng điều này sẽ không thể thực hiện được nếu không sử dụng Outlook và hồ sơ MAPI. Nếu bạn có thể nói chuyện với quản trị viên thư của mình một cách ngọt ngào khi bật IMAP trên máy chủ Exchange, nó sẽ giúp cuộc sống của bạn dễ dàng hơn nhiều.

+0

Bật IMAP không phải là một tùy chọn (toàn bộ nội dung sẽ không quan trọng nếu có, nhưng đáng buồn là không). –

+0

Vâng đó là những gì tôi figured nhưng nó đã được giá trị một shot. –

+0

Có lẽ tôi đã đặt câu hỏi đó vào câu hỏi ngay từ đầu (đã chỉnh sửa ngay bây giờ). Cảm ơn :) –

1

Bạn sẽ phải tìm cách chạy quy trình với tư cách người dùng cụ thể đó.

See this.

Tôi nghĩ pywin32.CreateProcessAsUser là sự bắt đầu của con đường bạn cần phải đi xuống. Một chỉnh sửa cuối cùng. Người dùng đăng nhập xử lý thu được từ việc sử dụng các phương pháp win32security.LogonUser

59

Tôi biết đây là một chủ đề cũ, nhưng ...

Nếu bạn đang sử dụng Exchange 2007 hoặc mới hơn, hoặc Office365, hãy nhìn vào giao dịch Dịch vụ web. Đó là một giao diện dựa trên SOAP khá toàn diện cho Exchange và bạn có thể thực hiện khá nhiều thứ mà Outlook có thể thực hiện, bao gồm quyền truy cập ủy quyền hoặc mạo danh đối với các tài khoản người dùng khác.

http://msdn.microsoft.com/en-us/library/bb204119.aspx

UPDATE: Tôi đã phát hành một Python EWS client trên PyPI hỗ trợ tự động phát hiện, lịch, hộp thư, nhiệm vụ và địa chỉ liên lạc:

from exchangelib import DELEGATE, Account, Credentials 

credentials = Credentials(
    username='MYWINDOMAIN\\myusername', # Or [email protected] for O365 
    password='topsecret' 
) 
account = Account(
    primary_smtp_address='[email protected]', 
    credentials=credentials, 
    autodiscover=True, 
    access_type=DELEGATE 
) 
# Print first 100 inbox messages in reverse order 
for item in account.inbox.all().order_by('-datetime_received')[:100]: 
    print(item.subject, item.body, item.attachments) 
+0

+1 vì đây phải là câu trả lời được chấp nhận. –

+0

Có thư viện trình bao python thực hiện điều đó không? –

+0

Ứng dụng khách EWS này có sẵn bằng Python 2.7 không? – Ryan

21

Ive đã nhận nó, để kết nối với trao đổi ngoài bạn cần phải kết nối như thế này:

import smtplib 

url = YOUR_EXCHANGE_SERVER 
conn = smtplib.SMTP(url,587) 
conn.starttls() 
user,password = (EXCHANGE_USER,EXCHANGE_PASSWORD) 
conn.login(user,password) 

bây giờ bạn có thể gửi như một kết nối bình thường

message = 'From: FROMADDR\nTo: TOADDRLIST\nSubject: Your subject\n\n{}' 
from, to = fromaddr,toaddrs 
txt = 'This is my message' 
conn.sendmail(fromaddr,toaddrs,msg.format(txt)) 

để lấy mail từ hộp thư đến của bạn một chút khác nhau của nó

import imaplib 

url = YOUR_EXCHANGE_URL 
conn = imaplib.IMAP4_SSL(url,993) 
user,password = (EXCHANGE_USER,EXCHANGE_PASSWORD) 
conn.login(user,password) 
conn.select('INBOX') 
results,data = conn.search(None,'ALL') 
msg_ids = data[0] 
msg_id_list = msg_ids.split() 

này cung cấp cho bạn một danh sách các id của thông điệp' s mà bạn có thể sử dụng để có được email của bạn

latest_email_id = msg_id_list[-1] 
result,data = conn.fetch(latest_email_id,"(RFC822)") 
raw_email = data[0][1] 

bây giờ raw_email là email của bạn messsage, nhưng nó không phải là rất đẹp, nếu bạn muốn phân tích nó làm somthing như thế này

from email.parser import Parser 

p = Parser() 
msg = p.parsestr(raw_email) 

bây giờ bạn có thể làm

msg.get('From') 
msg.get('Subject') 

hoặc về nội dung

msg.get_payload() 

nhưng nếu nó nhắn nhiều phần dữ liệu đi của bạn cần phải làm xử lý nhiều hơn một chút, luckly một giải pháp đệ quy là hoàn hảo cho việc này tình hình

def process_multipart_message(message): 
    rtn = '' 
    if message.is_multipart(): 
     for m in message.get_payload(): 
      rtn += process_multipart_message(m) 
    else: 
     rtn += message.get_payload() 
    return rtn 

tại

msg_contant = process_multipart_message(msg) 

sẽ cung cấp cho bạn toàn bộ thư mỗi lần.

+0

Tôi cần phải kết nối với cổng 443 và đặt bảo mật thành SSL/TLS (chấp nhận tất cả chứng chỉ). Tôi sẽ làm như thế nào? Đã được tìm kiếm cho nó nhưng không có kết quả cho đến nay. – Timo002

+0

conn.starttls() trước khi đăng nhập – lxx

+0

Nếu tôi cần xử lý tệp được gửi tới email của mình bằng tập lệnh - làm cách nào tôi có thể tìm nạp tệp đó? Cảm ơn !! – Bramat

Các vấn đề liên quan