在MVC API中使用SendGrid Web API,附件不起作用

时间:2016-03-09 12:42:28

标签: asp.net-mvc api sendgrid

以下是我使用SendGrid API发送电子邮件的代码,但是附加文件在这里不起作用。 请帮忙。

 // Init SmtpClient with credentials from config file
            var smtpSection = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");

            string api_user = smtpSection.Network.UserName;
            string api_key = smtpSection.Network.Password;
            string toAddress = ConfigHelper.ErrorEmailTO;
            string toName = strFromName;
            string subject = Mailsubject;
            string text = "Test Body...";
            string fromAddress = strFromEmail;
            if (isInTestMode) {
                fromAddress = ConfigHelper.ErrorEmailTO;
            }

            string FileName = ((System.IO.FileStream)(attachments[0].ContentStream)).Name;
            MemoryStream ms = new MemoryStream();
            using (FileStream file = new FileStream(FileName, FileMode.Open, FileAccess.Read))
            {
                byte[] bytes = new byte[file.Length];
                file.Read(bytes, 0, (int)file.Length);
                ms.Write(bytes, 0, (int)file.Length);
            }
            ms.Position = 0;

            byte[] fileData = null;
            using (var binaryReader = new BinaryReader(ms))
            {
                fileData = binaryReader.ReadBytes(Convert.ToInt32(ms.Length));
            }



            string url = "https://sendgrid.com/api/mail.send.json";

            // Create a form encoded string for the request body,Here All Code Except Files parameter is working.

            string parameters = "api_user=" + api_user + "&api_key=" + api_key + "&to=" + toAddress +
                                "&toname=" + toName + "&subject=" + subject + "&text=" + text +
                                "&from=" + fromAddress + "&files=" + fileData 

            try
            {
                WebRequest request = WebRequest.Create(url);
                request.Method = "POST";
                string postData = parameters;
                byte[] byteArray = Encoding.UTF8.GetBytes(postData);
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = byteArray.Length;
                Stream dataStream = request.GetRequestStream();
                dataStream.Write(byteArray, 0, byteArray.Length);
                dataStream.Close();

                WebResponse response = request.GetResponse();
                Console.WriteLine(((HttpWebResponse)response).StatusDescription);
                dataStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(dataStream);
                string responseFromServer = reader.ReadToEnd();
                Console.WriteLine(responseFromServer);
                reader.Close();
                dataStream.Close();
                response.Close();
                return true;
            }
            catch (WebException ex)
            {
                // Catch any execptions and gather the response
                HttpWebResponse response = (HttpWebResponse)ex.Response;

                // Create a new read stream for the exception body and read it
                StreamReader streamReader = new StreamReader(response.GetResponseStream());
                string result = streamReader.ReadToEnd();

                // Write the results to the console
                Console.WriteLine(result);
                return false;
            }

现在,上面的代码正在使用我的API凭据来发送电子邮件。 电子邮件已成功收到,但它不包含任何附件。

2 个答案:

答案 0 :(得分:1)

请求中的内容类型应设置为“multipart / form-data”。

答案 1 :(得分:0)

这是一个老帖子;但如果有人需要,仍然会发布解决方案

foreach(var item in attachments)
{
  //Assuming that attachments as a collection of full file path
  var data = HttpUtility.UrlEncode(File.ReadAllBytes(item));
  var name = System.IO.Path.GetFileName(item);
  parameters = parameters + "&files[" + name + "]="+data;
}