Microsoft CRM модификация программирование email activity attchment

 

Игорь Кудряшов

Alba Spectrum Technologies

(095) 918-3314, (095) 918-3111, help@albaspectrum.com  

Microsoft CRM теперь полноправный игрок на сцене программного  обеспечения и стремительно увеличивает свою долю рынка – частично видимо благодаря усилиям Microsoft Business Solutions и ее маркетинговой стратегии.  Microsoft CRM тесно интегрирован с другими продуктами Microsoft Business Solutions такими как Microsoft Great Plains, Solomon, Navision.  Будучи относительно недорогой системой в сравнении с ее соперниками, такими как Siebel, Oracle - Microsoft CRM открывает вам возможность автоматизации операций вашей компании.  В этой маленькой статье мы постараемся дать вам - разработчику программного обеспечения, намеки на то, как можно модернизировать Microsoft CRM для ваших нужд.

Как нам улучшить Microsoft Exchange CRM connector.  В особенности как создать email attachment – это и есть основной вопрос статьи

 

 

При реализации Exchange Handler, который производит создание необходимых Activity в MS CRM, одной из необходимых задач является перенос вложений (attachments) из тела обрабатываемого письма в список вложений создаваемого Activity. Эта задача решается путем прямого доступа к базе MS CRM. Давайте посмотрим, как это делается:

 

1)    Сначала мы получаем доступ через ExOLEDB к необходимому письму:

 

CDO.Message      iMessage = new CDO.MessageClass();

CDO.IBodyPart iPrt;

 

iMessage.DataSource.Open(bstrURLItem, null, ADODB.ConnectModeEnum.adModeRead,

 

ADODB.RecordCreateOptionsEnum.adFailIfNotExists, ADODB.RecordOpenOptionsEnum.adOpenSource, "", "");

 

2)   Далее работаем с массивом вложений получаем их имена и сохраняем сами вложения во временном каталоге:

 

   for(int i = 1; i <= aNum; i++) {

          string fName = iMessage.Attachments[i].FileName;

          string eName = fName.Substring(fName.Length-3, 3).ToUpper();

 

          log.Debug("Attachment: " + fName);

 

          iPrt = iMessage.Attachments[i];

          string attName = Path.GetTempPath() + fName;

          iPrt.SaveToFile(attName);

 

          attachments.Add(Guid.NewGuid(), attName);

 

          iPrt = null;

   }

 

3)   Далее, осуществляем обход полученного хеша, содержащего информацию об аттачах и добавляем их к созданному Activity:

 

   if (attachments != null) {

          ICollection keys = attachments.Keys;

          int attCounter = 0;

 

          foreach (Guid o in keys) {

                 string attName = (string)(attachments[o]);

 

crmConnector.AddAttachmentToActivity(emailId, attName, (new FileInfo(attName)).Length, attCounter);

         

                 File.Delete(attName);

                 attCounter++;

          }

   }

 

4)   А вот, собственно, и  сам метод  добавления аттача в Activity:

 

public Guid AddAttachmentToActivity(Guid emailId, string filename, long filesize, int attachmentNumber) {

          try    {

                 log.Debug("Prepare for Mail Activity Attachment Creating");

 

                 // BizUser proxy object

                 Microsoft.Crm.Platform.Proxy.BizUser bizUser = new Microsoft.Crm.Platform.Proxy.BizUser();

         

                 ICredentials credentials = new NetworkCredential(sysUserId, sysPassword, sysDomain);

 

                 bizUser.Url = crmDir + "BizUser.srf";

                 bizUser.Credentials = credentials;

                 Microsoft.Crm.Platform.Proxy.CUserAuth userAuth = bizUser.WhoAmI();

 

                 // CRMActivityAttachment proxy object

                 Microsoft.Crm.Platform.Proxy.CRMActivityAttachment activityAttachment = new Microsoft.Crm.Platform.Proxy.CRMActivityAttachment();

                 activityAttachment.Credentials = credentials;

                 activityAttachment.Url = crmDir + "CRMActivityAttachment.srf";

 

                 // Set up the XML string for the activity attachment

                 string strXml = "<activitymimeattachment>";

                 strXml += "<subject>Activity 1</subject>";

                 strXml += "<attachmentnumber>" + attachmentNumber + "</attachmentnumber>";

                 strXml += "<activityid>" + emailId.ToString("B") + "</activityid>";

                 strXml += "</activitymimeattachment>";

 

                 // Create the activity attachment

                 Guid attachmentId = new Guid(activityAttachment.Create(userAuth, strXml));

                 log.Debug("Create Attachemnt ID: " + attachmentId.ToString("B"));

 

                 UploadFileToDB(attachmentId, filename, filesize);

 

                 return attachmentId;

          }

          catch (System.Web.Services.Protocols.SoapException e)  {

                 log.Debug("ErrorMessage: " + e.Message + " " + e.Detail.OuterXml + " Source: " + e.Source);

          }

          catch (Exception e) {

                 log.Debug(e.Message + "\r\n" + e.StackTrace);

          }

 

          return new Guid();

   }

 

 

5)   Основной проблемой является собственно добавление тела вложения в базу MS CRM. Главным условием является то, что вложение должно быть закодировано как BASE64 и должен быть корректно проставлен его размер, Mime Type и имя файла, под которым вложение будет фигурировать в Acitivity. Давайте взглянем на получившийся код:

 

   public void UploadFileToDB(Guid attachmentId, string filename, long filesize) {

          string contentType = "application/octet-stream";

 

          try {

                 Hashtable mimes = LoadMimeDB(Environment.SystemDirectory + "/Albaspectrum/ContentType.txt");

 

                 if (mimes != null) {

                        string tmpContentType = GetMimeType(mimes, filename);

 

                        if (tmpContentType != null && !tmpContentType.Equals(""))

                               contentType = tmpContentType;

                 }

 

                 byte[] memoryData = new byte[filesize];

 

                 FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);

                 BinaryReader reader = new BinaryReader(fs);

 

                 reader.Read(memoryData, 0, (int)filesize);

 

                 reader.Close();

                 fs.Close();

 

                 OleDbCommand command = conn.CreateCommand();

 

                 command.CommandText = "UPDATE ActivityMimeAttachment SET FileSize = (?), MimeType = (?), FileName = (?), Body = (?) WHERE ActivityMimeAttachmentId = (?)";

                 command.Prepare();

                 command.Parameters.Add(new OleDbParameter("FileSize", filesize));

                 command.Parameters.Add(new OleDbParameter("MimeType", contentType));

                 command.Parameters.Add(new OleDbParameter("FileName", new FileInfo(filename).Name));

                 command.Parameters.Add(new OleDbParameter("Body", Convert.ToBase64String(memoryData, 0, (int)filesize)));

                 command.Parameters.Add(new OleDbParameter("ActivityMimeAttachmentId", attachmentId));

 

                 log.Debug("Prepare to upload attachemnt " + attachmentId.ToString("B") + " in ActivityMimeAttachment");

 

                 command.ExecuteNonQuery();

 

                 memoryData = null;

          }

          catch (Exception e) {

                 log.Debug(e.Message + "\r\n" + e.StackTrace);

          }

   }

 

5)   Файл ContentType.txt является базой сопоставлений расширений и их mime-type следующего вида:

 

asc       application/pgp-encrypted Armored Encrypted file (PGP)

asd       application/astound Autosave file (Word for Windows)

asm       PC ASM File

asn       application/astound

 

и т.д.

 

Желаем вам удачи в процессе настройки Microsoft CRM! Если вам нужна помощь наших специалистов -  мы всегда готовы вам помочь.  Позвоните нам в Москве (095) 918-3314, (095) 918-3111 , в США: 1-866-528-0577 или пишите: help@albaspectrum.com

 

Игорь Кудряшов – ведущий разработчик в Ronix Systems

( http://www.ronix.ru ), европейском подразделении Alba Spectrum Technologies ( http://www.albaspectrum.com ), компании – партнере Microsoft Business Solutions, обслуживающей клиентов по  Российской Федерации, включая города Москва, Санкт-Петербург, Екатеринбург, Казань, Новосибирск и др.