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.
Related
I need to open mail file attachment directly from mail. Let say I have .txt file. I have already attached it to my mail. But now I need to open it, change some words and save it (it is manual part). How can I do this? My code is:
private void button2_Click(object sender, EventArgs e)
{
Outlook.Inspector currInspector = null;
Outlook.MailItem mail = null;
Outlook.Attachments attachments = null;
currInspector = Globals.ThisAddIn.Application.ActiveInspector();
if (currInspector != null) {
mail = (Outlook.MailItem)currInspector.CurrentItem;
attachments = mail.Attachments;
attachments.Add(#"C:\install\CSharp\tulemus.txt", Outlook.OlAttachmentType.olByValue);
}
The Outlook object model doesn't provide any property or method for that. You can try to read the attached files from the cache folder maintained by Outlook. See Finding Outlook temporary folder for email attachments for more information.
Also, you can use a low-level API (Extended MAPI) where you can access the PR_ATTACH_DATA_BIN property, read more about the algorithm in the Opening an attachment article.
In addition to what Eugene suggested - use Attachment.PropertyAccessor or MAPI (C++ or Delphi) to access the PR_ATTACH_DATA_BIN property (DASL name "http://schemas.microsoft.com/mapi/proptag/0x37010102") - you can also use Redemption (I am its author): its RDOAttach.AsText / AsArray / AsStream properties allow to modify attachment contents on the fly
I need to parse a few .msg files which have trail mails. Is there any way to get the sub messages and identify the initiated and the responded emails.
I do not want to use any third party tools. I am allowed to use the Outlook interop.
Below is the code that I have used to read the msg file.I am able to get the Body ,HTMLBody and other details.But I actually need all the trailing messages.
outlook._Application app = null;
outlook.MailItem item = null;
outlook.NameSpace session = null;
try
{
app = new outlook.Application();
session = app.Session;
item = session.OpenSharedItem(file) as outlook.MailItem;
}
catch(Exception ex)
{ }
If you are limited to OOM only, the only way to do that is to save each embedded message attachment as an MSG file (Attachment.SaveAsFile), then open it using Namespace.OpenSharedItem.
If using Redemption (I am its author) is an option, an MSG file can be opened using RDOSession.GetMessageFromMsgFile (similar to Namespace.OpenSharedItem in OOM), and the embedded message attachment can be accessed using the RDOAttachment.EmbeddedMsg property (returns RDOMail object) - no need to save the attachment first.
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.
i want to write application who send email using outlook and i found this link.
i try this and it's perfect for me but the only thing that i miss here is the option to attach files to the mail, is it possible to do it ?
Better use MailMessage instead.
There's an example on how to use it with attachment here(Scroll down to "Examples"):
http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.aspx
Not only will you get a managed framework for sending mails, but also whoever runs the code will not need Outlook installed and running.
If you're stuck with outlook for some reason, try this:
using Outlook = Microsoft.Office.Interop.Outlook;
int pos = (int)email.Body.Length + 1;
int attType = (int)Outlook.OlAttachmentType.olByValue;
email.Attachments.Add("file.txt", attType, pos, "File description.");
where:
Outlook.MailItem email = (Outlook.MailItem)_outlookAppInstance.CreateItem(Outlook.OlItemType.olMailItem);
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.