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