Click here to Skip to main content
13,446,544 members (41,026 online)
Click here to Skip to main content
Add your own
alternative version


45 bookmarked
Posted 24 Nov 2007

Creating In-Memory Mail Attachments

, 24 Nov 2007
Rate this:
Please Sign up or sign in to vote.
This article shows how to create mail attachments during runtime without creating files on the file system.
Screenshot - InMemoryMailAttachment.gif


Recently I wrote a background service which monitors a database and sends emails about the status. Each email has an attached XML file, which is used to automatically process the emails at the receiver's side. I looked for an example on how to create such attachments without first creating files in the file system. There are a lot of examples on how to attach existing files to an email, but none showed how to create attachments in-memory.

For demonstration purposes, I wrote a small windows application which is able to send an email with an attachment. I hope this small example can help some people struggling with the same problem.

Understanding the Code

I put all the code into the click event handler of the "Send" button in the SenderForm class. In real production code, I would have separated the concerns into different classes, especially to be able to test the behavior with unit tests. The code uses the .NET Framework class SmtpClient and MailMessage to send emails. There are already a lot of articles on how to initialize the SmtpClient, how to perform the SMTP authentication and how to create a MailMessage, so I will not cover this part in detail.

// Init the smtp client and set the network credentials
SmtpClient smtpClient = new SmtpClient();
smtpClient.Host = hostTextBox.Text;
// Create MailMessage
MailMessage message = new MailMessage(

The interesting part is the creation of the attachment. The file content string should be placed inside the attachment. First you have to convert the string into an array of bytes. These bytes must be written into a memory stream. Do not forget to set the position pointer in the stream back to the beginning before you use the stream. You have to define the MIME type and the file name with a ContentType object. Now you can create an Attachment object. Adding this attachment to the email and sending it is easy:

// Create a memory stream
using (MemoryStream memoryStream = new MemoryStream())
    byte[] contentAsBytes = Encoding.UTF8.GetBytes(fileContentTextBox.Text);
    memoryStream.Write(contentAsBytes, 0, contentAsBytes.Length);

    // Set the position to the beginning of the stream.
    memoryStream.Seek(0, SeekOrigin.Begin);

    // Create attachment
    ContentType contentType = new ContentType();
    contentType.MediaType = MediaTypeNames.Application.Octet;
    contentType.Name = fileNameTextBox.Text;
    Attachment attachment = new Attachment(memoryStream, contentType);

    // Add the attachment

    // Send Mail via SmtpClient

Points of Interest

The use of streams and the encoding and decoding of strings is solved very nicely by the creators of the .NET Framework. Nevertheless, someone not concerned with these issues everyday may need some examples to get productive quickly. I hope this article may help a little bit.


  • 24th November, 2007: Initial version posted
  • 3rd December, 2007: Disposing the memory stream with a using statement


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Sven Grand
Team Leader
Germany Germany
Sven worked as Software Developer, System Architect, Project Manager and Team Leader. He is working for more than 15 years in the software industry.

You may also be interested in...


Comments and Discussions

QuestionEven today a life Saver Pin
Phoenix2k117-Sep-12 8:35
memberPhoenix2k117-Sep-12 8:35 
Questionnice Pin
CIDev19-Apr-12 7:09
memberCIDev19-Apr-12 7:09 
QuestionBrilliant Pin
Member 475455511-Apr-12 16:37
memberMember 475455511-Apr-12 16:37 
GeneralDanke! Pin
xmanuw5-Oct-09 4:21
memberxmanuw5-Oct-09 4:21 
GeneralUse the CreateAttachmentFromString() method to create an attachment Pin
jussieu00724-Feb-09 23:41
memberjussieu00724-Feb-09 23:41 
GeneralRe: Use the CreateAttachmentFromString() method to create an attachment Pin
Sven Grand13-Mar-09 11:15
memberSven Grand13-Mar-09 11:15 
GeneralGreat Article... Pin
Joshua Clark9-May-08 8:28
memberJoshua Clark9-May-08 8:28 
GeneralVery Usefull Pin
Dhawal Mehta30-Mar-08 23:59
memberDhawal Mehta30-Mar-08 23:59 
GeneralGreat article Pin
stylonurus20-Feb-08 8:22
memberstylonurus20-Feb-08 8:22 
GeneralNice solution when permissions cant be granted Pin
Member 453350210-Dec-07 5:53
memberMember 453350210-Dec-07 5:53 
GeneralDispose! Pin
Steven Berkovitz26-Nov-07 13:41
memberSteven Berkovitz26-Nov-07 13:41 
AnswerRe: Dispose! Pin
Sven Grand27-Nov-07 8:56
memberSven Grand27-Nov-07 8:56 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01-2016 | 2.8.180314.2 | Last Updated 24 Nov 2007
Article Copyright 2007 by Sven Grand
Everything else Copyright © CodeProject, 1999-2018
Layout: fixed | fluid