。これは、ターゲットユーザーが組織のExchangeサーバー内で利用できないことが原因であるという疑いに基づいています。この解決策はが問題を解決するはずですが、もしそうでなければ、少なくとも次はどこを見なければならないかを知ることになります。
Private Const PR_SMTP_ADDRESS As String = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E"
Private Function GetSMTPAddressesForRecipients(ByVal MailItem As Outlook.MailItem) As Variant
Dim Recipients As Outlook.Recipients
Set Recipients = MailItem.Recipients
Dim Addresses As Variant
ReDim Addresses(0 To Recipients.Count - 1, 0 To 1)
Dim Accessor As Outlook.PropertyAccessor
Dim Recipient As Outlook.Recipient
For Each Recipient In Recipients
Set Accessor = Recipient.PropertyAccessor
Dim i As Long
Addresses(i, 0) = Recipient.Name
Addresses(i, 1) = Accessor.GetProperty(PR_SMTP_ADDRESS)
i = i + 1
Next
GetSMTPAddressesForRecipients = Addresses
End Function
これがループをすべての受信者によってメール内:それはアドレスユーザーとそのメールの配列を返すように
まず、私は、このMSDNの記事(https://msdn.microsoft.com/en-us/VBA/Outlook-VBA/articles/obtain-the-e-mail-address-of-a-recipient)からのコード例を取って、それを修正しましたそれらの名前と電子メールをキャプチャし、それぞれをアレイ内の次の場所に配置します。次に、あなたのルーチン内でこの情報を使用する必要があります:
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
' Note that I explicitly convert the subject to lowercase since the patterns use lowercase
Dim EmailSubject As String
EmailSubject = LCase(Item.Subject)
If EmailSubject Like "*update*" Or EmailSubject Like "*revision*" Then
Dim Addresses As Variant
Addresses = GetSMTPAddressesForRecipients(Item)
Dim i As Long
For i = LBound(Addresses, 1) To UBound(Addresses, 1)
If Addresses(i, 1) = "[email protected]" Then
MsgBox "Dont forget to update Drawing PDF`s if necessary", vbExclamation, "Have you updated the PDF`s?"
Exit For
End If
Next
End If
End Sub
ここで注意するべきことがいくつかあります。まず、あなたのパターンがサブジェクトに小文字を使用していたので、サブジェクトを小文字に変換して、 "リビジョンを更新"のようなテーマがある場合、パターンはまだそれをキャッチします。
第2に、最も可能性の高い条件を前に付けます。つまり、電子メールの件名のほとんどに「件名」または「改訂」が含まれません。受信者のアドレスをサーバに問い合わせる必要はありません。以前は、コードが必要かどうかを確認する前に、コードがアドレスを取得していました。必要なものだけを尋ねるのが最善で、コードを読みやすくして維持し、処理コストを削減します。
最後に、このコードはすべてののアドレスをループし、最初のアドレスだけではありません。これにより、リストの2番目、3番目、50番目のアドレスであってもアラートがトリガーされます。
こちらがお役に立てば幸いです。完全なコードは次のとおりです。
Option Explicit
Private Const PR_SMTP_ADDRESS As String = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E"
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
' Note that I explicitly convert the subject to lowercase since the patterns use lowercase
Dim EmailSubject As String
EmailSubject = LCase(Item.Subject)
If EmailSubject Like "*update*" Or EmailSubject Like "*revision*" Then
Dim Addresses As Variant
Addresses = GetSMTPAddressesForRecipients(Item)
Dim i As Long
For i = LBound(Addresses, 1) To UBound(Addresses, 1)
If Addresses(i, 1) = "[email protected]" Then
MsgBox "Dont forget to update Drawing PDF`s if necessary", vbExclamation, "Have you updated the PDF`s?"
Exit For
End If
Next
End If
End Sub
Private Function GetSMTPAddressesForRecipients(ByVal MailItem As Outlook.MailItem) As Variant
Dim Recipients As Outlook.Recipients
Set Recipients = MailItem.Recipients
Dim Addresses As Variant
ReDim Addresses(0 To Recipients.Count - 1, 0 To 1)
Dim Accessor As Outlook.PropertyAccessor
Dim Recipient As Outlook.Recipient
For Each Recipient In Recipients
Set Accessor = Recipient.PropertyAccessor
Dim i As Long
Addresses(i, 0) = Recipient.Name
Addresses(i, 1) = Accessor.GetProperty(PR_SMTP_ADDRESS)
i = i + 1
Next
GetSMTPAddressesForRecipients = Addresses
End Function
正確に何が起こるかを明確にすることはできますか?電子メールを認識できないのですか、それともエラーになっていますか?あなたは彼の電子メールから期待していたアドレスを取得していることを確認するためにあなたの 'hisemail'をテストしようとしましたか?私は、コードが何を見ているかを見ることができるように、電子メールを具体的に印刷するための簡単なスクリプトを書くことをお勧めします。 –
また、彼の電子メールはExchangeサーバ内にないかもしれないので、あなたは自分の「PrimarySmtpAddress」をそのように得ることはできません。これはおそらくあなたの内部電子メールのほとんどと外部電子メールの一部が動作している理由です。代わりに 'To'フィールドにアクセスしてみてください。または、別のプロパティからメールを受け取ることができるかどうかを確認してください。 –
こんにちは、申し訳ありませんが、エラーメッセージはありません。電子メールはメッセージボックスを表示して送信します。私はちょうどメッセージボックスにhismailを送信しようとしました。それは私の電子メールアドレスで正常に動作し、正しいアドレスを返しましたが、 '私は'に送信しようとしているアドレスは、 "実行時エラー91:オブジェクト変数またはブロック変数が設定されていません" = olObj.Recipients.Item(1).AddressEntry.GetExchangeUser.PrimarySmtpAddress – mike