2010-04-26 16 views
8

के साथ एक ईमेल अग्रेषित करना मैं एक ऐसी स्क्रिप्ट को एक साथ रखने की कोशिश कर रहा हूं जो स्वचालित रूप से कुछ ईमेल अग्रेषित करता है जो किसी अन्य ईमेल के विशिष्ट मानदंड से मेल खाते हैं।पायथन smtplib

मुझे imaplib और ईमेल का उपयोग कर संदेशों का डाउनलोड और पार्सिंग मिल गया है, लेकिन मैं यह नहीं समझ सकता कि पूरे ईमेल को किसी अन्य पते पर कैसे अग्रेषित किया जाए। क्या मुझे स्क्रैच से नया संदेश बनाने की ज़रूरत है, या क्या मैं किसी पुराने तरीके से संशोधित कर सकता हूं और इसे फिर से भेज सकता हूं?

यहाँ मैं अब तक राशि है (ग्राहक एक imaplib.IMAP4 कनेक्शन है, और आईडी संदेश आईडी है):

import smtplib, imaplib 

smtp = smtplib.SMTP(host, smtp_port) 
smtp.login(user, passw) 

client = imaplib.IMAP4(host) 
client.login(user, passw) 
client.select('INBOX') 

status, data = client.fetch(id, '(RFC822)') 
email_body = data[0][1] 
mail = email.message_from_string(email_body) 

# ...Process message... 

# This doesn't work 
forward = email.message.Message() 
forward.set_payload(mail.get_payload()) 
forward['From'] = '[email protected]' 
forward['To'] = '[email protected]' 

smtp.sendmail(user, ['[email protected]'], forward.as_string()) 

मैं वहाँ कुछ थोड़ा और अधिक जटिल मैं संबंध में क्या कर रही करने की आवश्यकता है यकीन संदेश की एमआईएम सामग्री के लिए। निश्चित रूप से पूरे संदेश को अग्रेषित करने का कुछ आसान तरीका है?

# This doesn't work either, it just freezes...? 
mail['From'] = '[email protected]' 
mail['To'] = '[email protected]' 
smtp.sendmail(user, ['[email protected]'], mail.as_string()) 
+0

कोई दृढ़ संकल्प करने के लिए यहां बहुत अधिक अनुपलब्ध संदर्भ है। विशेष रूप से, क्या आप मानक smtplib का उपयोग कर रहे हैं? पायथन का क्या संस्करण। एसएमटीपी कहां शुरू किया गया है, क्या यह कनेक्ट() एड है? क्या आपको उचित हेल्लो प्रतिक्रिया मिली है? – msw

+0

यह मानक smtplib है, python2.6.4। smtplib क्लाइंट ठीक काम कर रहा है - मैं smtp के अंतिम तर्क के रूप में स्ट्रिंग को पास करके सरल टेक्स्ट ईमेल भेज सकता हूं। मैं सिर्फ एक नए पते पर डाउनलोड किए गए संदेश की पूरी MIME सामग्री भेजने का एक आसान तरीका ढूंढना चाहता हूं। – robbles

उत्तर

16

मुझे लगता है कि आपने जो हिस्सा गलत किया था वह संदेश में हेडर को प्रतिस्थापित करने का तरीका था, और तथ्य यह है कि आपको संदेश की एक प्रति बनाने की आवश्यकता नहीं है, आप इसे सीधे बनाने के बाद इसे सीधे संचालित कर सकते हैं आईएमएपी सर्वर से प्राप्त कच्चा डेटा।

आपने कुछ विवरण छोड़ दिया है, इसलिए यहां दिए गए सभी विवरणों के साथ मेरा पूरा समाधान है। ध्यान दें कि मैं STARTTLS मोड में एसएमटीपी कनेक्शन डाल रहा हूं क्योंकि मुझे इसकी आवश्यकता है और ध्यान दें कि मैंने आईएमएपी चरण और एसएमटीपी चरण को एक-दूसरे से अलग कर दिया है। शायद आपने सोचा था कि संदेश को बदलने से आईएमएपी सर्वर पर इसे किसी भी तरह बदल दिया जाएगा? यदि आपने किया, तो आपको यह स्पष्ट रूप से दिखाना चाहिए कि ऐसा नहीं होता है।

import smtplib, imaplib, email 

imap_host = "mail.example.com" 
smtp_host = "mail.example.com" 
smtp_port = 587 
user = "xyz" 
passwd = "xyz" 
msgid = 7 
from_addr = "[email protected]" 
to_addr = "[email protected]" 

# open IMAP connection and fetch message with id msgid 
# store message data in email_data 
client = imaplib.IMAP4(imap_host) 
client.login(user, passwd) 
client.select('INBOX') 
status, data = client.fetch(msgid, "(RFC822)") 
email_data = data[0][1] 
client.close() 
client.logout() 

# create a Message instance from the email data 
message = email.message_from_string(email_data) 

# replace headers (could do other processing here) 
message.replace_header("From", from_addr) 
message.replace_header("To", to_addr) 

# open authenticated SMTP connection and send message with 
# specified envelope from and to addresses 
smtp = smtplib.SMTP(smtp_host, smtp_port) 
smtp.starttls() 
smtp.login(user, passwd) 
smtp.sendmail(from_addr, to_addr, message.as_string()) 
smtp.quit() 

उम्मीद है कि यह उत्तर देर से आता है, भले ही यह मदद करता है।

0

एक आवेदन में मैं पॉप 3 के माध्यम से संदेश डाउनलोड (poplib का प्रयोग करके) और आगे उन्हें अपनी दूसरी विधि का उपयोग कर ... यही है, मैं करने के लिए/बदल मूल संदेश पर से और भेज सकते हैं और यह काम करता है।
क्या आपने यह देखने के लिए smtp.sendmail के अंदर पोकिंग करने का प्रयास किया है कि यह कहां रुकता है?