【问题标题】:SendGrid SMTP API : Embed Image : Bad RequestSendGrid SMTP API:嵌入图像:错误请求
【发布时间】:2014-12-06 04:09:48
【问题描述】:

我正在使用 sendgrid SMTP API https://github.com/sendgrid/sendgrid-csharp 发送电子邮件,但我不知道如何嵌入图像。我可以使用 .Net 本机邮件 api 来做到这一点而不会出现问题。我只是收到一个错误的请求。这是我正在抛出的代码

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);
        }
    }

【问题讨论】:

    标签: api email smtp embed sendgrid


    【解决方案1】:

    我想出了如何让它发挥作用。这是使用的代码:

    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;
    

    【讨论】:

    • 我一直在努力让EmbedImage 通话正常工作,但这对我来说是成功的,谢谢! ;)
    • 你应该指定attachment.Name,因为默认是NULL
    • 这些图片是否真的显示为嵌入?当我在 HTML 中使用 &lt;img src="logo.png"&gt; 发送并在 API 中使用 cid:logo.png 添加附件时,它们在 Outlook 中可以正常工作,但在 Gmail 中却不行。尝试使用您的代码,Outlook 仍然显示嵌入,但 Gmail 仍然显示空白占位符。
    • EmbedImage() 在最新的 SendGrid API (2021) 中不可用。您可以改用附件对象。不幸的是,附件构造函数不接受文件流,只是一个文件名,当您使用嵌入式资源时,这很糟糕。
    • 编辑:AddAttachment() 还具有从文件流中读取对象的重载。
    【解决方案2】:

    无需创建 ContentType 和 LinkedResource 对象。添加嵌入图像作为附件。此外,EmbedImage 方法需要图像名称而不是完整路径。

    以下代码有效:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多