2013-11-03 297 views
0

我正在尝试编写Excel VBA代码,该代码允许我自动创建并发送Lotus Notes电子邮件。我面临的问题是难以创建富文本电子邮件,因此我认为打开草稿电子邮件将更容易,并且将会替换标记文本(对于示例PASTE EXCEL CELLS HERE),然后只是:使用Excel VBA打开Lotus Notes草稿,以便仅替换值

.GotoField ("Body") 
.FINDSTRING "PASTE EXCEL CELLS HERE"' 

并替换。

有关如何打开某个草稿电子邮件的帮助?请拨打.CreateDocument属性?

非常感谢!

+0

我已经很多年没有参与Lotus Notes了,所以我即将写的东西可能会过时。 Lotus Notes富文本是与微软的富文本格式无关的未发布的专有标准。试试HTML。 –

回答

0

“草稿”这个词在这里可能不合适,但“模板”这个词又是如此。两者在Lotus Notes中都有特定的含义,这些含义并不是你真正想要的。用户可以删除草稿,而模板则完全不同。所以让我们把它称为样板消息。

我会推荐在Domino服务器上创建一个特殊的邮件数据库(NSF文件),它只会作为您的样板库。您可以在该邮件数据库中创建一个名为“Boilerplates”的文件夹。使用Domino Designer,您可以修改该文件夹的设计,以使“主题”列成为视图中的第一列,并对其进行排序。

一旦你完成了这些,你已经创建了一些样板并将它们保存在文件夹中,可以使用VBA执行NotesSession.getDatabase调用,NotesDatabase.getView调用(用于文件夹和视图),然后使用NotesView.getDocumentByKey()来检索您分配给它的主题的特定样板。请注意,您不必将此文档复制到用户的邮件数据库以便发送邮件。

0

你想要做的并不重要,但是你提到了一封电子邮件草稿,因此可能会有一种解决方法。

在您的邮件设置中,您可以指定一个签名文件,该文件可以是磁盘上的外部html文件。因此,请修改签名文件,然后创建您的新邮件,然后按照您希望的方式填充正文字段。

对于示例代码,在备忘录表单中应该有一个按钮来指定要使用的签名文件。你可以用它作为基准。

0

富文本不是很难处理,但您需要查看Domino Designer帮助,尤其是类NotesRichTextItem和NotesRichTextStyle。您还需要了解DOM(Domino对象模型)。然后,您可以编程方式创建邮件内容。

否则,我认为理查德的解决方案是最好的,你有一个单独的数据库,您可以获得丰富的文本片段,并使用NotesRichText类的AppendRTItem方法将其放入您的电子邮件中。

1

其他人提出了一些有趣的概念,但最健壮的方法是在映射到Body Rich Text项目的MIME实体中使用HTML。使用NotesSession..Convertmime = False,您可以将主体构建为HTML,然后发送消息。基于后由约瑟夫Hoetzl here的LotusScript中相当于是这样的:

Sub Initialize() 
    Dim s As New NotesSession 
    Dim db As NotesDatabase 
    Dim stime as Single 

    Dim alog As New NotesLog("debug") 
    Call alog.OpenAgentLog() 

    stime = Timer 
    On Error GoTo eh 

    Dim doc As NotesDocument 
    Dim body As NotesMIMEEntity 
    Dim header As NotesMIMEHeader 
    Dim stream As NotesStream 
    Dim child As NotesMIMEEntity 
    Dim sendTo As String 
    Dim subject As String 

    s.Convertmime = False 
    sendto = s.Effectiveusername 
    subject = "Demo Message" 

    Set db= s.Currentdatabase 
    Set doc=db.Createdocument() 
    Set stream = s.CreateStream 
    Set body = doc.CreateMIMEEntity 
    Set header = body.CreateHeader({MIME-Version}) 
    Call header.SetHeaderVal("1.0") 
    Set header = body.CreateHeader("Content-Type") 
    Call header.SetHeaderValAndParams({multipart/alternative;boundary="=NextPart_="}) 
    'Add the to field 
    Set header = body.CreateHeader("To") 
    Call header.SetHeaderVal(SendTo) 

    'Add Subject Line 
    Set header = body.CreateHeader("Subject") 
    Call header.SetHeaderVal(subject) 

    'Add the body of the message 
    Set child = body.CreateChildEntity 

    Call stream.WriteText("<h1>Demo HTML Message</h1>") 
    Call stream.WriteText(|<table colspacing="0" colpadding="0" border="none">|) 
    Call stream.WriteText(|<tr><td>cell 1.1</td><td>cell 1.2</td><td>cell 1.3</td></tr>|) 
    Call stream.WriteText(|<tr><td>cell 2.1</td><td>cell 2.2</td><td>cell 2.3</td></tr>|) 
    Call stream.WriteText(|<tr><td>cell 3.1</td><td>cell 3.2</td><td>cell 3.3</td></tr>|) 
    Call stream.WriteText(|</table>|) 
    Call stream.WriteText(|<div class="headerlogo">|) 
    Call stream.WriteText(|<!-- ...some more HTML -->|) 

    Call child.setContentFromText(stream, {text/html;charset="iso-8859-1"}, ENC_NONE) 
    Call stream.Truncate 'Not sure if I need this 
    Call stream.Close 
    Call doc.CloseMIMEEntities(True) 
    Call doc.replaceItemValue("Form", "Memo") 
    Call doc.Send(False, sendTo) 


es: 
    Exit Sub 
eh: 
    Dim emsg$ 
    emsg = Error & " at " & Erl & " in " & s.Currentagent.name 
    Call alog.logError(Err, emsg) 
    MsgBox "ERROR: " & Err & ": " & emsg 
    Resume es 
End Sub 

所有这一切都应该很容易转换为VBA在Excel中。当然,您可以像使用HTML一样复杂。

Newbs

0

谢谢大家!

但是我发现正是我想要的,而无需重新创建整个电子邮件每次:

Sub EditSelectedMail() 
Dim NSession As Object 
Dim NDatabase As Object 
Dim NUIWorkspace As Object 
Dim NUIdoc As Object 

Set NSession = CreateObject("Notes.NotesSession") 
Set NUIWorkspace = CreateObject("Notes.NotesUIWorkspace") 
Set NDatabase = NSession.GetDatabase("", "") 
If Not NDatabase.IsOpen Then NDatabase.OPENMAIL 

Set NUIdoc = NUIWorkspace.EDITDOCUMENT(True) 
With NUIdoc 

    'Find the marker text in the Body item 
    .GotoField ("Body") 
    .FINDSTRING "**PASTE EXCEL CELLS HERE**" 

    'Copy Excel cells to clipboard 
    Sheets("Sheet1").Range("A1:E6").Copy 

    'Create a temporary Word Document 
    Set WordApp = CreateObject("Word.Application") 
    WordApp.Visible = False         
    WordApp.Documents.Add 

    'Paste into Word document and copy to clipboard 
    With WordApp.Selection 
     .PasteSpecial DataType:=10  
     'Enum WdPasteDataType: 10 = HTML; 2 = Text; 1 = RTF 
     .WholeStory 
     .Copy 
    End With 

    'Paste from clipboard (Word) to Lotus Notes document 
    .Paste 
    Application.CutCopyMode = False 

    'WordApp.Quit SaveChanges:=False 
    Set WordApp = Nothing 

End With 
End Sub 

我只选择我的“模板”,将其复制到一个新的消息,然后运行宏。

相关问题