Salvar anexos do Outlook 2007 usando C#

Podem baixar o aplicativo completo em SalvaAnexosOutlook2007.exe (93,50 kb). Não precisa instalar. Copie para uma pasta qualquer que já funciona. Só uma coisa: ele remove todos os anexos dos e-mails.

Em caso de dúvidas, podem me mandar uma mensagem, usando o link existente no programinha.

E, se quiser ver o código, é esse (não se esqueça de adicionar a referência para o Microsoft.Office.Interop.Outlook):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using 
System.Data;
using 
System.Drawing;
using 
System.Linq;
using 
System.Text;

using 
SWF System.Windows.Forms;
using 
Microsoft.Office.Interop.Outlook;
using 
System.Text.RegularExpressions;

namespace 
SalvaAnexosOutlook2007
{
    
public partial class Form1 : SWF.Form
    {
        
public Form1()
        {
            InitializeComponent()
;
        
}

        
private void Form1_Load(object sender, EventArgs e)
        {
            Application myApp 
= new ApplicationClass();

            foreach 
(Folder f in myApp.GetNamespace("MAPI").Folders)
                listBox1.Items.Add(f.Name)
;
            listBox1.SelectedIndex 0;
        
}
        
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            
if (listBox1.SelectedIndex !-1)
            {
               listBox2.Items.Clear()
;

                
Application myApp = new ApplicationClass();

                foreach 
(Folder f in myApp.GetNamespace("MAPI")
                    .Folders[listBox1.SelectedIndex + 
1].Folders)
                    listBox2.Items.Add(f.Name)
;
            }
        }

        
private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            
if (SWF.MessageBox.Show(
                
"Tem certeza que quer salvar os anexos das mensagens selecionadas?" +
                
"\n\nIsso apagará os anexos do seu e-mail!!!""Responda",
                SWF.MessageBoxButtons.YesNo,
                SWF.MessageBoxIcon.Question)
                    
== SWF.DialogResult.Yes)
            {
                Application myApp 
= new ApplicationClass();

                foreach 
(Folder f in myApp.GetNamespace("MAPI")
                    .Folders[listBox1.SelectedIndex + 
1].Folders)
                {
                    
if (f.Name.Equals(listBox2.SelectedItem.ToString()))
                    {
                        
foreach (object email in (f.Items))
                        {
                            MailItem mail 
email as MailItem;

                           int 
contador;

                            if 
(mail != null)
                            {
                                contador 
0;

                                while 
(mail.Attachments.Count > && contador <10)
                                {
                                    Attachment mi 
mail.Attachments[1as Attachment;
                                    if 
(mi != null)
                                    {
                                        string nomeAtt = null;

                                        try
                                        
{
                                            nomeAtt 
SWF.Application.StartupPath
                                                + 
@"\" + f.Name
                                                + 
"_" + mail.SentOn.ToString("yyyyMMddHHmmss")
                                                + 
"_" + Limpar(mail.Subject)
                                                + 
"_" + Limpar(mi.DisplayName);
                                            
mi.SaveAsFile(nomeAtt);

                                            
label1.Text mi.DisplayName;
                                            
SWF.Application.DoEvents();

                                            
mi.Delete();
                                        
}
                                        
catch
                                        
{
                                            contador++
;
                                        
}
                                    }
                                }

                                
if (mail != null)
                                    mail.Save()
;
                            
}
                        }
                        
if (SWF.MessageBox.Show(
                            
"Arquivos gravados - quer abrir a pasta?",
                            
"FIM DO PROCESSO",
                            SWF.MessageBoxButtons.YesNo,
                            SWF.MessageBoxIcon.Question)
                                
== SWF.DialogResult.Yes)
                        {
                            System.Diagnostics.Process.Start(
                                SWF.Application.StartupPath)
;
                            
SWF.Application.Exit();
                        
}
                    }
                }
            }
        }

       
private String Limpar(String s)
        {
            
return Regex.Replace(s, "[\"@/{}<>():|;\\?*&%$]", String.Empty);
        
}
        
private void linkLabel1_LinkClicked(object sender, SWF.LinkLabelLinkClickedEventArgs e)
        {
            System.Diagnostics.Process.Start(
http://www.50minutos.com.br/FaleConosco.aspx);
        
}
    }
}

 

Comentários (6) -

Ademir
Ademir
22/03/2010 08:38:04 #

Boa Agnaldo, isto eh bom pra quem esta desenvolvendo nota fical eletronica... que precisa monitorar uma conta pra pegar o xml da nfe de entrada que os fornecedores enviam  vlw...

agnaldo
agnaldo
22/03/2010 09:19:50 #

opa... mais uma idéia/utilização!!! fico feliz!!!

Tiago
Tiago
03/06/2011 10:42:13 #

Não consegui no VS2010. Alguma sugestão? Pode disponibilizar o source code?

agnaldo
agnaldo
04/06/2011 09:09:48 #

adicionou a referência do Microsoft.Office.Interop.Outlook???

Tiago
Tiago
04/06/2011 12:04:20 #

Sim, eu adicionei a referência. Na verdade, eu preciso modificar o código para que o aplicativo leia e-mails com um subject parametrizado (tipo "relatorios(abcdefg)"), salve o anexo em uma pasta do computador ou da rede, desde que o o mês da data do arquivo seja igual ao nome do mês da pasta. Como eu sou novo em C#, estou apanhando para achar esta solução em foruns. De qualquer forma, eu agradeço toda a ajuda!

Tiago
Tiago
09/06/2011 09:20:17 #

Ok Agnaldo, eu tinha adicionado a referência errada Tong

Funcionou perfeitamente!

Agora preciso saber como posso fazer o seguinte:

1) Limitar os anexos a serem salvos para XLS e ZIP
2) Renomear parte do arquivo (de: relatorio abc | para: novo relatorio)

Obrigadão!

Comentar

  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading