Lync API:如何通过电子邮件地址发送即时消息给联系人?

时间:2012-09-25 10:30:52

标签: c# lync lync-2010

我有Lync用户的电子邮件地址,并希望向他发送即时消息。

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

截图 Lync problems 链接到大型屏幕截图:http://i.imgur.com/LMHEF.png

正如您在此屏幕截图中看到的,即使我能够手动搜索联系人并手动发送即时消息,我的程序似乎也无法正常工作。

我也尝试使用ContactManager.BeginSearch()代替ContactManager.GetContactByUri(),但得到了相同的结果(您可以在屏幕截图中看到):http://pastie.org/private/o9joyzvux4mkhzsjw1pioa

2 个答案:

答案 0 :(得分:6)

好的,所以我现在就开始工作了。它处于工作状态,虽然我需要做一些严肃的重构。

<强> 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;
        }
    }
}

答案 1 :(得分:3)

尝试使用以下代码,我的工作正常

protected void Page_Load(object sender, EventArgs e)
{ 
   SendLyncMessage();
}
private static void SendLyncMessage()
{
  string[] targetContactUris = {"sip:xxxx@domain.com"};
  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);
}