【问题标题】:Creating Email Generation classin VB.Net. Getting Error trying to read HTML to generate body text在 VB.Net 中创建电子邮件生成类。尝试读取 HTML 以生成正文时出错
【发布时间】:2015-11-03 11:33:28
【问题描述】:

在我的解决方案中,我有一个 VB 类库项目。这个类库有一个文件夹,里面有几个应该是电子邮件模板的 html 文件。此类库旨在包含在网站和控制台应用程序中以生成客户电子邮件。

我想要做的是将这些 html 模板读入一个字符串,并将模板中的关键字替换为来自简单数据结构的数据。目前我正在使用以键为关键字,值作为字符串的字典来替换它。

我遇到的问题是 VB 似乎不想找到我的 html 文件。

这是我的基本电子邮件类的代码

Imports System.Net.Mail
Imports System.IO

Public MustInherit Class Email

    Public Property TheMailMessage As MailMessage
    Protected MustOverride Property SendFrom As MailAddress
    Protected MessageTemplate As StreamReader
    Protected DataModel As Dictionary(Of String, String)
    Protected BodyContent As String

    Protected Function GenerateMessageBody() As String
        BodyContent = MessageTemplate.ReadToEnd
        For Each d In DataModel
            BodyContent.Replace(d.Key, d.Value)
        Next
        Return BodyContent
    End Function

    Protected MustOverride Sub PopulateMailMessage()

    Protected MustOverride Sub CreateDataModel()

End Class

这是继承电子邮件的子类的代码,它试图读取 HTML 文件以生成消息正文内容(我没有包括之间的调用,因为它所做的只是设置发件人地址) :

Imports System.IO
Imports System.Net.Mail

Namespace CustomerEmails

    Public Class Welcome : Inherits NoReply

        Sub New(ByVal Client As NinjaNexus.Model.Client)
            MyBase.New(Client)
            MessageTemplate = New StreamReader("Welcome.html")
            CreateDataModel(Client)
            PopulateMailMessage()
        End Sub

        Protected Overrides Sub CreateDataModel()
            Throw New NotImplementedException
        End Sub

        Protected Overrides Sub PopulateMailMessage()
            TheMailMessage.Subject = "Welcome to Company Name"
            TheMailMessage.Body = GenerateMessageBody()
        End Sub

        Protected Overloads Sub CreateDataModel(ByVal Client As NinjaNexus.Model.Client)
            DataModel = New Dictionary(Of String, String)
            DataModel.Add("{FName}", Client.Name)
            DataModel.Add("{Signature}", "Some name here")
        End Sub

    End Class
End Namespace

当我尝试运行代码以生成欢迎电子邮件时,我收到如下错误:

“System.IO.FileNotFoundException”类型的异常发生在 mscorlib.dll 但未在用户代码中处理

附加信息:找不到文件 'C:\Program Files (x86)\IIS Express\Welcome.html'。

我尝试了一些类似 GetFullPath 之类的方法,但没有奏效。添加文件夹名称或 ~\ 或 .\ 或任何类似性质的内容都无济于事。如果我使用完整的完整绝对路径,它会读取文件。但是,这条路径在运行完成的应用程序的机器上是不一样的,所以我真的需要一个相对的解决方案。

有谁知道如何让 StreamReader 正确读取我的 HTML 文件?有比使用 StreamReader 更好的方法吗?我想强调的是,这个库将用于多个相关项目,所以理想情况下,我想保留它所需的所有资源,而不是在某个文件服务器上闲逛。

【问题讨论】:

    标签: html vb.net email streamreader


    【解决方案1】:

    事实证明,答案是使用我的模板将文件的构建操作设置为“嵌入式资源”。然后我可以从那里使用 GetManifestResourceStream 来获取文件的内容并做我想做的事。我还将 HTML 文件切换为 TXT 文件。虽然我仍然觉得可能有更好的方法来实现我的目标,但这是可行的。

    【讨论】:

      【解决方案2】:

      我相信您想在本地计算机中查找文件。 可以查看here...

      您可能希望使用 AppDat 文件夹来存储您的 AppData(推荐)。 查看下面的 sn-p:

      Imports System.Environment
      
      Class Sample
          Public Shared Sub Main()
              ' Get the path to the Application Data folder
              Dim appData As String = GetFolderPath(SpecialFolder.ApplicationData)
      
              ' Display the path
              Console.WriteLine("App Data Folder Path: " & appData)
          End Sub
      End Class
      

      【讨论】:

      • 因为我的意图是让这成为一个编译库,与两个不同的应用程序一起使用,将文件放入 AppData 会破坏目的。
      猜你喜欢
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多