在 VB.Net 中创建电子邮件生成类。尝试读取 HTML 生成正文时出错

Creating Email Generation classin VB.Net. Getting Error trying to read HTML to generate body text

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

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

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

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

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

这里是 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

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

An exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll but was not handled in user code

Additional information: Could not find file 'C:\Program Files (x86)\IIS Express\Welcome.html'.

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

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

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

您可能希望使用 AppDat 文件夹来存储您的 AppData(推荐)。 查看下面的代码片段:

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

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