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, обслуживающей клиентов по Российской Федерации, включая города Москва, Санкт-Петербург, Екатеринбург, Казань, Новосибирск и др.