2015-10-31 34 views
1

在我的解决方案中,我有一个VB类库项目。这个类库有一个包含多个html文件的文件夹,这些文件应该是电子邮件模板。此类库旨在包含在网站和控制台应用程序中以生成客户电子邮件。在VB.Net中创建电子邮件生成类。获取错误尝试读取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快递\ Welcome.html”。

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

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

回答

1

原来答案是设置文件的生成操作与我的模板“嵌入的资源。”然后,我可以使用GetManifestResourceStream获取文件的内容并按照我的意愿去做。我也将HTML文件转换为TXT文件。虽然我仍然觉得可能有更好的方法来实现我的目标,但这是有效的。

0

我相信你想在本地计算机上查找文件。 你可以检查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 
+0

因为我的目的是为了将这两个不同的应用程序一起使用,所以将这些文件放在AppData中会损害目的。 – SCleveland

相关问题