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

C# Lync API:如何通过电子邮件地址向联系人发送即时消息?,c#,lync,lync-2010,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_Notif

我有一个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();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用Microsoft.Lync.Model;
使用Microsoft.Lync.Model.Conversation;
命名空间生成\u服务器\u Lync\u通知程序
{
班级计划
{
静态void Main(字符串[]参数)
{
如果(参数长度!=2)
{
Console.WriteLine(“用法:bsln.exe”);
返回;
}
LyncClient=Microsoft.Lync.Model.LyncClient.GetClient();
Contact-Contact=client.ContactManager.GetContactByUri(args[0]);
Conversation Conversation=client.ConversationManager.AddConversation();
对话。添加参与者(联系人);
字典消息=新建字典();
Add(InstantMessageContentType.PlainText,args[1]);
InstantMessageModality m=(InstantMessageModality)conversation.modules[ModalityTypes.InstantMessage];
m、 BeginSendMessage(messages,null,messages);
//Console.Read();
}
}
}
屏幕截图 链接到大屏幕截图:

正如您在这个屏幕截图中看到的,我的程序似乎真的不起作用,即使我能够手动搜索联系人并手动发送即时消息


我还尝试使用
ContactManager.BeginSearch()
而不是
ContactManager.GetContactByUri()
,但得到了相同的结果(您可以在屏幕截图中看到):

好的,所以我现在就开始工作了。使它处于工作状态,尽管我需要进行一些认真的重构

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);
            }
        }
    }
}
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;
        }
    }
}
使用系统;
命名空间生成\u服务器\u Lync\u通知程序
{
班级计划
{
静态void Main(字符串[]参数)
{
如果(参数长度!=2)
{
Console.WriteLine(“用法:bsln.exe”);
返回;
}
LynchManager lm=新的LynchManager(参数[0],参数[1]);
而(!lm.Done)
{
系统.线程.线程.睡眠(500);
}
}
}
}
LynchManager.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);
            }
        }
    }
}
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;
        }
    }
}
使用Microsoft.Lync.Model;
使用Microsoft.Lync.Model.Conversation;
使用制度;
使用System.Collections.Generic;
命名空间生成\u服务器\u Lync\u通知程序
{
类LynchManager
{
私有字符串uri;
私有字符串消息;
私人客户(私家客户);;
私人谈话;
private bool_done=false;
公共广播结束了
{
获取{return\u done;}
}
public LynchManager(字符串arg0、字符串arg1)
{
_uri=arg0;
_消息=arg1;
_client=Microsoft.Lync.Model.LyncClient.GetClient();
_client.ContactManager.BeginSearch(
_乌里,
SearchProviders.GlobalAddressList,
SearchFields.EmailAddresss,
SearchOptions.Contacts仅,
2.
BeginSearchCallback,
新对象[]{{u client.ContactManager,{u uri}
);
}
私有void BeginSearchCallback(IAsyncResult r)
{
对象[]异步状态=(对象[])r.asyncState;
ContactManager cm=(ContactManager)异步状态[0];
尝试
{
SearchResults=cm.EndSearch(r);
if(results.AllResults.Count==0)
{
控制台。WriteLine(“无结果”);
}
else if(results.AllResults.Count==1)
{
ContactSubscription srs=cm.CreateSubscription();
联系人=结果。联系人[0];
srs.AddContact(contact);
ContactInformationType[]ContactInformationType={ContactInformationType.Availability,ContactInformationType.ActivityId};
srs.Subscribe(ContactSubscriptionRefreshRate.High,contactInformationTypes);
_conversation=_client.ConversationManager.AddConversation();
_对话。添加参与者(联系人);
字典消息=新建字典();
messages.Add(InstantMessageContentType.PlainText,_message);
InstantMessageModality m=(InstantMessageModality)_conversation.modules[modalitypes.InstantMessage];
m、 BeginSendMessage(消息、BeginSendMessageCallback、消息);
}
其他的
{
Console.WriteLine(“多个结果”);
}
}
捕获(SearchException)
{
Console.WriteLine(“搜索失败:+se.Reason.ToString());
}
_client.ContactManager.EndSearch(r);
}
私有void BeginSendMessageCallback(IAsyncResult r)
{
_会话结束();
_完成=正确;
}
}
}

试试下面的代码对我来说很好

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

我看不到任何东西来说明它为什么不工作,您能在lync中启用调试日志(设置在“常规”选项卡下)并将输出here@Neo我将尝试比较成功(手动)的日志尝试使用我的C#中的日志,同时尝试失败。这里有一些错误对我来说没有任何意义,但看起来有点可疑,因为消息没有发送,它说消息与SIP数据或主机不匹配(2012年9月26日| 20:26:20.335 16E8:1488错误::SIP_URL::InternalInitialize在解析SIP URL时未找到主机)我将首先研究此问题,因为这将解决问题。