【问题标题】:Trouble with sending emails with vba via IBM Notes通过 IBM Notes 使用 vba 发送电子邮件时遇到问题
【发布时间】:2022-01-22 20:26:13
【问题描述】:

使用以下功能,我可以选择通过 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-Database

    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

'返回真

    Send_EMail = True
    

End Function

【问题讨论】:

    标签: excel vba email lotus-notes


    【解决方案1】:

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

    让我们从顶部开始:

    '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- 变量(选择当前电子邮件是错误的)。 由于“EDITDOCUMENT”已经作为 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 的 send- 方法,而不是 objCurrentEMail 的 send- 方法。 如果您希望前端不保存它发送的文档,您需要通过将名为“SAVEOPTIONS”的字段设置为“0”来做不同的事情:

    objEMail.ReplaceItemValue( "SAVEOPTIONS", "0" )
    
    
    'Send email
     objCurrentEMail.Send False, varRecipient
    

    关于您的评论:几乎...不幸的是,您尝试针对 NotesUIDocument-对象“objCurrentEMail”使用 NotesDocument 后端方法“send”(具有 2 个参数)。 NotesUIDocument 也有一个 send 方法,但是它没有任何参数..通常应该在这里抛出错误....

    您尝试发送后端:

    objEMail.Send False, varRecipient
    

    或者你在前端发送它:

    objCurrentEMail.Send
    

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

    objCurrentEMail.Save
    

    收盘前。

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

    【讨论】:

    • 您好 Tode,非常感谢。我已尝试按照您的指示将结果放入新的答案中。谢谢,谢尔盖
    • 你好 Tode,你能再看看更新的代码吗?我想我已经按照你的指示做了,但结果还是一样... :(
    猜你喜欢
    • 2017-07-19
    • 2017-07-19
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2017-12-11
    • 2012-04-06
    相关资源
    最近更新 更多