简体   繁体   中英

Python to Forward specific mails with attachments recieved today in outlook

I'm trying to figure out a way to forward emails with attachments received today

from " invoice@email.com" to "Remas@email.com".

I am stuck in that line, What to put here exactly to let it know that any attachment received from invoice@email.com" today, send it to "Remas@email.com" automatically.

What to type here?

messages = inbox.Items(????????)

My code:

import win32com.client
import time
import datetime as dt
from os import path



outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items

for message in messages:
    NewMsg = message.Forward()
    NewMsg.Body = message.Body
    NewMsg.Subject = message.Subject
    NewMsg.To = "Remas@email.com"
    #NewMsg.Send()

Work with Items.Restrict method (Outlook) to apply a filter to the inbox.Items collection

Example

import win32com.client
import time
import datetime as dt
from os import path

outlook = win32com.client.Dispatch(
    "Outlook.Application").GetNamespace("MAPI")

inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items

today = str(dt.date.today())

filter_message = f"([ReceivedTime] > '{today} 00:00 AM') AND " \
                 f"([SenderEmailAddress] = 'invoice@email.com')"

for message in messages.Restrict(filter_message):
    # if message has attachments
    if message.Attachments.Count > 0:
        NewMsg = message.Forward()
        NewMsg.HTMLBody = message.HTMLBody
        NewMsg.Subject = message.Subject
        NewMsg.To = "Remas@email.com"
        # NewMsg.Send()
        NewMsg.Display()

You may also wanna check MailItem.SenderEmailType property (Outlook)

Returns a String that represents the type of entry for the email address of the sender of the Outlook item, such as 'SMTP' for Inte.net address, 'EX' for a Microsoft Exchange server address, etc. Read-only.

Example

https://stackoverflow.com/a/74816451/4539709

Instead of iterating over all items in the Outlook folder:

for message in messages:
    NewMsg = message.Forward()

You need to use the Find / FindNext or Restrict methods of the Items class. They allow getting items that correspond to your conditions and iterate over them only. You may get items recieved today by using the following search criteria:

strFilter = "%today("urn:schemas:httpmail:datereceived")%" 

To get items for a specific time frame (for example, several days or hours) you may combine conditions using logical operators:

'This filter uses urn:schemas:httpmail namespace 
    strFilter = ""urn:schemas:httpmail:datereceived"" > '{datStartUTC}' AND ""urn:schemas:httpmail:datereceived"" < '{datEndUTC}'"

Read more about filtering items using a date-time comparisons in the Filtering Items Using a Date-time Comparison article.

Also you may get items that has any files attached, so you don't need to iterate over all items found for a specific date range:

" "urn:schemas:httpmail:hasattachment"=1 "

Read more about the Find / Find and Restrict methods in the articles that I wrote for the technical blog:

If you need to process multiple folders at once you may consider using the AdvancedSearch method. See Advanced search in Outlook programmatically: C#, VB.NET for more information.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM