1) I'm not sure what you mean by default way, but the following code seems to do what you need:
MailMessage mail = new MailMessage();
mail.Subject = "Message subject";
mail.BodyText = "Message text";
mail.Attachments.Add(new Attachment(@"c:\data\attachment.eml"));
mail.Save(@"c:\data\message.eml");
2) Using DoNotPreloadAttachment
option with embedded messages is not an intended scenario, but specifying DoNotParseMimeTree
options as well works around the unintended behavior. Please give this a try:
var mail = new MailMessage();
mail.Subject = "Message subject";
mail.BodyText = "Message text";
var attachment = new Attachment();
attachment.Options |= MimeOptions.DoNotPreloadAttachments | MimeOptions.DoNotParseMimeTree;
attachment.SetContentFromFile(@"c:\data\attachment.eml", "attachment.eml", "message/rfc822");
mail.Attachments.Add(attachment);
mail.Save(@"c:\data\message.eml");
3) Content type of "message/rfc822" implies that the MIME node is an embedded message, while "text/plain" implies it's a plain text attachment. I'm not aware of any content type to specify an message as file attachment, but a quick test reveals that clients such as Outlook use the generic attachment content type of "application/octet-stream" for this.
Please give the code above a try. If it actually does what you need, please let us know what you were doing differently. Thanks!