Convert from .eml to .msg in C# .NET - c#

I want my users to fill out a simple form with fields like From, To, Subject, Body and Attachments. When they are done they should click on a button which lets them download a .msg file, so that they can edit it furthermore in outlook and send it.
All the converters APIs I've found for .NET are commercial (and quite pricy).
Here's my code:
using System.Net.Mail;
protected void lbOpenOutlook_Click(object sender, EventArgs e)
{
CreateEmail();
}
internal void CreateEmail()
{
// Create message
MailMessage message = new MailMessage();
// subject
message.Subject = "email subject";
// body content
message.Body = "email message.";
// sender
message.From = new MailAddress("sender#gmail.com");
// send this mail to
message.To.Add("test1#gmail.com");
// cc list
message.CC.Add("ccuser1#gmail.com");
// Create the SMTP Client object
SmtpClient smtpClient = new SmtpClient();
// store in directory
smtpClient.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
// path of the pickup folder
smtpClient.PickupDirectoryLocation = Server.MapPath("~/Emails/");
// deliver email
smtpClient.Send(message);
}
This generates a .eml file..how could I convert it to a .msg whitout using a commercial API?
Also, I don't want to use Microsoft.Office.Interop.Outlook namespace because it works fine on the client but it's not supported on the server and my application is running under IIS.

Note: Summary of comments on the answer.
Whilst Outlook 2007 does not support opening .eml files, Outlook 2010+ can open .eml files correctly.

To convert EML to MSG you can use Aspose.Email for .Net.
This is a third-party library, which can provide you with a bunch of useful functions for working with email.
The Email API can be used for basic email management features such as converting, message content attachment manipulation and editing, and for its advanced features such as management of the message storage files, sending & receiving emails via several protocols including POP3, IMAP & SMTP.
You can do it programmatically. For example, you can use the following code:
//Initialize .EML file
using (MailMessage eml = new MailMessage("test#from.to", "test#to.to", "template subject", "Template body"))
{
string oftEmlFileName = "EmlAsMSG_out.msg";
MsgSaveOptions options = SaveOptions.DefaultMsg;
//Save created .MSG file
options.SaveAsTemplate = true;
eml.Save(oftEmlFileName, options);
}
I think this approach can be useful for you.
I am a Developer Evangelist at Aspose.

Related

Saving a created .msg file as readonly

Hi I had a requirement wherein I convert dxl to .msg file. Since there is no out of the box .NET way to do so, I parsed the xml, got the required fields out, created a .msg file using Microsoft.Office.Interop.Outlook. But when I open the file it looks like a draft mail, ready to be sent. But I would want the file to open as an inbox mail or a sent mail, wherein the fields are 'Not Editable' meaning should be readonly.
My code:
mailitem.To = "reciever#recieve.com";
mailitem.SentOnBehalfOfName = "sender#send.com";
mailitem.Subject = "Test for MSG";
mailitem.Body = "Sample Body";
mailitem.SaveAs(temppath + ".msg", OlSaveAsType.olMSG);
There is something called SaveSentMessageFolder in mailItem, couldn't figure out how to do so.
Thanks

How to open new email with attachment in Windows 10 Mail App

I am trying to add a feature to my C# / .Net app for a user to email a file.
When a user has Outlook installed, I can successfully use the Outlook interop APIs to do exactly what I want.
However on a new Windows 10 install, I cannot work out how to open an email with an attachment in the default Mail app, which is from the Windows Store.
I have tried:
Using EML files, as per https://stackoverflow.com/a/25586282/2102158
The Mail app does not register itself to open EML files
Using the MAPI32.dll etc. (I used the code from https://github.com/metageek-llc/inSSIDer-2/blob/master/MetaScanner/UnhandledException/MapiMailMessage.cs)
A dialog box pops up saying there is no email program registered. It seems the mail app does not interact with MAPI
Using mailto: links.
The mail program opens, but it does not respect Attachment= or Attach= parameters
Also
Windows.ApplicationModel.Email.EmailMessage seems to be only availble on phones.
I do not want to use SMTP to send the message server side.
I also tried the MS-UNISTORE_EMAIL: and OUTLOOKMAIL: url schemes, which are associated to the Mail app, they seemed to behave the same as mailto:
There does not seem to be any way to start the Mail app from the command line
Try this:
a href='mailto:yourname#domain.com?Subject=yoursubject&Body=yourbody&Attachment=file path '
Or try by using file upload to attach the file in mail:
Msg.Attachments.Add(new Attachment(FileUpload1.FileContent, System.IO.Path.GetFileName(FileUpload1.FileName)));
Please try the following example
private async void SendEmailButton_Click(object sender, RoutedEventArgs e)
{
EmailMessage emailMessage = new EmailMessage();
emailMessage.To.Add(new EmailRecipient("***#***.com"));
string messageBody = "Hello World";
emailMessage.Body = messageBody;
StorageFolder MyFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
StorageFile attachmentFile =await MyFolder.GetFileAsync("MyTestFile.txt");
if (attachmentFile != null)
{
var stream = Windows.Storage.Streams.RandomAccessStreamReference.CreateFromFile(attachmentFile);
var attachment = new Windows.ApplicationModel.Email.EmailAttachment(
attachmentFile.Name,
stream);
emailMessage.Attachments.Add(attachment);
}
await EmailManager.ShowComposeNewEmailAsync(emailMessage);
}
The ShowComposeNewEmailAsny(...) part is the magic part.

MailMessage c# - How to make it HTML and add images etc?

string to = "email#hotmail.co.uk";
string body = "Test";
SmtpClient SMTPServer = new SmtpClient("127.0.0.1");
MailMessage mailObj = new MailMessage(urEmail, to, subject, body);
SMTPServer.Send(mailObj);
This is how i am currently sending a test email.
How do i make this html and be able to make the email sent out look better by adding images etc?
Thanks
On the MailMessage set the property IsBodyHtml to true.
string to = "email#hotmail.co.uk";
string body = "Test";
SmtpClient SMTPServer = new SmtpClient("127.0.0.1");
MailMessage mailObj = new MailMessage(urEmail, to, subject, body);
mailObj.IsBodyHtml = true; // This line
SMTPServer.Send(mailObj);
You have to set mailObj .IsBodyHtml = true;
you can use the following idea to take an ASPX page and render it to a string:
StringWriter writer = new StringWriter();
Server.Execute("Login.aspx", writer);
string html = writer.ToString();
If you then set the MailMessage.IsBodyHtml to true you can send an HTML message. If you want to use images and other stuff make sure that the receiver of the email can access those images.
There are two ways of doing this:
Embed the images inside your mail. (see this question)
Link to the images through your src attribute of the image tag inside your HTML mail. This needs you to host the image files somewhere on a webserver which the recipients can access.
In both cases you will need to send the mail with a html body.
mailObj.IsBodyHtml = true;
For your question about adding Image to your email, if your asking for embedding then you can use Anchor tags of HTML or else attach the image file to the mail by using mailObj.Attachments.Add() method i guess.
But the best way is to send the images as attachments because some firewalls just blocks the embedded images but allows attachments. So that way your better safer in delivering the content, though its not a perfect way.

Sending Mail with embeded image in ASP.NET

I want to send a mail with embeded image in ASP.NET
How can i do that?
Regards
Soner
There are generally two ways of doing this, whichever is preferred is up to you.
To literally "embed" the image in the email message itself, you'll want to add it as a Linked Resource and reference the attached resource in the email's HTML.
Alternatively, and more simply, if the image is hosted in a public location then you can just reference that location in the HTML of the email.
Based on the question, it sounds like you are preferring the former approach, but the latter is available as well.
MailAddress sendFrom = new MailAddress(txtFrom.Text);
MailAddress sendTo = new MailAddress(txtTo.Text);
MailMessage myMessage = new MailMessage(sendFrom, sendTo);
MyMessage.Subject = txtSubject.Text;
MyMessage.Body = txtBody.Text;
Attachment attachFile = new Attachment(txtAttachmentPath.Text);
MyMessage.Attachments.Add(attachFile);
SmtpClient emailClient = new SmtpClient(txtSMTPServer.Text);
emailClient.Send(myMessage);
I believe you can either attach the files and refer them, or alternatively, like in regular HTML, embed them encoded in Base64.
You can go through this link
http://www.dotnetspider.com/resources/41465-Send-Formatted-outlook-email-from-NET-C.aspx
Sample project is also attached.
It shows how to put the link of the image in the application in the html template and send emails.

How else can I email a file using ASP.NET?

I'm using the code below in a ASP.NET page to send a file via email from our users home computer to a mailbox that is used for receiving work that needs photocopying. The code below works fine when sending a file within our network but fails when our users are at home and connected via our SSL VPN, there appears to be a bug in our VPN where it doesn't allow the file to be temporarily saved on the webserver before being sent via email. Can anyone offer any other suggestions on how to attach a file to a ASP.NET page and have the file sent via email without storing it on the web server? Many thanks Jane.
MailMessage mail = new MailMessage();
mail.From = txtFrom.Text;
mail.To = txtTo.Text;
mail.Cc = txtFrom.Text;
mail.Subject = txtSubject.Text;
mail.Body = "test"
mail.BodyFormat = MailFormat.Html;
string strdir = "E:\\TEMPforReprographics\\"; //<-------PROBLEM AREA
string strfilename = Path.GetFileName(txtFile.PostedFile.FileName);
try
{
txtFile.PostedFile.SaveAs(strdir + strfilename);
string strAttachment = strdir + strfilename;
mail.Attachments.Add(new MailAttachment(strdir + strfilename));
SmtpMail.SmtpServer = "172.16.0.88";
SmtpMail.Send(mail);
Response.Redirect("Thanks.aspx", true);
}
catch
{
Response.Write("An error has occured sending the email or uplocading the file.");
}
finally
{
}
If you use the classes in the System.Net.Mail namespace, the Attachment class in there supports streams, so assuming you can read it in to memory as a stream first you can then add that to the attachment, that way you never have to store any files.
More information (and a sample) here:
http://msdn.microsoft.com/en-us/library/6sdktyws.aspx
Can anyone offer any other suggestions on how to attach a file to a ASP.NET page and have the file sent via email without storing it on the web server? Many thanks Jane.
That's impossible. A web server hosting an ASPX page has to receive the file from the client before processing it any further.
Use string strdir = Path.GetTempPath();?
Off the top of my head, create the attachment like:
txtFile.PostedFile.InputStream.Position = 0
mail.Attachments.Add(new MailAttachment(txtFile.PostedFile.InputStream, strfilename ));
That should allow you to create the attachment, without saving it to disk.

Categories

Resources