Create a new email with c# and attach a file Outlook 2016

11,991

Solution 1

The fixed sample code should look like this:

var ol = new Outlook.Application();
Outlook.MailItem mail = ol.CreateItem(Outlook.OlItemType.olMailItem) as Outlook.MailItem;

note that you need to declare the Outlook alias with your using statement:

using Outlook = Microsoft.Office.Interop.Outlook;

(as you already did) ... but must also remove

using Microsoft.Office.Interop.Outlook;

to avoid Visual Studio confusing your references.

The rest of the MSDN example should work as expected I don't have any other samples I can point you to, so your best bet is searching for Microsoft.Office.Interop.Outlook or explore linked questions here.

Solution 2

use .Net class for that:

public static void CreateMessageWithAttachment(string server,string filePath)
{
    // Specify the file to be attached and sent.
    // This example assumes that a file named Data.xls exists in the
    // current working directory.
    string file = filePath;
    // Create a message and set up the recipients.
    MailMessage message = new MailMessage(
       "[email protected]",
       "[email protected]",
       "Quarterly data report.",
       "See the attached spreadsheet.");

    // Create  the file attachment for this e-mail message.
    Attachment data = new Attachment(file, MediaTypeNames.Application.Octet);
    // Add time stamp information for the file.
    ContentDisposition disposition = data.ContentDisposition;
    disposition.CreationDate = System.IO.File.GetCreationTime(file);
    disposition.ModificationDate = System.IO.File.GetLastWriteTime(file);
    disposition.ReadDate = System.IO.File.GetLastAccessTime(file);
    // Add the file attachment to this e-mail message.
    message.Attachments.Add(data);

    //Send the message.
    SmtpClient client = new SmtpClient(server);
    // Add credentials if the SMTP server requires them.
    client.Credentials = CredentialCache.DefaultNetworkCredentials;

    try {
      client.Send(message);
    }
    catch (Exception ex) {
      Console.WriteLine("Exception caught in CreateMessageWithAttachment(): {0}", 
                  ex.ToString() );            
    }
    data.Dispose();
}

after that just iterate the list from loop and send it to the function

more example you can use https://www.codeproject.com/Tips/286952/create-a-simple-smtp-server-in-csharp

Share:
11,991
Jonas
Author by

Jonas

Updated on June 27, 2022

Comments

  • Jonas
    Jonas almost 2 years

    I have a list of documents and email addresses.

    I am trying to create a method I can use to iterate throw the list of emailAddresses and for each creates a new email I Outlook and attaches the corresponding document.

    The Creating the MailItem is was I get stuck. Found a sample on MSDN that should work from Office 2013 and forward.

    This is what I have so far:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.Office.Interop.Outlook;
    
    namespace Test_Invoice
    {
        class SendviaMail
        {
            string demofile = @"C:\Desktop\test-inv\1_Test Testesen_1_010.pdf";
            public void Send()
            {
                MailItem eMail = new MailItem();
    
                eMail.Subject = "Here is Your Invoice";
                eMail.To = "[email protected]";
                eMail.Body = "Dette er en test mail for TestMailApp";
    
            }
    
            public void Send(string email, string filename)
            {
    
            }
        }
    }
    

    I've been trying to understand the documentation on MSDN and read thru a few posts on here.

    As far as I can figure out, the next step is to add the attachment (the demo file) If I understand it right I need something like

    eMail.AttachmentAdd = demofile;
    

    But that does not work.

    It might be me that does not understand the library correctly. Looking at this sample from MSDN https://msdn.microsoft.com/en-us/library/bb644320.aspx

    Results in this code:

    using Microsoft.Office.Interop.Outlook;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Outlook = Microsoft.Office.Interop.Outlook;
    
    namespace Test_Invoice
    {
        class SendviaMail
        {
            string demofile = @"C:\Desktop\test-inv\1_Test Testesen_1_010.pdf";
            public void Send()
            {
                Outlook.MailItem mail = Application.CreateItem(Outlook.OlItemType.olMailItem) as Outlook.MailItem;
                mail.Subject = "Quarterly Sales Report FY06 Q4";
    
                //MailItem eMail = new MailItem();
    
                //eMail.Subject = "tilmelding og faktura";
                //eMail.To = "[email protected]";
                //eMail.Body = "Dette er en test mail for TestMailApp";
                //eMail.AttachmentAdd
            }
    
            public void Send(string email, string filename)
            {
    
            }
        }
    }
    
  • Jonas
    Jonas almost 7 years
    will this use the current users email profile in windows? its a wpf application and needs to use the current users outlook to generate the email.
  • Leon Barkan
    Leon Barkan almost 7 years
    if you have smpt server on the pc you need to send in to the function or just initialize it hardcoded in the function
  • Jonas
    Jonas almost 7 years
    Nice example. But it seams to me that we are overcomplicating things by writing an SMTP Server into the application to be able to send the email. as Filburt surgested above the other method by using Outlook seams to be well documented and there are lots of posts and samples on it. But I seam to be missing some part of the puzzle.
  • Filburt
    Filburt almost 7 years
    @Jonas There is no programming overhead involved sending the message via smtp - however it can be difficult to convince your administrators to allow smtp relay for every user. Also if your requirement is, to have your mail item tracked in your Exchange account, the quoted example is the way to go.
  • Jonas
    Jonas almost 7 years
    Found this reference and sample for using the Application or getting the active process msdn.microsoft.com/en-us/library/office/ff462097.aspx
  • Suncat2000
    Suncat2000 about 5 years
    This will submit the email to an SMTP server from the application host. The original poster asked to create a new email with attachment for sending from Outlook 2016. It's a useful alternative, but doesn't answer the question.