C# Lync API:如何通过电子邮件地址向联系人发送即时消息?
我有一个Lync用户的电子邮件地址,想给他发送一条即时消息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
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时未找到主机)我将首先研究此问题,因为这将解决问题。