• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1511
  • Last Modified:

C# copy outlook emails to folder

How is it possible to copy (not move)  messages from outlook by C# to a folder whenever the programs is running?

Paul
0
pauledwardian
Asked:
pauledwardian
  • 10
  • 8
1 Solution
 
Bob LearnedCommented:
What version of .NET do you have?

What version of Outlook are you using?

Windows Forms or WPF?

What do you mean by "folder" (file or Outlook)?
0
 
pauledwardianAuthor Commented:
.Net: 4.0 and 3.5
VS version: 2010
Outlook: 2010 and 2007
C# Windows Form
I mean a static address for a folder such as C:\All Emails so the program grabs the emails and copy them to the C:\All Emails from outlook. But, doesnt duplicate if it is already there.

Thank you,
Paul
0
 
Bob LearnedCommented:
I am using Redemption with C#, to access my Outlook.  I am always looking to figure how to do something that I haven't figured out before.  

Are you talking about from the current users Inbox to a folder?

Redemption
http://www.dimastr.com/redemption/home.htm
0
Prepare for your VMware VCP6-DCV exam.

Josh Coen and Jason Langer have prepared the latest edition of VCP study guide. Both authors have been working in the IT field for more than a decade, and both hold VMware certifications. This 163-page guide covers all 10 of the exam blueprint sections.

 
Bob LearnedCommented:
Here is a Redemption example snippet:

        public void DownloadEmailToFolder(string path)
        {
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            RDOFolder inbox = this.redemptionSession.GetDefaultFolder(rdoDefaultFolders.olFolderInbox);

            List<RDOMail> mailItemList = inbox.Items.OfType<RDOMail>().ToList();

            foreach (RDOMail mail in mailItemList)
            {
                string fileName = Path.Combine(path, this.MakeValidFileName(mail.Subject));

                try
                {
                    mail.SaveAs(fileName);
                }
                catch (Exception)
                {
                    throw new InvalidOperationException("Invalid path: " + fileName);
                }
            }
        }

Open in new window

0
 
Bob LearnedCommented:
        private string MakeValidFileName(string input)
        {
            string pattern = "[?:/*]+";
            return Regex.Replace(input, pattern, "");
        }

Open in new window

0
 
Bob LearnedCommented:
using System.Text.RegularExpressions;
using Redemption;
0
 
pauledwardianAuthor Commented:
where should I donwload Redemption refferance from?
0
 
Bob LearnedCommented:
There is a Download link on the Redemption web site:

Redemption
http://www.dimastr.com/redemption/download.htm
0
 
pauledwardianAuthor Commented:
Is it free?
0
 
Bob LearnedCommented:
Yes, the Developer Edition is free.  If you have to distribute, there is a fee.
0
 
pauledwardianAuthor Commented:
Now its all good. Except I get this error for redemptionsession:


Error      1      'WindowsFormsApplication10.Form1' does not contain a definition for 'redemptionSession' and no extension method 'redemptionSession' accepting a first argument of type 'WindowsFormsApplication10.Form1' could be found (are you missing a using directive or an assembly reference?)      c:\users\comp\documents\visual studio 2010\Projects\WindowsFormsApplication10\WindowsFormsApplication10\Form1.cs      35      36      WindowsFormsApplication10


in this line:
RDOFolder inbox = this.redemptionSession.GetDefaultFolder(rdoDefaultFolders.olFolderInbox);
0
 
pauledwardianAuthor Commented:
This is how I did it. Can you double check plz: Also, does it also copy the files from the Inbox Sub-folder as well?

public void DownloadEmailToFolder(string path)
        {
           // Redemption.RDOSession Session = default(Redemption.RDOSession);
            dynamic Session = Activator.CreateInstance(Type.GetTypeFromProgID("Redemption.RDOSession"));
            Session.Logon();

 if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            RDOFolder inbox = Session.GetDefaultFolder(rdoDefaultFolders.olFolderInbox);

            List<RDOMail> mailItemList = inbox.Items.OfType<RDOMail>().ToList();

            foreach (RDOMail mail in mailItemList)
            {
                string fileName = Path.Combine(path, this.MakeValidFileName(mail.Subject)+".msg");
                //if (mail.ReceivedTime.Equals("03 / 23 / 2012"))
                    
                    try
                {
                    mail.SaveAs(fileName);
                }
                catch (Exception)
                {
                    throw new InvalidOperationException("Invalid path: " + fileName);
                }
                }
                
            
        }
        private string MakeValidFileName(string input)
        {
            string pattern = "[?:/*]+";
            return Regex.Replace(input, pattern, "");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DownloadEmailToFolder("C:\\emails");
        }

Open in new window

0
 
Bob LearnedCommented:
You should be able use early-binding, instead of Activator.CreateInstance.  The class that I have for an Outlook service is pretty big, and I just gave you a little piece of it.

Add a reference to Redemption, and use the typical style:

RDOSession session = new RDOSession();

Add a using statement at the top of the class:

using Redemption;

Also, I prefer to separate the behavior from the user interface (UI), so all the methods for Outlook/Redemption are in there own class (OutlookService).
0
 
pauledwardianAuthor Commented:
Does it also take care of the sub folders under the Inbox. Lets say if the user created couple of sub directory like Customers, Bills, etc..
Does the program grab emails from those directory as well? or does it only look into the Inbox folder?
0
 
Bob LearnedCommented:
It shouldn't do the sub-folders, since it just loops through the Items property for the folder, and does a SaveAs.  You would need to get a reference to each of the sub-folders, and repeat the same process.  That could be a recursive method call.
0
 
pauledwardianAuthor Commented:
I've requested that this question be closed as follows:

Accepted answer: 0 points for pauledwardian's comment #37760209

for the following reason:

Thanks!
0
 
Bob LearnedCommented:
I think that there was some help from me, don't ya think?
0
 
pauledwardianAuthor Commented:
Yes, I accidentally selected my solution :)
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

  • 10
  • 8
Tackle projects and never again get stuck behind a technical roadblock.
Join Now