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