#c# #outlook #vsto
Вопрос:
Я прохожу пошаговое руководство о том, как создать свою первую надстройку Outlook с помощью конструктора лент: https://docs.microsoft.com/en-us/visualstudio/vsto/walkthrough-creating-your-first-vsto-add-in-for-outlook?view=vs-2019
Моя цель-создать шаблоны ответов, включающие имя отправителя в приветствие.
Исследуя проблему, я считаю, что мне нужно либо MailItem.SenderEmailAddress
или MailItem.Sender
, но когда я попытался добавить ее в mailitem.htmlbody
список, она вообще ничего не показывает.
Вот код, который у меня есть для моего теста.
private void Teser_button2_Click(object sender, RibbonControlEventArgs e)
{
{
if (Globals.ThisAddIn.Application.ActiveExplorer() != null)
{
MailItem mi = Globals.ThisAddIn.Application.ActiveExplorer().ActiveInlineResponse;
if (mi != null)
{
mi.HTMLBody = mi.SenderEmailAddress @"<BODY style=font-size:11pt;font-family:Calibri></BODY>Hello ENTERNAMEHERE,
<br><
<br>Here is a brief summary on everything worked on:
<br>
<br>Thank you for your time,
<br>
" mi.HTMLBody;
mi.BodyFormat = Outlook.OlBodyFormat.olFormatHTML;
}
}
}
}
Я пытался переодеться mi.SenderEmailAddress
mi.Sender
, но все равно ничего не получаю.
Любые идеи приветствуются!!
Обновленный
Вот код, который работал для меня как для проводника Outlook, так и из всплывающего окна (это не самое лучшее, но оно работает):
private void Domain_setup_Click_1(object sender, RibbonControlEventArgs e)
{
if (Globals.ThisAddIn.Application.ActiveExplorer() != null)
{
MailItem mi = Globals.ThisAddIn.Application.ActiveExplorer().ActiveInlineResponse;
Outlook.Selection selection = Globals.ThisAddIn.Application.ActiveExplorer().Selection;
object item = selection[1];
if (mi != null amp;amp; item is Outlook.MailItem mailItem)
{
string senderName = mailItem.SenderName;
mi.HTMLBody = @"<BODY style=font-size:11pt;font-family:Calibri></BODY>Hello " senderName @",
<br>
<br>Here is the information for the new domain/user account:
<br>
<br>Computer username: ENTERDOMAINORUSERNAMEHERE
<br>Computer password: ENTERPASSWORD
<br>
<br>Thank you for your time,
<br>
" mi.HTMLBody;
}
}
if (Globals.ThisAddIn.Application.ActiveInspector() != null)
{
MailItem mi = Globals.ThisAddIn.Application.ActiveInspector().CurrentItem;
Outlook.Selection selection = Globals.ThisAddIn.Application.ActiveExplorer().Selection;
object item = selection[1];
if (mi != null amp;amp; item is Outlook.MailItem mailItem)
{
string senderName = mailItem.SenderName;
mi.HTMLBody = @"<BODY style=font-size:11pt;font-family:Calibri></BODY>Hello " senderName @",
<br>
<br>Here is the information for the new domain/user account:
<br>
<br>Computer username: ENTERDOMAINORUSERNAMEHERE
<br>Computer password: ENTERPASSWORD
<br>
<br>Thank you for your time,
<br>
" mi.HTMLBody;
}
}
}
Ответ №1:
Вы обращаетесь к имени отправителя в ответе, а не к сообщению, на которое был получен ответ. Название должно происходить от первого предмета в Globals.ThisAddIn.Application.ActiveExplorer().Selection
коллекции.
Outlook.Selection selection = Globals.ThisAddIn.Application.ActiveExplorer().Selection;
if (selection.Count > 0)
{
object item = selection[1];
if (item is Outlook.MailItem mailItem)
{
string senderName = mailItem.SenderName;
}
}
Кроме того, вы не можете и не должны объединять две HTML — строки-результатом не будет действительный HTML-документ, они должны быть объединены (например, вы можете вставить свой HTML после окончания <body>
тега mi.HTMLBody
).
Комментарии:
1. Я пытался использовать
testvare = Globals.ThisAddIn.Application.ActiveExplorer().sender;
, но я получаю сообщение об ошибке:type' does not contain a definition for 'name' and no accessible extension method 'name' accepting a first argument of type 'type' could be found (are you missing a using directive or an assembly reference?)
2. Я также пытался использовать
testvar = Globals.ThisAddIn.Application.ActiveExplorer.sender;
, но получил еще одну ошибку, в которой говоритсяApplication.ActiveExplorer is a method, which is not valid in the given context.
3. Это действительно сработало, но мне следовало быть более подробным. Видите ли, я дал только половину функции, потому что думал, что это не так важно. Ты видишь.. На самом деле я использовал
ActiveExplorer()
иActiveInspector()
то, и другое, чтобы я мог ответить из проводника Outlook или из всплывающего окна. Ваш код работает, но только с Outlook Explorer, что имеет смысл, потому что это было единственное, о чем я просил. ха-ха-ха, я пытался понять, есть лиActiveInspector().selection
что-то, но это не похоже на это. Я отмечу ваш ответ как правильный и посмотрю, смогу ли я извлечь из этого урок. Спасибо!4. Если у вас есть новый элемент в инспекторе, все сложнее — вы не знаете, откуда пришел ответ, с которым вы работаете (в
ActiveInspector.CurrentItem
). Это может быть другой инспектор, в котором отображался исходный элемент, или он может быть получен из элемента, выбранного вExplore
r. Чтобы обработать и то, и другое, вам нужно будет перехватитьExplorer.SelectionChange
Inspectors.NewInspector
события и и настроитьReply/ReplyAll/Forward
обработчики событий для исходного элемента. Когда произойдет событие, у вас будет как старый элемент, так и новый элемент (переданный в качестве параметра).5. Я сделал какой-то код, который, кажется, работает. Я добавил его в сообщение «Сделать», так как я не могу делать многострочные комментарии здесь
Ответ №2:
Свойства, связанные с отправителем, существуют в полученных элементах. Итак, что вам на самом деле нужно, так это получить ответ на исходный элемент. Чтобы избежать ненужного поиска исходного сообщения электронной почты, вы можете использовать несколько способов получения необходимой информации в Outlook:
- Вы можете подключиться к событию ответа элементов Outlook, поэтому, когда пользователь решит ответить на электронное письмо, вы получите всю необходимую информацию и вставите ее в текст сообщения. Вы можете счесть полезным Реализовать оболочку для инспекторов и отслеживать события на уровне элементов в каждой статье инспектора. Экземпляр объекта ответа передается в качестве параметра, поэтому вы можете изменить текст сообщения с помощью информации, связанной с отправителем, извлеченной из источника события.
- Если элемент сохранен и был отправлен/получен, вы можете использовать метод GetConversation для получения объекта беседы, представляющего беседу, к которой принадлежит этот элемент. Беседа представляет один или несколько элементов в одной или нескольких папках и хранилищах. Если вы переместите элемент в беседе в
Deleted Items
папку и впоследствии перечислите беседу с помощью методаGetChildren
,GetRootItems
илиGetTable
, элемент не будет включен в возвращаемый объект.