Monday, April 13, 2009

Создаём подпись для электронных писем, отправляемых из MS CRM

Один из вопросов недавно заданных клиентом был - как так... В MS Outlook есть возможность автоматического вставления подписи при создании письма, а в CRM - нет... Надо бы исправить данную оплошность. Последующая статья описывает при помощи чего можно добиться похожего результата и в CRM, т.е. - создание и возможность редактирования подписи человеком прямо в CRM и автоматическая подстановка подписи при создании нового письма в CRM.


Для начала создам хранилище для подписи. Перейдём в карточку пользователя (SystemUser), добавляю новый аттрибут Signature:


Сохраняю аттрибут и открываю на редактирование карточку пользователя, добавляю новую закладку, которую назову Signature, добавляю туда новосозданное поле Signature:


Сохраняю и паблишу карточку.

Открываю на редактирование карточку Электронного письма (email), захожу в обработчик OnLoad, вставляю в него следующий скрипт:

function GetSignature()
{
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
xmlhttp.open("POST", "/mscrmservices/2007/crmservice.asmx", false);
xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlhttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Fetch");

var xml = "<?xml version='1.0' encoding='utf-8'?>"+
"<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'"+
" xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'"+
" xmlns:xsd='http://www.w3.org/2001/XMLSchema'>"+
GenerateAuthenticationHeader() +
" <soap:Body>" +
"<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"+
"<fetchXml> "+
"&lt;fetch mapping='logical'&gt; " +
"&lt;entity name='systemuser'&gt; " +
"&lt;attribute name='new_signature' /&gt; " +
"&lt;filter type='and'&gt; " +
"&lt;condition attribute='systemuserid' operator='eq-userid'/&gt; " +
"&lt;/filter&gt; " +
"&lt;/entity&gt; " +
"&lt;/fetch&gt;"+
"</fetchXml>"+
"</Fetch>"+
"</soap:Body>"+
"</soap:Envelope>";

xmlhttp.setRequestHeader("Content-Length", xml.length);
xmlhttp.send(xml);

var resultSet = new String(xmlhttp.responseXml.text);

resultSet.replace('&lt;','<');
resultSet.replace('&gt;','>');

var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;
xmlDoc.loadXML(resultSet);

var signature = xmlDoc.selectSingleNode("//resultset/result/new_signature");

if (signature)
return signature.text;
else
return "";
}

function insertSignature()
{
var descrFrame = document.getElementById('descriptionIFrame');

if(descrFrame.readyState != 'complete')
return;

var signature = GetSignature();
var signParts = signature.split("\n");
var newHTML = "";
for (var i=0; i < signParts.length; i++)
newHTML = newHTML + "<br/><b>" + signParts[i] + "</b>";
var descrWindow = document.frames['descriptionIFrame'];
descrWindow.document.body.innerHTML = newHTML;
}


if (crmForm.FormType == 1)
{
var descrFrame = document.getElementById('descriptionIFrame');
descrFrame.attachEvent('onreadystatechange', insertSignature);
}
Сохраняю, паблишу. Перехожу в карточку пользователя от имени которого будут отсылаться письма, ввожу подпись:


Сохраняю карточку пользователя. Нажимаю создать новое Электронное письмо. Результат:



Пытался ещё и картинку туда приделать, как результат - море проблем и т.п. Были идеи, но особо не было времени. Если сделаете или найдёте, как буду благодарен за ссылки.

13 comments:

  1. Андрей, к чему такие сложные манипуляции? Есть же шаблон электронной почты.

    ReplyDelete
  2. Можно, конечно, через шаблон. Заказчик хотел. Нажали новое письмо - подпись подставилась.

    ReplyDelete
  3. works great! Is there a way to add the font toolbar to the signature field? This would allow a user to choose a different font for their signature.

    ReplyDelete
  4. What a coincidence! I suggested the exact same approach at http://social.microsoft.com/Forums/en/crm/thread/e150e888-1068-4d45-8818-48d2686b815a.

    I swear, I didn't read your blog before my response. :-)

    Nice effort, Andriy!

    ReplyDelete
  5. I meant that I didn't read this particular blog post. But I did read a few others. :-)

    Cheers,
    Daniel

    ReplyDelete
  6. Hi a33ik,
    I tried your code,but am not able to see the signature in my email.Moreover i am getting error in the bottom of the page!Can you please let me know what can be the error

    ReplyDelete
  7. You should debug the code. It works fine for me...

    ReplyDelete
  8. Hi Andriy,

    Thanks for the idea. It can be input a picture of signature on this page? Thank you

    ReplyDelete
  9. Hello.

    You should check following blog which can solve your problem - http://www.powerobjects.com/blog
    I remember that in this blog was described how to insert images inside emails.

    ReplyDelete
  10. Hi Azzik,
    great job, its simple and works really good.

    One question: can I format in HTML in the signature atribute?
    I probe with an a tag and did not work...
    The thing is that users want to see the same thing in Outlook...

    Thanks

    ReplyDelete
  11. Hello, what kind of information are you trying to save as template? Can you please provide a sample?

    ReplyDelete
  12. Hi Azzik,
    its just words or numbers, but with diferentes style, with diferent colors or size for each word. I have some word in red, a web page, etc.
    When I use your solution in the body of the mail I get all the text in bold...

    Thanks for all

    ReplyDelete