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