通过 IBM Notes 使用 vba 发送电子邮件时遇到问题

Trouble with sending emails with vba via IBM Notes

使用下面的功能,我可以选择通过 IBM Notes 从 Excel 发送电子邮件。基本上,它工作得很好。但是,我最近不得不修改代码,因为消息文本总是插入到 IBM Notes 签名下。我能够解决这个问题,但不幸的是现在出现了两个我以前没有遇到过的问题。

我很感激每一个提示和每一个帮助!

UPDATE 21.12.2021 21:30: @Tode 我已经按照您的指示进行操作,但问题仍然存在。可能是我没有按正确的顺序排列代码行?

问题

“保存”功能不再有效,即如果我不想要,IBM Notes 也会将电子邮件保存在“已发送”文件夹中(参数 blnSaveEMail = false)。

第二个问题与我的工作环境有关:我有两个电子邮件帐户。个人服务电子邮件地址 jdoe@company.com(邮件文件:jdoe.nsf)和分支机构电子邮件地址 mybranch@company.de(邮件文件:mybranch.nsf)。据我所知,这两个邮件文件都在同一个基本目录中。如果我将下面的代码用于我的个人电子邮件,参数 blnQuickSend = true 可以正常工作,如果我使用我的分支电子邮件地址,IBM Notes 会询问我是否要保存更改,尽管我想发送一封电子邮件,无需询问。

我希望我能够清楚易懂地描述我的问题。感谢您的关注!

来自德累斯顿的热烈问候 谢尔盖

PS:我是德国人 :),谢天谢地 Google 帮了我很多,把我的问题翻译成了英文。

代码

    Public Function Send_EMail( _
    varRecipient As Variant, _
    varCopyTo As Variant, _
    varBlindcopyTo As Variant, _
    strSubject As String, _
    strMessage As String, _
    strAttachement As String, _
    Optional blnSaveEMail As Boolean = True, _
    Optional blnQuickSend As Boolean = False, _
    Optional strAlternative_Mailfile As String _
        ) As Boolean
 
    Dim objLotusNotes As Object
    Dim objMaildatabase As Object 'Die Maildatabase
    Dim strMailServer As String 'Der Mailserver
    Dim strMailFile As String ' Die Maildatei
    Dim objEMail As Object 'Die E-Mail in IBM Notes
    Dim objAttachement As Object 'Das Anlage Richtextfile Object
    Dim objSession As Object 'Die Notes Session
    Dim objEmbedded As Object 'Attachement
    Dim arrAttachements() As String 'Liste mehrere Anhänge
    Dim lngIndex As Long
    Dim strFilepath As String
    Dim objNotesfield As Object 'Datenfeld in IBM Notes
    Dim objCurrentEMail As Object 'Aktuelle E-Mail
          

'启动 IBM Notes 会话

    Set objSession = CreateObject("Notes.NotesSession")
     

'打开 IBM-Notes-数据库

    strMailServer = objSession.GetEnvironmentString("MailServer", True)
    
    If VBA.Len(strAlternative_Mailfile) = 0 Then
        strMailFile = objSession.GetEnvironmentString("MailFile", True)
    Else
        strMailFile = "mail/" & strAlternative_Mailfile
    End If
    
    Set objMaildatabase = objSession.GETDATABASE(strMailServer, strMailFile)

'如果你构造的路径(变量strMailFile)错误或者无法访问数据库 '然后这一行将确保回退到 Notes 客户端中您的位置文档中配置的邮件文件。

    If Not objMaildatabase.IsOpen Then objMaildatabase.OPENMAIL
     

'创建新邮件

    Set objEMail = objMaildatabase.CREATEDOCUMENT

'设置保存选项

    objEMail.ReplaceItemValue "SAVEOPTIONS", "0"

'将内容放入字段

    Set objNotesfield = objEMail.APPENDITEMVALUE("Subject", strSubject)
    Set objNotesfield = objEMail.APPENDITEMVALUE("SendTo", varRecipient)
    Set objNotesfield = objEMail.APPENDITEMVALUE("BlindCopyTo", varBlindcopyTo)
    Set objNotesfield = objEMail.APPENDITEMVALUE("CopyTo", varCopyTo)
    

'加载工作空间

    Set objLotusNotes = CreateObject("Notes.NotesUIWorkspace")
     

'添加附件

    arrAttachements = VBA.Split(strAttachement, ";")
     
    For lngIndex = LBound(arrAttachements) To UBound(arrAttachements)
        strFilepath = arrAttachements(lngIndex)
        If strFilepath <> "" And VBA.Dir(strFilepath) <> "" Then
            Set objAttachement = objEMail.CREATERICHTEXTITEM("Attachment" & lngIndex)
            Set objEmbedded = _
                objAttachement.EMBEDOBJECT(1454, "", strFilepath, "Attachment" & lngIndex)
        End If
    Next

'在前端打开电子邮件并分配给 NotesUIDocument 变量

    Set objCurrentEMail = objLotusNotes.EDITDOCUMENT(True, objEMail)
    

'将内容放入邮件

     objCurrentEMail.GotoField "Body"
     objCurrentEMail.InsertText strMessage 

'检查是否应立即发送电子邮件

    If blnQuickSend = True Then

'发送邮件

        objCurrentEMail.Send

'保存电子邮件,如果需要

        If blnSaveEMail Then objCurrentEMail.Save
        

'关闭邮件

        objCurrentEMail.Close
        
    End If

'Return 真

    Send_EMail = True
    

End Function

好的...我应该从哪里开始...由于不理解您使用的方法以及前端和后端之间的区别,您的代码中存在一些逻辑错误类...

让我们从头开始:

'Check whether the maildatabase is open or not 'Throws an error, 
'if the database is not open
If Not objMaildatabase.IsOpen Then objMaildatabase.OPENMAIL

您的评论有误。根本不会抛出任何错误。如果您构造的路径(变量 strMailFile)错误或无法访问数据库,那么此行将确保回退到在 Notes 客户端中的位置文档中配置的邮件文件。

'Create new email-document
objLotusNotes.EDITDOCUMENT True, objEMail

再次声明:评论有误。此命令的作用是:它在前端打开您在后端创建的电子邮件(由变量 objEMail 表示)。

'Select the current email
Set objCurrentEMail = objLotusNotes.CurrentDocument

并将其分配给 NotesUIDocument-frontend- 变量(select 当前电子邮件是错误的)。 由于“EDITDOCUMENT”已经 returns 作为 NotesUIDocument,您可以这样缩短它:

'Open eMail in frontend and assign to NotesUIDocument variable
Set objCurrentEMail = objLotusNotes.EDITDOCUMENT(True, objEMail)

创建前端文档后,您仍然可以继续操作(现在链接的)后端文档。您应该将前端的创建一直移动到代码的末尾,因为在前端打开文档与在后端操作同一文档效果不佳,尤其是在处理 NotesRichtextItems 和附件时。因此,将以上几行移动到 for 循环的正下方。

'Set if email should be saved or not
objEMail.SAVEMESSAGEONSEND = blnSaveEMail

是...但不是:您将 属性 SAVEMESSAGEONSEND 设置为后端文档 objEMail。不幸的是,前端文档 objCurrentEMail 根本不关心这个。要让您的代码遵循此选项,您必须使用 objEMail 的发送方法,而不是 objCurrentEMail 的发送方法。 如果您希望前端不保存它发送的文档,您需要通过将名为“SAVEOPTIONS”的字段设置为“0”来进行不同的操作:

objEMail.ReplaceItemValue( "SAVEOPTIONS", "0" )


'Send email
 objCurrentEMail.Send False, varRecipient

关于您的评论:几乎...不幸的是,您针对 NotesUIDocument 对象“objCurrentEMail. NotesUIDocument 也有一个 send 方法,但它没有任何参数..通常这里应该抛出一个错误....

要么你尝试发送后端:

objEMail.Send False, varRecipient

或者您在前端发送:

objCurrentEMail.Send

您的“objCurrentEMail.Close”将始终询问您是否要保存文档,除非您已设置 SAVEOPTIONS =“0”。如果你真的想在发送后保存文件,使用

objCurrentEMail.Save

收盘前。

希望能帮助您解决一些问题。