2012-09-25 13 views
5

Ho l'indirizzo email di un utente Lync e voglio mandargli un messaggio istantaneo.API Lync: come inviare messaggi istantanei da contattare via e-mail?

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(); 
     } 
    } 
} 

Schermata Lync problems Link grande screenshot: http://i.imgur.com/LMHEF.png

Come si può vedere in questo screenshot, il mio programma non sembra veramente lavorare, anche se sono in grado di ricercare manualmente il contatto e invia un messaggio istantaneo manualmente.

Ho anche provato ad utilizzare ContactManager.BeginSearch() invece di ContactManager.GetContactByUri(), ma ho ottenuto lo stesso risultato (si può vedere nello screenshot): http://pastie.org/private/o9joyzvux4mkhzsjw1pioa

+0

non riesco a vedere nulla a stato perché non funziona, puoi abilitare i log di debug in l ync (impostazioni nella scheda generale ") e inserisci qui l'output – Neo

+0

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

+0

Proverò a confrontare il log da un tentativo riuscito (manuale) con il log dal mio C# non riuscito tentativo nel frattempo. –

risposta

6

Ok, così ho capito di lavoro ora. Ottenuto in uno stato di lavoro, anche se ho bisogno di fare qualche serio refactoring.

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

Prova Di seguito Codice relativo funzionamento benissimo per me

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

Grazie! Funziona anche per me! – derekantrican