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

 

Борис Макушкин

Alba Spectrum Technologies

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

 

 

Microsoft CRM теперь полноправный игрок на сцене софтверного обеспечения и стремительно увеличивает свою долю рынка – частично видимо благодаря мускулам Microsoft Business Solutions и ее маркетинговой стратегии.  Она тесно интегрирована с другими продуктами 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, одной из необходимых задач является перенос аттачей из тела обрабатываемого письма в список аттачей создаваемой 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);

          }

   }

 

6)   Файл 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

 

и т.д.

 

Счастливого программирования, имплементации и модификации! Если вы хотите чтобы мы сделали работу – позвоните нам 1-866-528-0577! help@albaspectrum.com

 

Борис Макушкин – ведущий девелопер в Alba Spectrum Technologies – компании – партнере Microsoft Business Solutions в городах Москва, Петербург, Екатеринбург, Казань, Ростов и обслуживающей всю Российскую Федерацию (www.albaspectrum.com), Борис является Microsoft CRM SDK, C#, VB.Net, SQL, Oracle, Unix девелопером.

 

Alba Spectrum Technologies