2012-09-25 4 views
5

Ich habe die E-Mail-Adresse eines Lync-Benutzers und möchte ihm eine Sofortnachricht senden.Lync-API: So senden Sie eine Sofortnachricht an einen Kontakt per E-Mail-Adresse?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Microsoft.Lync.Model; 
using Microsoft.Lync.Model.Conversation; 


namespace Build_Server_Lync_Notifier 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args.Length != 2) 
      { 
       Console.WriteLine("Usage: bsln.exe <uri> <message>"); 
       return; 
      } 

      LyncClient client = Microsoft.Lync.Model.LyncClient.GetClient(); 
      Contact contact = client.ContactManager.GetContactByUri(args[0]); 

      Conversation conversation = client.ConversationManager.AddConversation(); 
      conversation.AddParticipant(contact); 

      Dictionary<InstantMessageContentType, String> messages = new Dictionary<InstantMessageContentType, String>(); 
      messages.Add(InstantMessageContentType.PlainText, args[1]); 

      InstantMessageModality m = (InstantMessageModality) conversation.Modalities[ModalityTypes.InstantMessage]; 
      m.BeginSendMessage(messages, null, messages); 

      //Console.Read(); 
     } 
    } 
} 

Screenshot Lync problems Link zu großen Screenshot: http://i.imgur.com/LMHEF.png

Wie Sie in diesem Screenshot sehen kann, hat mein Programm nicht wirklich zu funktionieren scheint, auch wenn ich in der Lage bin manuell zu suchen den Kontakt auf und senden Sie eine Sofortnachricht manuell.

Ich habe auch versucht ContactManager.BeginSearch() statt ContactManager.GetContactByUri() verwenden, bekam aber das gleiche Ergebnis (Sie im Screenshot sehen): http://pastie.org/private/o9joyzvux4mkhzsjw1pioa

+0

Ich kann nichts zu Zustand sehen warum es nicht funktioniert, können Sie Debug-Protokolle in l aktivieren ync (Einstellungen unter General "tab") und setzen Sie die Ausgabe hier – Neo

+0

@ Neo http://pastie.org/private/igdb3rgsdjfmujyl2j7q –

+0

Ich werde versuchen, das Protokoll von einem erfolgreichen (manuellen) Versuch mit dem Protokoll von meinem C# fehlgeschlagen zu vergleichen Versuch in der Zwischenzeit. –

Antwort

6

Ok, also ich habe es funktioniert jetzt. Habe es in einem funktionierenden Zustand, obwohl ich ein paar ernsthafte Refactoring machen muss.

Program.cs

using System; 

namespace Build_Server_Lync_Notifier 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args.Length != 2) 
      { 
       Console.WriteLine("Usage: bsln.exe <uri> <message>"); 
       return; 
      } 

      LyncManager lm = new LyncManager(args[0], args[1]); 

      while (!lm.Done) 
      { 
       System.Threading.Thread.Sleep(500); 
      } 
     } 
    } 
} 

LyncManager.cs

using Microsoft.Lync.Model; 
using Microsoft.Lync.Model.Conversation; 
using System; 
using System.Collections.Generic; 

namespace Build_Server_Lync_Notifier 
{ 
    class LyncManager 
    { 
     private string _uri; 
     private string _message; 
     private LyncClient _client; 
     private Conversation _conversation; 

     private bool _done = false; 
     public bool Done 
     { 
      get { return _done; } 
     } 

     public LyncManager(string arg0, string arg1) 
     { 
      _uri = arg0; 
      _message = arg1; 
      _client = Microsoft.Lync.Model.LyncClient.GetClient(); 
      _client.ContactManager.BeginSearch(
       _uri, 
       SearchProviders.GlobalAddressList, 
       SearchFields.EmailAddresses, 
       SearchOptions.ContactsOnly, 
       2, 
       BeginSearchCallback, 
       new object[] { _client.ContactManager, _uri } 
      ); 
     } 

     private void BeginSearchCallback(IAsyncResult r) 
     { 
      object[] asyncState = (object[]) r.AsyncState; 
      ContactManager cm = (ContactManager) asyncState[0]; 
      try 
      { 
       SearchResults results = cm.EndSearch(r); 
       if (results.AllResults.Count == 0) 
       { 
        Console.WriteLine("No results."); 
       } 
       else if (results.AllResults.Count == 1) 
       { 
        ContactSubscription srs = cm.CreateSubscription(); 
        Contact contact = results.Contacts[0]; 
        srs.AddContact(contact); 
        ContactInformationType[] contactInformationTypes = { ContactInformationType.Availability, ContactInformationType.ActivityId }; 
        srs.Subscribe(ContactSubscriptionRefreshRate.High, contactInformationTypes); 
        _conversation = _client.ConversationManager.AddConversation(); 
        _conversation.AddParticipant(contact); 
        Dictionary<InstantMessageContentType, String> messages = new Dictionary<InstantMessageContentType, String>(); 
        messages.Add(InstantMessageContentType.PlainText, _message); 
        InstantMessageModality m = (InstantMessageModality)_conversation.Modalities[ModalityTypes.InstantMessage]; 
        m.BeginSendMessage(messages, BeginSendMessageCallback, messages); 
       } 
       else 
       { 
        Console.WriteLine("More than one result."); 
       } 
      } 
      catch (SearchException se) 
      { 
       Console.WriteLine("Search failed: " + se.Reason.ToString()); 
      } 
      _client.ContactManager.EndSearch(r); 
     } 

     private void BeginSendMessageCallback(IAsyncResult r) 
     { 
      _conversation.End(); 
      _done = true; 
     } 
    } 
} 
3

Below Code Versuchen seine Arbeit gut für mich

protected void Page_Load(object sender, EventArgs e) 
{ 
    SendLyncMessage(); 
} 
private static void SendLyncMessage() 
{ 
    string[] targetContactUris = {"sip:[email protected]"}; 
    LyncClient client = LyncClient.GetClient(); 
    Conversation conv = client.ConversationManager.AddConversation(); 

    foreach (string target in targetContactUris) 
    { 
    conv.AddParticipant(client.ContactManager.GetContactByUri(target)); 
    } 
    InstantMessageModality m = conv.Modalities[ModalityTypes.InstantMessage] as InstantMessageModality; 
    m.BeginSendMessage("Test Message", null, null); 
} 
+0

Danke! Das funktioniert auch für mich! – derekantrican