簡體   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