C# Outlook.Attachment.Add to attach a document from a url

I have an issue where I need to have my web application attach a file from a url (sharepoint url).

My code below will work for a direct file path but I will get an error if I try to do it with a url.  The main reason why I need to be able to do this is because I want to create a custom action in sharepoint and have it send a document as an attachment.

I know I can do this with JavaScript utilizing ActiveX but now days most browser will block activeX controls and it becomes more difficult to support end-users and educate them on how to enable ActiveX

below is my code for calling Outlook.  Please Note for this to work you must Microsoft.Office.Core and Microsoft.Office.Interop.Outlook for it to work
Microsoft.Office.Interop.Outlook.ApplicationClass _MsOutlook = new Microsoft.Office.Interop.Outlook.ApplicationClass();
            Microsoft.Office.Interop.Outlook.NameSpace oNs = null;
            Microsoft.Office.Interop.Outlook.MailItem oMailItem = (Microsoft.Office.Interop.Outlook.MailItem)_MsOutlook.CreateItem(OlItemType.olMailItem);
            oMailItem.Subject = "";
            oMailItem.To = "";
            oMailItem.CC = "";
            oMailItem.BodyFormat = Microsoft.Office.Interop.Outlook.OlBodyFormat.olFormatHTML;
            oMailItem.HTMLBody = stBody;
            oMailItem.Attachments.Add(TextBox1.Text, (int)Microsoft.Office.Interop.Outlook.OlAttachmentType.olByValue, stBody.Length + 1, stDisplayName);
            oMailItem.Display(true);

Open in new window

thomasm1948Asked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

microboltCommented:
For it to work you must have the document stored locally on the system before you attach it.  Try having your app download it to an temp folder on your machine and attaching it from there.
0
thomasm1948Author Commented:
I tried downloading the file as you explained but I get an unauthorized error message
0
10 Tips to Protect Your Business from Ransomware

Did you know that ransomware is the most widespread, destructive malware in the world today? It accounts for 39% of all security breaches, with ransomware gangsters projected to make $11.5B in profits from online extortion by 2019.

thomasm1948Author Commented:
Below is my test code for downloading the document.  If I am able to get this to work then I can simply have my application do a Request.QueryString["item"]; to get the path of any document in the document library
string test2 = "/demsite/MRP Detailed Output/Payment Plan for jan and feb 2009.xlsx";
        string webString = "http://tomkat" + "/demsite/Shared Documents/021508.pdf";
        string webdoc = "http://tomkat" + "/demsite/Shared Documents/021508.pdf";
        int LastIndex = webdoc.LastIndexOf("/");
        //tmp.Substring(LastIndex + 1, (tmp.Length - LastIndex - 1));
        webdoc = webdoc.Substring(LastIndex + 1, (webdoc.Length - LastIndex - 1));
        System.Net.WebClient webClient = new System.Net.WebClient();
        webClient.DownloadFile(webString, @"c:\" + webdoc);

Open in new window

0
thomasm1948Author Commented:
I get the following code to work but I get a save as dialog box and I would like to just download the file directly to the file system and then delete it after it is done opening Outlook
try
            {
                int flag=0;
                SPSite site = new SPSite("http://tomkat"); 
                SPWeb web = site.OpenWeb(); 
                web.AllowUnsafeUpdates=true;
                string strContentType="";                 
                SPFileCollection files=folder.Files;
                //"docLib" is name of document library and testFile.doc is the name of file                
                string url = "http://tomkat" + TextBox1.Text;
                SPFile tempFile = web.GetFile(url);
                //Get the extension of File.
                string filename = "http://tomkat" + TextBox1.Text;
                int LastIndex = filename.LastIndexOf("/");
                filename = filename.Substring(LastIndex + 1, (filename.Length - LastIndex - 1));               
                string[] fext = filename.Split('.');
                byte []obj=(byte[])tempFile.OpenBinary();
                // Get the extension of File to determine the file type
                string casestring="";
                if(fext.Length>1)
                {
                    casestring= fext[fext.Length-1];
                }
                //set the content type of file according to extension
                switch(casestring)
                {
                    case "txt": 
                        strContentType = "text/plain";
                        break;
                    case "htm" : strContentType = "text/html";
                        break;
                    case "html" : strContentType = "text/html";
                        break;
                    case "rtf" : strContentType = "text/richtext";
                        break;
                    case "jpg" : strContentType = "image/jpeg";
                        break;
                    case "jpeg": strContentType = "image/jpeg";
                        break;
                    case "gif" : strContentType = "image/gif";
                        break;
                    case "bmp" : strContentType = "image/bmp";
                        break;
                    case "mpg" : strContentType = "video/mpeg";
                        break;
                    case "mpeg": strContentType = "video/mpeg";
                        break;
                    case "avi" : strContentType = "video/avi";
                        break;
                    case "pdf" : strContentType = "application/pdf";
                        break;
                    case "doc" : strContentType = "application/msword";
                        break;
                    case "dot": strContentType = "application/msword";
                        break;
                    case "csv" : strContentType = "application/vnd.msexcel";
                        break;
                    case ".xls": strContentType = "application/vnd.msexcel";
                        break;
                    case ".xlt": strContentType = "application/vnd.msexcel";
                        break;
                    default : strContentType = "application/octet-stream";
                        break;
                }
                Response.ClearContent();
                Response.ClearHeaders();
                Response.AppendHeader("Content-Disposition", "attachment; filename= "+ filename);
                Response.ContentType = strContentType;                
                if (Response.IsClientConnected)
                {
                    Response.BinaryWrite(obj);
                    
                    
                }
                Response.Flush();
                Response.Close();
                Response.End();
            }
            catch(System.Exception ex)
            {
            } 
        }

Open in new window

0
thomasm1948Author Commented:
Here is another piece of code that works with activeX but like I said I prefer not to use it because most web browsers will block it by default

            if (!IsPostBack)
            {
                TextBox1.Text = Request.QueryString["item"];
                
            }
            string s;
            s = "\r\n    <script language='javascript' type='text/javascript' id='MyJS'>\r\n  function SendMail()\r\n  {\r\n  var s = window.location.href.substr(0,window.location.href.indexOf('/',8)) +\r\n      document.getElementById('ctl00_PlaceHolderMain_TextBox1').value;\r\n  var outlookApp = new ActiveXObject('Outlook.Application');\r\n  mailItem = outlookApp.CreateItem(0);\r\n  mailItem.Attachments.Add(s);\r\n  mailItem.display (0);\r\n  window.history.back();\r\n } \r\n</script>";
            Page.RegisterClientScriptBlock("WebsioSendMailScript", s);    

Open in new window

0
microboltCommented:
What happens when you try to use this code?  WebClient would definable be the best solution to your problem.
string test2 = "/demsite/MRP Detailed Output/Payment Plan for jan and feb 2009.xlsx";
        string webString = "http://tomkat" + "/demsite/Shared Documents/021508.pdf";
        string webdoc = "http://tomkat" + "/demsite/Shared Documents/021508.pdf";
        int LastIndex = webdoc.LastIndexOf("/");
        //tmp.Substring(LastIndex + 1, (tmp.Length - LastIndex - 1));
        webdoc = webdoc.Substring(LastIndex + 1, (webdoc.Length - LastIndex - 1));
        System.Net.WebClient webClient = new System.Net.WebClient();
        webClient.DownloadFile(webString, @"c:\" + webdoc);

Open in new window

0
thomasm1948Author Commented:
I get an unauthorized error message
0
thomasm1948Author Commented:
If there is another way to call Outlook and attaching a file without utilizing javascript or any other methods that i tried then I am open to try it.  I prefer to use C# because it is native to SharePoint

Thank you for all of your help
0
microboltCommented:
Try adding credentials into your call.  Try using the snippet below:

string test2 = "/demsite/MRP Detailed Output/Payment Plan for jan and feb 2009.xlsx";
        string webString = "http://tomkat" + "/demsite/Shared Documents/021508.pdf";
        string webdoc = "http://tomkat" + "/demsite/Shared Documents/021508.pdf";
        int LastIndex = webdoc.LastIndexOf("/");
        //tmp.Substring(LastIndex + 1, (tmp.Length - LastIndex - 1));
        webdoc = webdoc.Substring(LastIndex + 1, (webdoc.Length - LastIndex - 1));
        System.Net.WebClient webClient = new System.Net.WebClient();
        webClient.Credentials = CredentialCache.DefaultCredentials;
        webClient.DownloadFile(webString, @"c:\" + webdoc);

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
thomasm1948Author Commented:
that seemed to have worked.  

Thank you for all of your help
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C#

From novice to tech pro — start learning today.