繁体   English   中英

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

[英]Trouble with sending emails with vba via IBM Notes

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

我感谢每一个提示和每一个帮助!

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

问题

“保存” function 不再起作用,即如果我不想要,IBM Notes 还会将电子邮件保存在“已发送”文件夹中(参数 blnSaveEMail = false)。

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

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

德累斯顿谢尔盖的热情问候

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

编码

    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 Session

    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
     

'创建新的 email

    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

'在前端打开 eMail 并分配给 NotesUIDocument 变量

    Set objCurrentEMail = objLotusNotes.EDITDOCUMENT(True, objEMail)
    

'将内容放入email

     objCurrentEMail.GotoField "Body"
     objCurrentEMail.InsertText strMessage 

'检查,email是否应该立即发送

    If blnQuickSend = True Then

'送email

        objCurrentEMail.Send

'如果需要,请保存 email

        If blnSaveEMail Then objCurrentEMail.Save
        

'关闭 email

        objCurrentEMail.Close
        
    End If

'返回真

    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

再次:评论是错误的。 该命令的作用是:它在前端打开您在后端创建的 email(由变量 objEMail 表示)。

'Select the current email
Set objCurrentEMail = objLotusNotes.CurrentDocument

并将其分配给 NotesUIDocument-frontend- 变量(选择当前的 email 是错误的)。 由于“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-Object“objCurrentEMail”使用 NotesDocument 后端方法“send”(具有 2 个参数)。NotesUIDocument 也有一个发送方法,但它没有任何参数..通常这里应该抛出一个错误......

您尝试发送后端:

objEMail.Send False, varRecipient

或者你在前端发送它:

objCurrentEMail.Send

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

objCurrentEMail.Save

收盘前。

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

非常感谢您的帮助。 我不擅长使用 NOTES-API。

我已尝试按照您的指示进行操作,但不幸的是问题仍然存在。

这是我的代码以及您的建议。 我想,我没有按正确的顺序放置代码行。 请你再看一遍好吗?

    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 Session

    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
     

'创建新的 email

    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

'在前端打开 eMail 并分配给 NotesUIDocument 变量

    Set objCurrentEMail = objLotusNotes.EDITDOCUMENT(True, objEMail)
    

'将内容放入email

     objCurrentEMail.GotoField "Body"
     objCurrentEMail.InsertText strMessage 

'检查,email是否应该立即发送

    If blnQuickSend = True Then

'送email

        objCurrentEMail.Send

'如果需要,请保存 email

        If blnSaveEMail Then objCurrentEMail.Save
        

'关闭 email

        objCurrentEMail.Close
        
    End If

'返回真

    Send_EMail = True
    

End Function

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM