Excel VBA 使用 IBM Notes 更改发件人电子邮件地址?
Excel VBA Change From email address with IBM Notes?
我有以下 vba 代码,它使用 IBM Notes 从 excel 发送电子邮件。
但是,我希望能够更改发件人地址。
请问有人可以告诉我哪里出错了吗?
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("M:M")) Is Nothing Then
If Target.Cells.Count < 3 Then
'Set up the objects required for Automation into lotus notes
Dim Ref As String
Dim TrueRef As String
Ref = Range("H" & (ActiveCell.Row)).Value
If Ref = "WSM" Then
TrueRef = "WES"
Else
If Ref = "NAY" Then
TrueRef = "NAY"
Else
If Ref = "ENF" Then
TrueRef = "ENF"
Else
If Ref = "LUT" Then
TrueRef = "MAG"
Else
If Ref = "NFL" Then
TrueRef = "NOR"
Else
If Ref = "RUN" Then
TrueRef = "RUN"
Else
If Ref = "SOU" Then
TrueRef = "SOU"
Else
If Ref = "SOU" Then
TrueRef = "SOU"
Else
If Ref = "BRI" Then
TrueRef = "BRI"
Else
If Ref = "LIV" Then
TrueRef = "LIV"
Else
If Ref = "BEL" Then
TrueRef = "BEL"
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
''''''''''''''''''''''''''''''''''
Dim nMailBody As String
Dim nMailSubject As String
Dim nMailRecipient As Variant
Dim nMail As Object
Dim nSession As Object
Dim nDatabase As Object
Dim nMime As Object
Dim nMailStream As Object
Dim nChild As Object
Dim nSomeMailBodyText As String
Dim amountOfRecipients As Integer
nSomeMailBodyText = "<p>Hello,</p><br><p>How are you?</p>"
nMailSubject = "A great email"
Set nSession = CreateObject("Notes.NotesSession")
Set nDatabase = nSession.GETDATABASE("", "")
Call nDatabase.OPENMAIL
Set nMail = nDatabase.CREATEDOCUMENT
nMail.Principal = "bogus_user@example.com"
nMail.SendTo = "mark.obrien@lidl.co.uk"
nMail.subject = "This is test"
nSession.CONVERTMIME = False
Set nMime = nMail.CREATEMIMEENTITY
Set nMailStream = nSession.CREATESTREAM
'vBody contient le texte au format Html
Call nMailStream.WRITETEXT(nSomeMailBodyText)
Call nMailStream.WRITETEXT(" - and again - ")
Call nMailStream.WRITETEXT(nSomeMailBodyText)
Call nMailStream.WRITETEXT("<br>")
Call nMailStream.WRITETEXT("<br>")
'----- READ AND PASTE SIGNATURE -------------------------------------
'Get the standard signature location
nSignatureLocation = nDatabase.GETPROFILEDOCUMENT("CalendarProfile").GETITEMVALUE("Signature")(0)
Set nChild = nMime.CREATECHILDENTITY
Call nChild.SETCONTENTFROMTEXT(nMailStream, "text/html;charset=iso-8859-1", ENC_NONE)
Call nMailStream.Close
nSession.CONVERTMIME = True
'Send the document
nMail.PostedDate = Now() 'Gets the mail to appear in the sent items folder
nMail.SEND 0, Recipient
End If
End If
End Sub
NotesDocument.Send 方法不允许经过身份验证的人欺骗发件人的发件人地址。 Domino 服务器上的代码 运行ning 可以做到这一点,但您的代码是作为客户端连接的。
有两种解决方法。我会提到第一个,但必须告诉您它不受 IBM 支持并且不推荐使用 - 特别是对于新手 Notes 开发人员。它涉及将文档直接写入 Domino 路由器邮箱 (mail.box) 而不是使用 NotesDocument.Send 方法。
第二种方法是使用 Domino 服务器上 运行 的代码来发送电子邮件。一种方法是让您的代码将 NotesDocument 保存在 Domino 服务器上的一个数据库中,并在该数据库中设置一个后台代理,每当创建新文档时该代理都设置为 运行。代理中的代码将设置 Principal 字段,我看到您已经尝试过 - 但正如我上面所说,当 运行 在客户端代码中使用 NotesDocument.send 时,它不起作用。还有很多其他方法。
正如理查德已经说过的,除非您使用未记录的方法,否则您不能像那样从客户端欺骗发件人。我有一个用于邮件通知的注释 class(可以在我的博客上找到),但 Richard 是正确的,因为你是初学者(根据你发布的代码,这很清楚)可能不应该尝试使用该方法.
附带说明一下,为什么要使用如此复杂的方式来设置 TrueRef 的值?
不能使用 Select Case 语句吗?或者甚至只是简化您的代码:
TrueRef = Ref
If Ref = "WSM" Then
TrueRef = "WES"
ElseIf Ref = "LUT" Then
TrueRef = "MAG"
ElseIf Ref = "NFL" Then
TrueRef = "NOR"
End If
或
If Ref = "WSM" Then
TrueRef = "WES"
ElseIf Ref = "LUT" Then
TrueRef = "MAG"
ElseIf Ref = "NFL" Then
TrueRef = "NOR"
Else
TrueRef = Ref
End If
我有以下 vba 代码,它使用 IBM Notes 从 excel 发送电子邮件。
但是,我希望能够更改发件人地址。 请问有人可以告诉我哪里出错了吗?
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("M:M")) Is Nothing Then
If Target.Cells.Count < 3 Then
'Set up the objects required for Automation into lotus notes
Dim Ref As String
Dim TrueRef As String
Ref = Range("H" & (ActiveCell.Row)).Value
If Ref = "WSM" Then
TrueRef = "WES"
Else
If Ref = "NAY" Then
TrueRef = "NAY"
Else
If Ref = "ENF" Then
TrueRef = "ENF"
Else
If Ref = "LUT" Then
TrueRef = "MAG"
Else
If Ref = "NFL" Then
TrueRef = "NOR"
Else
If Ref = "RUN" Then
TrueRef = "RUN"
Else
If Ref = "SOU" Then
TrueRef = "SOU"
Else
If Ref = "SOU" Then
TrueRef = "SOU"
Else
If Ref = "BRI" Then
TrueRef = "BRI"
Else
If Ref = "LIV" Then
TrueRef = "LIV"
Else
If Ref = "BEL" Then
TrueRef = "BEL"
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
''''''''''''''''''''''''''''''''''
Dim nMailBody As String
Dim nMailSubject As String
Dim nMailRecipient As Variant
Dim nMail As Object
Dim nSession As Object
Dim nDatabase As Object
Dim nMime As Object
Dim nMailStream As Object
Dim nChild As Object
Dim nSomeMailBodyText As String
Dim amountOfRecipients As Integer
nSomeMailBodyText = "<p>Hello,</p><br><p>How are you?</p>"
nMailSubject = "A great email"
Set nSession = CreateObject("Notes.NotesSession")
Set nDatabase = nSession.GETDATABASE("", "")
Call nDatabase.OPENMAIL
Set nMail = nDatabase.CREATEDOCUMENT
nMail.Principal = "bogus_user@example.com"
nMail.SendTo = "mark.obrien@lidl.co.uk"
nMail.subject = "This is test"
nSession.CONVERTMIME = False
Set nMime = nMail.CREATEMIMEENTITY
Set nMailStream = nSession.CREATESTREAM
'vBody contient le texte au format Html
Call nMailStream.WRITETEXT(nSomeMailBodyText)
Call nMailStream.WRITETEXT(" - and again - ")
Call nMailStream.WRITETEXT(nSomeMailBodyText)
Call nMailStream.WRITETEXT("<br>")
Call nMailStream.WRITETEXT("<br>")
'----- READ AND PASTE SIGNATURE -------------------------------------
'Get the standard signature location
nSignatureLocation = nDatabase.GETPROFILEDOCUMENT("CalendarProfile").GETITEMVALUE("Signature")(0)
Set nChild = nMime.CREATECHILDENTITY
Call nChild.SETCONTENTFROMTEXT(nMailStream, "text/html;charset=iso-8859-1", ENC_NONE)
Call nMailStream.Close
nSession.CONVERTMIME = True
'Send the document
nMail.PostedDate = Now() 'Gets the mail to appear in the sent items folder
nMail.SEND 0, Recipient
End If
End If
End Sub
NotesDocument.Send 方法不允许经过身份验证的人欺骗发件人的发件人地址。 Domino 服务器上的代码 运行ning 可以做到这一点,但您的代码是作为客户端连接的。
有两种解决方法。我会提到第一个,但必须告诉您它不受 IBM 支持并且不推荐使用 - 特别是对于新手 Notes 开发人员。它涉及将文档直接写入 Domino 路由器邮箱 (mail.box) 而不是使用 NotesDocument.Send 方法。
第二种方法是使用 Domino 服务器上 运行 的代码来发送电子邮件。一种方法是让您的代码将 NotesDocument 保存在 Domino 服务器上的一个数据库中,并在该数据库中设置一个后台代理,每当创建新文档时该代理都设置为 运行。代理中的代码将设置 Principal 字段,我看到您已经尝试过 - 但正如我上面所说,当 运行 在客户端代码中使用 NotesDocument.send 时,它不起作用。还有很多其他方法。
正如理查德已经说过的,除非您使用未记录的方法,否则您不能像那样从客户端欺骗发件人。我有一个用于邮件通知的注释 class(可以在我的博客上找到),但 Richard 是正确的,因为你是初学者(根据你发布的代码,这很清楚)可能不应该尝试使用该方法.
附带说明一下,为什么要使用如此复杂的方式来设置 TrueRef 的值? 不能使用 Select Case 语句吗?或者甚至只是简化您的代码:
TrueRef = Ref
If Ref = "WSM" Then
TrueRef = "WES"
ElseIf Ref = "LUT" Then
TrueRef = "MAG"
ElseIf Ref = "NFL" Then
TrueRef = "NOR"
End If
或
If Ref = "WSM" Then
TrueRef = "WES"
ElseIf Ref = "LUT" Then
TrueRef = "MAG"
ElseIf Ref = "NFL" Then
TrueRef = "NOR"
Else
TrueRef = Ref
End If