通过python在outlook中转发来自特定发件人的邮件



我尝试下面的代码,但属性错误是驱使我疯了!获取属性错误,WTV prop。我使用。我以属性错误结束。

AttributeError: <unknown>.Sender

代码:

import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6) # "6" refers to the inbox
messages = inbox.Items
sender_email = "TDC@AE.Roco.COM"
recipient_email = "simple.invoice@net"
for message in messages:
if message.Sender.Address == sender_email:
new_mail = message.Forward()
new_mail.Recipients.Add(recipient_email)
for attachment in message.Attachments:
new_mail.Attachments.Add(attachment)
new_mail.Save()

根据给出的答案:

import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application")
mapi = outlook.GetNamespace("MAPI")
inbox = mapi.GetDefaultFolder(6)
accounts = mapi.Folders
query = '@SQL="urn:schemas:httpmail:from" = ' + "'TDC@AE.Roco.COM'" + ' AND "urn:schemas:httpmail:hasattachment" = ' + "'1'"
print(query)
try:
items = inbox.Items.Restrict(query)
print(f'Number of items found : {items.count}')

def check_subfolders(folder):
items = folder.Items.Restrict(query)
if items.count > 0:
print(f'{items.count} emails found in {folder.name}')
for subfolder in folder.Folders:
check_subfolders(subfolder)

check_subfolders(inbox)
for folder in mapi.Folders:
items = folder.Items.Restrict(query)
if items.count > 0:
print(f'{items.count} emails found in {folder.name}')
for item in items:
mail = item.Forward()
mail.Recipients.Add("simple.invoice@net")
mail.Subject = "Fwd: " + item.Subject
mail.Body = "Please find the forwarded message with attachments below:nn" + item.Body
mail.Save()
except Exception as e:
print(f'An error occurred: {e}')

现在我没有错误,但结果返回0,尽管我有来自指定发件人的邮件!

快速示例

import win32com.client
def outlook_emails(Inbox):
Filter_sender = "@SQL=""urn:schemas:httpmail:fromemail"" " 
"ci_phrasematch 'TDC@AE.Roco.COM'"
items = Inbox.Items.Restrict(Filter_sender)
print(items.Count)
for i in reversed(range(items.Count, 0, -1)):
if items[i].Class == 43:
print(items[i].Subject)

if __name__ == "__main__":
outlook = win32com.client.Dispatch(
"outlook.Application").GetNamespace(
"MAPI"
)
inbox = outlook.GetDefaultFolder(6)
outlook_emails(inbox)

@SQL ="urn:模式:用户名:fromemail"ci_phrasematch

并非所有Outlook项目都提供Sender属性。Outlook文件夹可能包含不同类型的项目-笔记,日历项目,邮件项目,文件项目等因此,确保处理邮件项目是有意义的,例如,您可以检查MessageClass属性。

代替在Outlook中遍历所有项:

for message in messages:
if message.Sender.Address == sender_email:

使用Items类的Find/FindNextRestrict方法。它们允许获取与搜索条件相对应的项,因此您可以遍历它们,而无需每次检查属性。关于这些方法的更多信息,请参阅我为技术博客撰写的文章:

  • 如何:使用Find和FindNext方法从文件夹中检索Outlook邮件项目(c#, VB.NET)
  • 如何:使用Restrict方法从文件夹
  • 中检索Outlook邮件项目

使用以下搜索条件从指定的电子邮件地址获取项目:

criteria = "@SQL=" & Chr(34) _ 
& "urn:schemas:httpmail:senderemail" & Chr(34) _ 
& " = 'eugene@astafiev.com'"

如果您需要从特定的发件人发送一个项目,您可以使用MailItem。SendUsingAccount属性返回或设置一个Account对象,该对象表示要发送MailItem的帐户。注意,另一个帐户应该在Outlook中配置。例如,VBA中的示例显示了如何使用它:

Sub SendUsingAccount() 
Dim oAccount As Outlook.account 
For Each oAccount In Application.Session.Accounts 
If oAccount.AccountType = olPop3 Then 
Dim oMail As Outlook.MailItem 
Set oMail = Application.CreateItem(olMailItem) 
oMail.Subject = "Sent using POP3 Account" 
oMail.Recipients.Add ("someone@example.com") 
oMail.Recipients.ResolveAll 
Set oMail.SendUsingAccount = oAccount 
oMail.Send 
End If 
Next 
End Sub

另一种方法是使用MailItem。SentOnBehalfOfName属性返回或设置一个字符串,该字符串指示邮件消息的预期发送者的显示名称。在这种情况下,其他用户应该有权代表Exchange中的另一个人发送。

Sender属性仅由MailItem对象公开,但您也可以在Inbox文件夹中拥有ReportItemMeetingItem对象。您需要首先检查Class属性== 43(即olMail)

同样,不要循环遍历文件夹中的所有项-使用Items.Find/FindNextItems.Restrict来查询[SenderEmailAddress] = 'TDC@AE.Roco.COM'

相关内容

  • 没有找到相关文章

最新更新