4

I'm trying to automate saving emails in our folders from outlook. I don't see a code for saving an email as .msg or any other type.

import win32com.client
import os
os.chdir("filepathhere")
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
accounts= win32com.client.Dispatch("Outlook.Application").Session.Accounts;

Tokyo = "email from Tokyo"

inbox = outlook.GetDefaultFolder(6) 
subject = Tokyo
messages = inbox.Items
message = messages.GetFirst()

for msg in messages:
    if msg.subject == Tokyo:
        msgname = msg.subject
        msgname=str(msgname)
        print msgname
        message.saveasfile(msgname+".msg")

I get the error message: AttributeError: .saveasfile

pypi34
  • 51
  • 1
  • 1
  • 2
  • 1
    If you want to save the message that you're on within the loop, your last line should read `msg.saveasfile()`. Does that help? I'm not familiar with the win32com package. – GetHacked Jul 31 '18 at 20:27
  • I still get the error that says: AttributeError: .saveasfile – pypi34 Jul 31 '18 at 20:38
  • 1
    Where did you get that `saveasfile` from? Are you just guessing at what methods the object might provide and crossing your fingers? Look up the type in the MSDN docs. – abarnert Jul 31 '18 at 20:39
  • saveasfile() is the method I've seen people use to save attachment from emails. I haven't been able to find the right command – pypi34 Jul 31 '18 at 20:42
  • First, where have you seen that? If you give us a link, we can check whether you're actually doing the same thing as them. Second, you're not trying to save an attachment, you're trying to save a message. Those are obviously going to be different types, so why are you assuming they'll have the same methods? – abarnert Jul 31 '18 at 20:43
  • Have you tried just `SaveAs()`? https://msdn.microsoft.com/en-us/VBA/Outlook-VBA/articles/mailitem-saveas-method-outlook – GetHacked Jul 31 '18 at 20:51
  • it says i don't currently have the right permissions to access to folder I'm trying to save in (separate issue) - but this seems to be working! my last line was msg.SaveAs(file_path) Thanks! – pypi34 Jul 31 '18 at 21:03
  • @pypi34 No problem! I added it as an answer so as not to break the "answering in comments" rule. – GetHacked Jul 31 '18 at 21:42

3 Answers3

4

The below code works:

from win32com.client import Dispatch
import os
import re

outlook = Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
print(inbox)
messages = inbox.items
message = messages.GetLast()
name = str(message.subject)
#to eliminate any special charecters in the name
name = re.sub('[^A-Za-z0-9]+', '', name)+'.msg'
#to save in the current working directory
message.SaveAs(os.getcwd()+'//'+name)
GopiKrishna
  • 109
  • 1
  • 6
2

SaveAsFile is a method only to be used on attachments.

For the message itself, use simply message.SaveAs().

Source: https://msdn.microsoft.com/en-us/VBA/Outlook-VBA/articles/mailitem-saveas-method-outlook

GetHacked
  • 546
  • 4
  • 21
0

I have managed to get your code to work. In line 20 I believe that you have an issue:

message.saveasfile(msgname+".msg")

This "message" should save the first email in the inbox, not the current msg you have in your for loop. I believe that it is just a typo. Anyway I think you meant to use:

msg.saveas(msgname+".msg")

Which saves a file directly to my Documents folder. I haven't managed to get your os.chdir to save the file to a specified destination.

Dayantat
  • 108
  • 1
  • 6