2009-08-17 17 views
11

私はVSTO Outlook addinをC#で書いています。指定されたMailItemが着信か発信かを区別する必要があります(たとえば、ドラフトの場合など)。Outlook MailItem:メールの着信と発信の区別方法を教えてください。

これを行う簡単な方法はありますか?私が今使っているベストソリューションは、受取人、CCとBCCのリストを取得し、アクティブなアカウントから電子メールのアドレスを読み込み、それらの2つのリストが交差しているかどうかを確認することですが、これはかなり壊れやすいようです。 。

使用例:ReceivedTimeまたはSentOnのいずれかのメールに関連する日付を取得したいのですが、どちらを使用するかを知るために、メールの送受信の有無を知ることができます。

はアイデアをありがとう:)

+0

、あなたはすべての受信者を確認する必要がありますかccでの、等またはあなただけの送信者を見ることができますか?アカウントの所有者が送信しなかった場合は、受信者になります。 –

+0

受信したメールもすべて送信されたわけではありませんか? – Roland

答えて

0

をMailItemの.Parentプロパティを見てみましょう - など、それは受信トレイであるかどうかを判断するために、フォルダのプロパティを調べ、送信トレイ、下書き、送信済みアイテム

+0

しかし、ユーザ(またはメールフィルタルール)が、受信メールと送信メールの両方で、ある一般的なフォルダ(たとえば、プロジェクトXYZのフォルダ)にメールを移動した場合はどうなりますか?その場合、着信/発信は、電子メールに固有のプロパティであり、フォルダではありません。 いいアイディアですが、これは私には起こりません:)。 –

+0

これは非常に良い質問です。私はその神の答えがありません。 –

-3

ましたMailItem.Sentプロパティを試してみますか?

着信の場合はtrue、発信の場合はfalseです。

+0

いいえ - Davidの回答を参照http://stackoverflow.com/questions/1285713/outlook-mailitem-how-to-distinguish-whe-mail-is-incoming-or-outgoing/2370543#2370543 –

2

私は同じ問題でここに来ました。私は明示的にユーザーが私のユースケース内のあるフォルダにメールを移動することを提案するので、親をチェックすることは役に立たないでしょう...

MailItem.Sentについて:MailItem.Sentはこのように動作しますか?私はちょうど私の受信トレイとSentItemsの両方を実行するための簡単なコードを書いて、それらのほとんどすべてが送信されたことは真です。私はこれが実際にメールが送信されたかどうかの表示(=草案ではない)...

1

MailItem.sentは着信の場合も同様です。

MailItem.ReceivedByEntryIDのチェックはいかがですか。しかし、Outlook Expressや他の電子メールプログラムからのインポートと言っても、これが失敗する(ReceivedByEntryIDは受信トレイのメールにはnullになる)と確信しています。

メールアカウント/ senderemailの反復は、

+0

ありがとう!これは、ほとんどのユーザーにとってはうまくいくかもしれません。多くのエンタープライズユーザーは、Outlook Expressから電子メールをインポートすることはできません(そうしても、Outlookの受信メール)。 –

0

Outlook.OlDefaultFolders.olFolderInboxまたはolFolderOutboxの中にあるかどうかを確認することができます。次に、これらのフォルダのいずれかに入っているかどうかを確認するための他の方法が必要です。

Outlook.Application _application = new Outlook.Application(); 
Outlook.MAPIFolder folder = _application.GetNamespace("MAPI").GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 
+0

私はこれが、別のフォルダに移動さ​​れた送受信メールでは機能しないと思います(フィルタなど)。 –

1

私は、電子メールが送信された後に新しいUserPropertyを追加することで、この問題を解決しました。だから私は電子メールが送信されたかどうかを確認する必要があるとき、私はこのプロパティをチェックします。これは、電子メールが[送信済み]フォルダから移動された場合でも機能します。もちろん、これは新しく作成された電子メールに対してのみ機能しますが、最初の起動時にこのプロパティを[送信済み]フォルダ内のすべての電子メールに追加できます。唯一の不具合は、UserPropertiesがデフォルトで印刷されることですが、これはoverriddenです。

+1

これはかなり重い解決策ですが、おそらくここではうまくいくでしょう。ただし、アドインは常に実行する必要があります。それ以外の場合は、受信メールが受信されません。最初に起動します。他のフォルダに移動した送信済みメールをマークすることはできません。たぶん、すべてのメールをスキャンし、受信者がユーザーの電子メールアドレスの1つであるかどうかを確認することは可能でしょうが、これは大規模なExchange/IMAPアカウントで数時間かかる場合があります... –

1

これはメールの種類を確認する方法で、メールが任意のフォルダに移動しても機能します。私はVBAで同じ問題を抱えていたため、このソリューションは、以下の見通し2007年に提供されていますPROPERTYアクセサがコード

string PR_MAIL_HEADER_TAG = "http://schemas.microsoft.com/mapi/proptag/0x007D001E"; 

Outlook.PropertyAccessor oPropAccessor = mItemProp.PropertyAccessor; 

string strHeader = (string)oPropAccessor.GetProperty(PR_MAIL_HEADER_TAG); 

if (strHeader == "") 
{ 
    // MAIL IS OF TYPE SENTBOX 
} 
else 
{ 
    // MAIL IS OF TYPE INBOX 
} 
+1

は2010年のatleastで動作しません – Kumar

+0

imap/smtpではなく2016 – Lakedaimon

17

で使用しています。このページに来ました。親フォルダを確認するのは面倒です。メッセージはいくつかのフォルダに保存することができます(したがって、複数のフォルダを繰り返し処理する必要があります)。または、フォルダを変更した可能性があります。極端な例:削除済みアイテムフォルダには、受信メールアイテムと送信メールアイテムの両方が含まれています。

私はReceivedByName(私は彼がReceivedEntryIDを選択したと思う)をチェックする上記の別の人(Adi Kini)と同様のソリューションを選択しました。 ReceivedByNameプロパティは、現在送信されている送信メッセージのNull( "")です。この方法では、受信ボックスにドラッグされた送信済みアイテムを見つけることができます。これはかなり信頼できる方法のようです。

メールが到着しているのか発信しているのかを確認するような明らかに簡単なことは、私たちを元気にすることができます。

+0

メールアドレスを割り当てられたパブリックフォルダによってメールアイテムが受信された場合、 'ReceivedByName'も' ReceivedEntryID'も値を持たないことに注意してください。 – cremor

0

SMTPアドレスによる簡単な送受信制御については、私はアドレスチェック手法を提案しています。それは、このような方法で行うことができます :

'Get mail address sender 
     Dim mailSender As String = GetSenderSMTPAddress(outMailItem) 

'Get current user mail address 
     Dim mailUser As String = OutlookMail2DocScriba.GetUserSMTPAddress(oNameSpace.CurrentUser.AddressEntry) 

     'If sender and current user matches is a sended mail, otherwise received 
     If String.Compare(mailSender, mailUser, True) = 0 Then 
      Return "Sended" 
     Else 
      Return "Received" 
     End If 





    Public Shared Function GetSenderSMTPAddress(ByVal mail As Outlook.MailItem) As String 
      'http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.oladdresslisttype.aspx 

      If mail Is Nothing Then 
       Throw New ArgumentNullException() 
      End If 
      If mail.SenderEmailType = "EX" Then 
       Dim sender As Outlook.AddressEntry = Nothing 

       Try 
        sender = mail.Sender 
       Catch ex As Exception 
        'Se non è stato in grado di reperire il sender (Outlook 2007), 
        'ignoro l'eccezione e procedo. 
       End Try 

       If sender IsNot Nothing Then 
        Return GetUserSMTPAddress(sender) 
       Else 
        Return Nothing 
       End If 
      Else 
       Return mail.SenderEmailAddress 
      End If 
     End Function 

     Public Shared Function GetUserSMTPAddress(ByVal sender As Outlook.AddressEntry) As String 
      'Now we have an AddressEntry representing the Sender 
      'http://msdn.microsoft.com/en-us/library/office/ff868214(v=office.15).aspx 
      Const EXCHANGE_USER_ADDRESS_ENTRY As Int32 = 0 
      Const EXCHANGE_REMOTE_USER_ADDRESS_ENTRY As Int32 = 5 
      Dim PR_SMTP_ADDRESS As String = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E" 

      If sender.AddressEntryUserType = EXCHANGE_USER_ADDRESS_ENTRY OrElse _ 
       sender.AddressEntryUserType = EXCHANGE_REMOTE_USER_ADDRESS_ENTRY Then 
       'Use the ExchangeUser object PrimarySMTPAddress 
       Dim exchUser As Object = sender.GetExchangeUser() 
       If exchUser IsNot Nothing Then 
        Return exchUser.PrimarySmtpAddress 
       Else 
        Return Nothing 
       End If 
      Else 
       Return TryCast(sender.PropertyAccessor.GetProperty(PR_SMTP_ADDRESS), String) 
      End If 
     End Function 
関連する問題