【问题标题】:HTML mail using vb net will show as plain text and attachments are also ignored使用 vb net 的 HTML 邮件将显示为纯文本,附件也将被忽略
【发布时间】:2020-10-07 07:17:41
【问题描述】:

我正在 vb .net 上构建一个 Windows 窗体应用程序,其中一个发送 HTML 电子邮件。我可以发送电子邮件和 html 标签,而 css 不会显示,这意味着程序“知道”它是 html 而不仅仅是字符串。但我只是将文本块(在任何 p、h 或标签上)作为平面文本,一个接一个没有格式。

我尝试使用来自 Nuget 包的 EASendmail,结果相同。 我在谷歌和这里搜索了这个问题,但没有成功。

这就是我所拥有的

 Dim message As New MailMessage()
 Dim fromAdd As MailAddress = New MailAddress("my mail here")



With message

            .[To].Add("somebody email here")
            .Subject = "TEST"
            .From = fromAdd
            .Priority = MailPriority.Normal
            .IsBodyHtml = True
            .BodyEncoding = System.Text.Encoding.UTF8
            .Body = " <!DocType HTML>....the rest of the html code with the css..."

end with



Dim smtpClient As New SmtpClient("smtp.live.com")
            With smtpClient
                .EnableSsl = True
                .Port = 587
                .UseDefaultCredentials = False
                .Credentials = New System.Net.NetworkCredential("mymail@somewhere.com", "password")
                .DeliveryMethod = SmtpDeliveryMethod.Network
                .Send(message)
                .Dispose()
            End With
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

现在我期待一个漂亮的 html 电子邮件,我将其保存为一个 html 页面,并且在 chrome 中打开时它显示得很好。 出于某种原因,我只将文本段落作为平面文本获取,没有任何格式,任何附件也被忽略,图像文件附加到电子邮件但邮件不会显示它们。

【问题讨论】:

  • 始终创建两个MailMessage.AlternateViews,一个用于纯文本,另一个用于 HTML MIME 类型。至于图像。您需要为每个创建一个新的 LinkedResource 并将它们添加到 HTML 视图的 LinkedResources 集合中,并将 HTML 中每个的 cid 替换为其不带扩展名的路径。长篇大论?
  • 签出this
  • 我尝试过这种方式并得到相同的结果......好吧,我刚刚为html创建了alterateview......可能是这样???
  • 今天我会尝试并在这里发布结果谢谢
  • 修复了!!!两者兼而有之,我只是更正了 ' 符号,其中一个有趣的版本是由 word 制作的,并且在添加 2 alterateview 之后它的工作!谢谢!!

标签: vb.net


【解决方案1】:

以下是处理 HTML 电子邮件的方法

Dim mensaje01 As String = "<!docType HTML><html> ...and the rest of your html code here...</html>

现在,请务必将任何引号替换为 '(请勿使用 WORD、WORPAD 或 NOTEPAD 来执行此操作...它会生成一些有趣的版本,但它不会起作用...花了我 2 天意识到这一点。顺便说一下,notepad+ 可以一次全部替换,这很好)

 Dim VISTAHTML As AlternateView = AlternateView.CreateAlternateViewFromString(mensaje01, Nothing, System.Net.Mime.MediaTypeNames.Text.Html)
 Dim VISTATEXT As AlternateView = AlternateView.CreateAlternateViewFromString(mensaje01, Nothing, System.Net.Mime.MediaTypeNames.Text.RichText)

    Try

        Dim MENSAJE As MailMessage = New MailMessage 
        MENSAJE.AlternateViews.Add(VISTAHTML) 
        MENSAJE.AlternateViews.Add(VISTATEXT)

        MENSAJE.From = New MailAddress("your email address here") 
        MENSAJE.To.Add("the recipient email") 
        MENSAJE.Subject = "SUBJECT" 
        Dim MISMTP As SmtpClient = New SmtpClient("the smptp client you are using") 
        MISMTP.EnableSsl = True 
        MISMTP.Port = "587"
        MISMTP.Credentials = New Net.NetworkCredential("yor email address", "your password") 

        MISMT.Send(MENSAJE) 

        MsgBox("ENVIADO")
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

如果您需要在电子邮件中添加图片,您可以这样做:

Dim image As LinkedResource = New LinkedResource("image.jpg", System.Net.Mime.MediaTypeNames.Image.Jpeg)
Image.ContentId = "TEMP1"
VISTAHTML.LinkedResources.Add(image)

然后你用你的img标签上的CID来带图片就完成了!

【讨论】:

  • 很好 - 没有意识到 LinkedREsources 是电子邮件对象的一部分。我过去只是在 HTML 正文中包含转换后的我的字节流,然后使用 CID。所以,LinkedResources 是一个不错的发现。但是,在您的第二个代码片段中,您声明了一个图像 var,但在下一行您使用的是 IMAGEN1。这是从哪里来的? (你在哪里声明的?)。另外,IMAGEN1 是作为什么类型创建的?
  • 应该是图像,我是阿根廷人,所以我用西班牙语编写所有代码。当我在这里发表时,我试图用英文写出来,这样阅读起来会“更干净”(你可以看到我使用了 mismtp 和 mensaje,更改它们的工作量太大,所以他们留在西班牙语中)......那个逃脱了我……对不起
  • 非常感谢。我有点猜到了,但以防万一我想我会问。事实证明,我只是在编写一些电子邮件并将“cid”用于嵌入(附加)图像。我没有意识到 email 对象有linkedResouces 方法——所以这对我正在处理的代码是最及时和有帮助的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 2013-04-26
  • 2021-05-17
相关资源
最近更新 更多