防止LinkedResource图像作为附件添加

时间:2018-02-27 16:02:53

标签: asp.net email embedded-resource

在使用System.Net.Mail发送电子邮件的页面上,我将此图像嵌入到html格式的电子邮件中。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>

    <!-- row 1 -->
    <TextBlock Text="1" />

    <!-- row 2 -->
    <StackPanel TextElement.FontSize="40" Grid.Row="1">
        <TextBlock>2</TextBlock>
        <TextBlock>3</TextBlock>
    </StackPanel>

    <!-- row 3 -->
    <TextBlock Text="4" Grid.Row="2" />
</Grid>

在创建电子邮件的代码中,图像是这样嵌入的。

string logoPath = "W:\\WebSites\\logo.jpg";
            LinkedResource imagelink = new LinkedResource(logoPath, "image/jpg");
            imagelink.ContentId = "imageId";
            imagelink.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;
            AlternateView htmlView = AlternateView.CreateAlternateViewFromString(MessageHeader + Message.ToString() + MessageFooter, null, "text/html");
            htmlView.LinkedResources.Add(imagelink);

一切正常。徽标出现在html格式的电子邮件中。但是,当用户收到电子邮件时,还有一个附加图像 - 在Outlook中,您会看到一个始终称为ATT00001的附件 - 如果您下载,则为徽标图像。

如何防止徽标作为附件添加以及嵌入?在邮件中添加徽标并附加等待下载看起来不合适。用户抱怨他们认为有附件 - 但事实上它只是徽标。

1 个答案:

答案 0 :(得分:1)

我想出了这个问题的解决方案。添加LinkedResource对象时,必须定义正确的MIME类型,否则,电子邮件客户端将不会提供嵌入的图像作为附件。

这是从我的场景中获取的示例代码(vb.net代码):

    'Your email
    Dim _htmlSource As New StringBuilder("<html> ... YOUR HTML EMAIL ... </html>")
    Dim _linkedResources As New List(Of LinkedResource)
    Dim _href As String = "http://your.image.url/image.png"


    'Adding images
    Dim _imageStream As MemoryStream
    Dim _mimeType As String
    Using _wc = New WebClient
        _imageStream = New MemoryStream(_wc.DownloadData(_href))
        _mimeType = _wc.ResponseHeaders("content-type")
    End Using
    Dim _contentId As String = Guid.NewGuid.ToString

    _htmlSource.Replace(_href, "cid:" & _contentId)
    _linkedResources.Add(New LinkedResource(_imageStream, New ContentType(_mimeType)) With {.ContentId = _contentId})



    'Compile mail message
    Dim mail As New MailMessage
    mail.IsBodyHtml = True
    Dim _htmlView As AlternateView = AlternateView.CreateAlternateViewFromString(_htmlSource.ToString(), Nothing, MediaTypeNames.Text.Html)
    _htmlView.TransferEncoding = TransferEncoding.EightBit
    _linkedResources.ForEach(Sub(lr) _htmlView.LinkedResources.Add(lr))