none
【VSTO】Outlook 独自アドレス帳開発において RRS feed

  • 質問

  • お世話になっております。

    Outlook2016アドインとして、独自のアドレス帳を開発しております。

    社内(社員)と社外アドレスを別々のアドレス帳へ表示して利用したく、既存アドレス帳には、社員アドレス、

    独自アドレス帳には社外アドレスを一覧して、選択するようにします。

    基本的には、完成したのですが1点以下の内容が発生しております。

    例えば、新規メールを作成し、宛先へ社内アドレスを設定した後、独自アドレス帳から社外アドレスを設定すると、

    あらかじめ設定した社内アドレスに赤波下線が表示されます。

    因みに、社内アドレス帳には、途中まで同名が存在します。例)山田太郎と山田太郎(携帯)です。

    この状態で、リボンの名前グループにある”名前の確認”をクリックすると、どちらの山田太郎か?選択するように促されます。

    初めに社内アドレスを設定した時のどちらの山田太郎だったか記憶されていない(?)ようです。

    初めに指定したアドレスのままを維持したいのですが、どうしたら良いのでしょうか?

    【C#】

    ※独自フォーム(AddrForm)MailItem(myMailItem)は取得済みです。

    ※独自フォームは基本的に既存アドレス帳と同じ仕様にしています。

    private void AddrForm_Load(object sender, EventArgs e)
            {
                tx_To.Text = myMailItem.To; //メッセージフォームTOを独自フォームTOへセット
            }

    private void bt_OK_Click(object sender, EventArgs e)
            {
                myMailItem.To = myMailItem.To + "; " + tx_TO.Text; //独自フォームで指定された外部アドレスをメッセージフォームTOへセット
                this.Close();
            }

    【環境】

    VisualStudio2017 Enterprise、Outlook2016、Windows8.1

    よろしくお願い致します。

    2017年10月16日 9:42

回答

  • MailItem.Toにテキストで設定せずに、MailItem.Recipientsで追加してみては?

    以下VBAですがVSTOでも処理は同じはず

    Sub Test()
        Dim mail As MailItem
        On Error Resume Next
        Set mail = Application.ActiveInspector.CurrentItem
        
        If (Err.Number <> 0) Then
            Exit Sub
        End If
        On Error GoTo 0
    
        
        mail.To = "" 'テストのため宛先をすべて消す
        mail.CC = ""
        mail.BCC = ""
    
        Dim al As AddressList
        For Each al In Application.Session.AddressLists
            For Each address In al.AddressEntries
              
                If (Left(address.Name, 5) = "山田 太郎") Then 'すべてのアドレス帳で山田 太郎を探してみる
                
                    'To,CC,BCCを使わずにRecipientで追加してみる
                    Dim rec As Recipient
                    Set rec = mail.Recipients.Add(address.Name)
                    Set rec.AddressEntry = address
                    rec.Type = OlMailRecipientType.olTo
                    rec.Resolve
                End If
            Next
        Next
    
    End Sub

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年10月16日 11:30

すべての返信

  • MailItem.Toにテキストで設定せずに、MailItem.Recipientsで追加してみては?

    以下VBAですがVSTOでも処理は同じはず

    Sub Test()
        Dim mail As MailItem
        On Error Resume Next
        Set mail = Application.ActiveInspector.CurrentItem
        
        If (Err.Number <> 0) Then
            Exit Sub
        End If
        On Error GoTo 0
    
        
        mail.To = "" 'テストのため宛先をすべて消す
        mail.CC = ""
        mail.BCC = ""
    
        Dim al As AddressList
        For Each al In Application.Session.AddressLists
            For Each address In al.AddressEntries
              
                If (Left(address.Name, 5) = "山田 太郎") Then 'すべてのアドレス帳で山田 太郎を探してみる
                
                    'To,CC,BCCを使わずにRecipientで追加してみる
                    Dim rec As Recipient
                    Set rec = mail.Recipients.Add(address.Name)
                    Set rec.AddressEntry = address
                    rec.Type = OlMailRecipientType.olTo
                    rec.Resolve
                End If
            Next
        Next
    
    End Sub

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年10月16日 11:30
  • gekka様

    前回に引き続き、ありがとうございます。

    参考にさせて頂き実装してみます。

    結果報告をあらためてさせて頂きます。取り急ぎお礼まで。

    2017年10月17日 3:20
  • gekka様

    頂いた内容で実装してみました。

    独自アドレス帳から選択したアドレスや既に設定されていたアドレスが、

    想定通りの動作(表示)を確認できました。ありがとうございました。感謝します。

    ただ1点実装できなかったのが、今回の逆で既にメール宛先に設定されている場合、

    Windowsフォームにて作成した自作の「独自アドレス帳フォーム」(既存アドレス帳と同様なレイアウト)を

    開いたときも、そこにある宛先、CC、BCCフィールドに同様にセットしたかったのですが、

    アドレスがテキストになってしまい、アドレス帳チェック?(Resolve)が設定できませんでした。

    根本的に考え方が違うのかもしれません。

    返信で個人の方への質問のようになってしまい、申し訳ございません。


    • 編集済み Mitakana 2017年10月17日 9:55
    2017年10月17日 9:53