4
votes

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 protected]"));
            myMessage.To = contact_list.ToArray();
            myMessage.From = new MailAddress("[email protected]");
            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);
        }
    }
2

2 Answers

7
votes

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("[email protected]", "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;
3
votes

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 protected]"));
        myMessage.To = contact_list.ToArray();
        myMessage.From = new MailAddress("[email protected]");
        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);