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
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.