Forwarding an email with python smtplib

前端 未结 2 1647
执笔经年
执笔经年 2020-12-07 21:40

I\'m trying to put together a script that automatically forwards certain emails that match a specific criteria to another email.

I\'ve got the downloading and parsin

相关标签:
2条回答
  • 2020-12-07 22:12

    In one application I download messages via POP3 (using poplib) and forward them using your second method... That is, I alter To/From on the original Message and send it, and it works.
    Have you tried poking inside smtp.sendmail to see where it stops?

    0 讨论(0)
  • 2020-12-07 22:14

    I think the part you had wrong was how to replace the headers in the message, and the fact that you don't need to make a copy of the message, you can just operate directly on it after creating it from the raw data you fetched from the IMAP server.

    You did omit some detail so here's my complete solution with all details spelled out. Note that I'm putting the SMTP connection in STARTTLS mode since I need that and note that I've separated the IMAP phase and the SMTP phase from each other. Maybe you thought that altering the message would somehow alter it on the IMAP server? If you did, this should show you clearly that that doesn't happen.

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

    Hope this helps even if this answer comes quite late.

    0 讨论(0)
提交回复
热议问题