SendGrid SMTP API : Embed Image : Bad Request

2019-03-30 16:25发布

问题:

I am using the sendgrid SMTP API https://github.com/sendgrid/sendgrid-csharp to send emails but I cannot figure out how to embed an image. I can do it using .Net native mail api without issues. I am simply getting a Bad Request. Here is my code that is throwing

private static void Main(string[] args)
    {
        try {
           //// Create the email object first, then add the properties.
            var myMessage = new SendGridMessage();

            contact_list = new List<MailAddress>();
            contact_list.Add(new MailAddress("email@gmail.com"));
            myMessage.To = contact_list.ToArray();
            myMessage.From = new MailAddress("clientservice@stpis.com");
            myMessage.Subject = "Subject";

            string html = "<div><img src=cid:Logo /></div>";

            myMessage.Html = html;
            myMessage.EmbedImage(@"C:\logo.png", "Logo");

            SendMessage(myMessage);
        }
        catch(Exception e)
        {
            Console.WriteLine(e.Message);
        }

    }

    private static void SendMessage(SendGridMessage message)
    {
        // Create credentials, specifying your user name and password.
        var credentials = new NetworkCredential("username", "pwdpwdpwd");

        // Create a Web transport for sending email.
        var transportWeb = new Web(credentials);

        // Send the email.
        try
        {
            transportWeb.Deliver(message);
            Console.WriteLine("Sent!");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

回答1:

I figured out how to get this working. Here is the code used:

var myMessage = new SendGridMessage();

contact_list = new List<MailAddress>();
contact_list.Add(new MailAddress("my email address"));

myMessage.To = contact_list.ToArray();
myMessage.From = new MailAddress("clientservice@stpis.com", "STP Client Service");
myMessage.Subject = "STP Report Package: " + package_report_name;
string img = @"C:\\logo.png";
ContentType ctype = new ContentType("image/png");
var attachment = new Attachment(img, ctype);
var linkedResource = new LinkedResource(img, ctype);
myMessage.AddAttachment(attachment.ContentStream, attachment.Name);
myMessage.EmbedImage(attachment.Name, linkedResource.ContentId);

string html = "<img src=cid:"+linkedResource.ContentId+" />";
myMessage.Html = html;


回答2:

there is no need to create ContentType and LinkedResource objects. Add embedded image as an attachment. Also EmbedImage method expects image name and not the complete path.

Following code works:

var myMessage = new SendGridMessage();

        contact_list = new List<MailAddress>();
        contact_list.Add(new MailAddress("email@gmail.com"));
        myMessage.To = contact_list.ToArray();
        myMessage.From = new MailAddress("clientservice@stpis.com");
        myMessage.Subject = "Subject";

        string html = "<div><img src=cid:Logo /></div>";

        myMessage.Html = html;
        **myMessage.AddAttachment(@"C:\logo.png");
        myMessage.EmbedImage("logo.png", "Logo");**

        SendMessage(myMessage);