Microsoft CRM Customization & Programmierung– Email Activity  Attachment

 

von Igor Kudrzashov

Alba Spectrum Technologies

Deutschland (0177) 8349 806, Moskau (095) 918 3314, USA 1-866-528-0577

help@albaspectrum.com  

Microsoft CRM ist vollberechtigte Teilnehmer auf Softwaremarkt und sein Marktanteil, infolge einer gutausgesuchten Marktstrategie und die Kraft Microsoft Business Solutions, steigt heftig. Microsoft CRM und solche Softwareprodukten wie Microsoft Great Plains, Solomon, Navision sind auf innigste miteinander verbunden. Es hat Preisvorteil im vergleich zu Siebel, Oracle. Microsoft CRM erleichtert und automatisiert die Arbeit ihres Unternehmens. In diesem kleinen Artikel versuchen wir Tipps an Softwareentwickler zu geben.

 

 

 

Wie kann man Microsoft Exchange CRM Connector verbessern. Hier untersuchen wir die Frage wie man email attachment bildet.

 

Bei der Verwirklichung von Exchange Handler, der produziert notwendige Activity in MS CRM, brauchen wir Attachment-Übertragung von Briefkörper in Attachmentliste von Activity. Um diese Probleme zu lösen, brauchen wir direkte Zugang MS CRM-Datenbank. Wie macht man das schrittweise:

 

  1. Zuerst sollen wir Zugang zum notwendigen Brief kriegen (über ExOLEDB):

 

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

CDO.IBodyPart iPrt;

 

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

 

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

 

  1. Nachher kriegen wir die Namen von Attachments und speichern Attachment-Körpern im provisorischen Katalog:

 

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;

   }

 

  1. wir überprüfen Information über Attachments und setzen die in Activity hin:

   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++;

          }

   }

 

  1. Attachment-Addition-Verfahren in Aktivity:

 

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();

   }

 

 

  1. Das Hauptproblem ist Attachment-Addition-Verfahren in MS CRM-Datenbank. Die wichtige Voraussetzung ist, dass Attachment soll als BASE64 kodiert werden. Die Länge, Mime Type und Name der Datei soll in Aktivity korrekt kodifiziert werden. Hier sind mögliche Kode:

 

   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);

          }

   }

 

  1.  Datei ContentType.txt ist ein Basis wo ist mime-type auskodiert

 

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

asd       application/astound Autosave file (Word for Windows)

asm       PC ASM File

asn       application/astound

 

usw.

 

Wir wünschen Ihnen viel Erfolg bei der Softwareimplementierung und Berichterstellung. Falls sich Ihrerseits Fragen bzw. Problemstellungen ergeben sollten, stehen wir Ihnen jederzeit unter der Rufnummer in Deutschland (0177) 8349 806, in Moskau (095) 918 3314, in USA 1-866-528-0577  oder unter help@albaspectrum.com zur Verfügung.

 

Igor Kudryashov ist ein zertifizierter Navision Spezialist von Ronix Systems ( http://www.ronix.ru ) eines Microsoft Business Solution Partners und die Europäische Abteilung von Alba Spectrum Technologies, USA ( http://www.albaspectrum.com ). Wir sind in Deutschland (in NRW, Hessen, Sachsen-Anhalt und andere), in Russland, USA und Brasil tätig. Diese weltweit autorisierte Unternehmung spezialisierte sich auf Navision, Great Plains und den Microsoft CRM Kundenservice.