How to display InfoPath forms inline with Outlook email message
I was helping one of the customers on a proof of concept (POC) for an InfoPath based Office Business Application (OBA) and came across a feature request to display InfoPath from inline with the email message in Outlook. Providing a consistent user experience is the reason cited for that feature. I did buy into the idea as it saves a few additional clicks to display the form before filling information like expenses, order requests, etc.
I thought I am sure people on the Internet would have done that and the solution was only a few searches away :(
No matter what I did the InfoPath form always used to come as an attachment and the user was required to open it in an InfoPath instance outside Outlook. I had to make a few phone calls to Redmond and verify through Office guys to figure out a solution and I thought this will be very helpful to share it with the community.
The solution was very simple I was missing a few vital MIME types:(
Here is a sample code (not fit for production) that uses SMTP service to generate an email on the server...
[ServiceContract]
public interface IFormMailer
{
[OperationContract]
bool MailInfoPathForm(string from, string to, string smtpServer,
string templateName, string formName );
}
When an email is generated one needs to assume that the template (.XSN) will not be on the client machine and hence both .XSN and .XML files will need to be attached. While inserting the files into the mail message, it is necessary to attach appropriate MIME types. In addition to the MIME types, necessary message headers will have to be added to make sure that Outlook treats the attachments with due processing.
Following is a simple table that lists the headers and MIME types:
InfoPath File Type |
MIME Type |
XSN |
application/x-microsoft-InfoPathFormTemplate |
XML |
application/x-microsoft-InfoPathForm |
Mail Message Header |
Header Value |
Content-Class |
InfoPathForm.InfoPath |
Message-Class |
IPM.InfoPathForm.InfoPath |
Above simple WCF contract is implemented in a skeletal FormMailer class shown below:
public class FormMailer : IFormMailer
{
public bool MailInfoPathForm(string from, string to, string
smtpServer, string templateName, string formName)
{
try
{
string rootPath = @"D:\Working\InfoPathMailer\";
SmtpClient client = new SmtpClient(smtpServer);
// Make sure that your .NET thread is running under
// appropriate credentials to connect to the SMTP service
client.Credentials = CredentialCache.DefaultNetworkCredentials;
// Specify the e-mail sender.
MailAddress sender = new MailAddress(from);
// Set destinations for the e-mail message.
MailAddress receiver = new MailAddress(to);
// Specify the message content.
MailMessage message = new MailMessage(sender, receiver);
message.Subject = "InfoPath test from a web service";
// The following two lines are very important to render the
// the InfoPath form inline with the Outlook message
Attachment template = new Attachment(rootPath + templateName, new
ContentType("application/x-microsoft-InfoPathFormTemplate"));
Attachment form = new Attachment(rootPath + formName, new
ContentType("application/x-microsoft-InfoPathForm"));
message.Attachments.Add(form);
message.Attachments.Add(template);
message.Headers.Add("Content-Class", "InfoPathForm.InfoPath");
message.Headers.Add("Message-Class", "IPM.InfoPathForm.InfoPath");
// wire up an event handler for post processing
client.SendCompleted += new
SendCompletedEventHandler(SendCompletedCallback);
client.Send(message);
return true;
}
catch (Exception e)
{
//do some logging for root cause analysis
return false;
}
}
private void SendCompletedCallback(object sender,
AsyncCompletedEventArgs e)
{
//do some logging and post processing here
}
While the above solution displays the form inline with the email message, it still doesn't display it in the preview mode. I will make another post once I figure that one out.
Hope this is helpful!
Cheers,
HanuK
Comments
Anonymous
March 18, 2008
PingBack from http://msdnrss.thecoderblogs.com/2008/03/18/how-to-display-infopath-forms-inline-with-outlook-email-message/Anonymous
October 06, 2008
Hi, I have a custom form region attached to a custom message class, say "IPM.Note.Test". What message headers should I set through SmtpClient to set the message class for the outgoing messages and make outlook display my form region automatically?Anonymous
October 01, 2009
Great ! really helpful, Thanks !Anonymous
July 26, 2010
Sharepoint forms cannot be connected to Outlook 2010. When I try to Connect to Outlook, the outlook folder will just display .xml data and not a clear rendering of the form.Any ideas why this doesn't work?Anonymous
August 13, 2010
yeah i have the same issue with info path forms, there seems to be no preview handler for the infopath forms ~ kind of annoying :) it would be great if MS own products came with preview handlers :)Anonymous
October 06, 2010
This works great. BUT does anyone know how to modify the Introduction field in the email message using this technique?Anonymous
December 22, 2011
I read you blog with great interest, but I'm not really sure what you mean by inline. Does this mean you do not need an instance of InfoPath to fill out the form. I currently have an Outlook form whose functionality is coded with VBscript. The whole thing works to some extent but it's not very stable. So O though I'd switch to InfoPath, hoping I can design a form that when published on a server, can be opened and filled out via Oiutlook and then sent to a recipient as an e-mail, who can then process the form data as required. Is this possible?Anonymous
March 03, 2015
Thank you. This was very helpful. On a different note, MS has decided to deprecate InfoPath. I believe InfoPath still has a lot to offer. There are not many technology alternatives if you want to build a large data capture form. Cheers, S