Domanda

Sto cercando di mettere insieme uno script che inoltra automaticamente alcune e -mail che corrispondono a un criterio specifico a un'altra e -mail.

Ho il download e l'analisi dei messaggi utilizzando IMAPLIB e il funzionamento delle e -mail, ma non riesco a capire come inoltrare un'intera e -mail a un altro indirizzo. Devo costruire un nuovo messaggio da zero o posso in qualche modo modificare quello vecchio e ritrovarlo?

Ecco cosa ho finora (il client è una connessione imaplib.imap4 e l'ID è un ID messaggio):

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'] = 'source.email.address@domain.com'
forward['To'] = 'my.email.address@gmail.com'

smtp.sendmail(user, ['my.email.address@gmail.com'], forward.as_string())

Sono sicuro che ci sia qualcosa di leggermente più complicato che devo fare riguardo al contenuto di MIME del messaggio. Sicuramente c'è un modo semplice per inoltrare l'intero messaggio?

# This doesn't work either, it just freezes...?
mail['From'] = 'source.email.address@domain.com'
mail['To'] = 'my.email.address@gmail.com'
smtp.sendmail(user, ['my.email.address@gmail.com'], mail.as_string())
È stato utile?

Soluzione

Penso che la parte che avevi di sbagliato sia come sostituire le intestazioni nel messaggio e il fatto che non è necessario effettuare una copia del messaggio, puoi semplicemente operare direttamente su di essa dopo averlo creato dai dati grezzi che hai preso dal server IMAP.

Hai omesso alcuni dettagli, quindi ecco la mia soluzione completa con tutti i dettagli spiegati. Nota che sto mettendo la connessione SMTP in modalità StartTLS poiché ne ho bisogno e nota che ho separato la fase IMAP e la fase SMTP l'una dall'altra. Forse hai pensato che modificare il messaggio lo avrebbe in qualche modo modificato sul server IMAP? Se lo hai fatto, questo dovrebbe mostrarti chiaramente che ciò non accade.

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 = "from.me@example.com"
to_addr = "to.you@example.com"

# 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()

Spero che questo aiuti anche se questa risposta arriva abbastanza tardi.

Altri suggerimenti

In un'applicazione scarico messaggi tramite POP3 (usando Poplib) e inoltrali usando il tuo secondo metodo ... cioè, mi modifico sul messaggio originale e lo invio e funziona.
Hai provato a colpire all'interno di Smtp.sendmail per vedere dove si ferma?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top