[英]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.