P
Problem with UserProperty of mail object
hi,
The error i come across while dealing with saving the
UserProperties of mails being directed to custom folders is 'The operation
cannot be performed because the message has been changed.'
The following is my code.
// this is called in 'ThisAddIn_Startup' method whenver a new mail is received
this.Application.NewMailEx += new
Microsoft.Office.Interop.Outlook.ApplicationEvents_11_NewMailExEventHandler(Application_NewMailEx);
// the definition for 'Application_NewMailEx' is as follows
void Application_NewMailEx(string EntryIDCollection) //autolinking
{
if (strAutoLink == "ON")
{
string[] entries = EntryIDCollection.Split(',');
for (int c = 0; c < entries.Length; c++)
{
objMailItems =
(Outlook.MailItem)objNamesSpace.GetItemFromID(entries.GetValue(c).ToString(),
objInbox.StoreID);
threadMail = new Thread(new ThreadStart(fnNewMailRecv));
threadMail.Start();
}
}
}
//the definition for 'fnNewMailRecv()' is as follows
public void fnNewMailRecv()
{
try
{
Outlook.MailItem newMail = objMailItems;
currentMail = objMailItems;
GenModClass objGenMod = new GenModClass();
bool toLink = ThisAddIn.bLinkInCRM;
string strSenderName = newMail.SenderName.ToString();
string strUserName = objUser.userName.ToUpper();
Outlook.NameSpace objOUTLOOKNS =
this.Application.GetNamespace("MAPI");
Outlook.UserProperty objCRMGoldRecid;
Outlook.UserProperty objLinkedToContact;
Outlook.UserProperty objLinkedToCompany;
Outlook.UserProperty objLinkCheckBox;
newMail.Save();
objCRMGoldRecid = newMail.UserProperties.Add("RECID",
Outlook.OlUserPropertyType.olText, true, System.Reflection.Missing.Value);
objLinkedToContact = newMail.UserProperties.Add("Linked
to Contact", Outlook.OlUserPropertyType.olText, true,
System.Reflection.Missing.Value);
objLinkedToCompany = newMail.UserProperties.Add("Linked
to Company", Outlook.OlUserPropertyType.olText, true,
System.Reflection.Missing.Value);
objLinkCheckBox = newMail.UserProperties.Add("Is
Linked", Outlook.OlUserPropertyType.olYesNo, true,
System.Reflection.Missing.Value);
string strSenderEmailAddress = "";
if (newMail.SenderEmailAddress != null)
{
strSenderEmailAddress =
newMail.SenderEmailAddress.ToString();
string strFrom = strSenderEmailAddress == null ? ""
: strSenderEmailAddress;
string strTo = newMail.To == null ? "" : newMail.To;
string strCC = newMail.CC == null ? "" : newMail.CC;
string strBcc = newMail.BCC == null ? "" :
newMail.BCC;
string strSubject = newMail.Subject == null ? "" :
newMail.Subject;
if (strSubject.Length > 80)
strSubject = strSubject.Substring(0,
80).ToString();
string strMsgBody = newMail.HTMLBody == null ? "" :
newMail.HTMLBody;
string strImp = newMail.Importance.ToString();
string strAccountNo=string.Empty;
//gnerating some id
string strMailBoxRecID =
objGenMod.GenerateRecId().ToString(); string
strHasAttachment = (newMail.Attachments.Count > 0) ? "Yes" : "No";
//to get a user's account no from my database
string sqlQuery = "SELECT
dbo.Fun_Email_getLinkAccountNo('" + strSenderEmailAddress + "') AS
ACCOUNTNO";
DataSet ds= new DataSet();
try
{
// calling the webservice
ds =
crmService.executeCustomQuery(ThisAddIn.SessionID, sqlQuery,
objUser.userName, ThisAddIn.IPAddress);
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
fnWriteErrorLog(Ex);
return;
}
if (ds.Tables.Count > 0)
{
if (ds.Tables[0].Rows.Count > 0)
{
strAccountNo =
ds.Tables[0].Rows[0]["ACCOUNTNO"].ToString();
}
else
strAccountNo = "";
}
if (strAccountNo == "") //email address not found
in db
{
objCRMGoldRecid.Value = "UNLINKED";
objLinkedToContact.Value = "";
objLinkedToCompany.Value = "";
objLinkCheckBox.Value = false;
}
if (strAccountNo != "")
{
StringBuilder strRFC822 = new StringBuilder();
strRFC822.Append(" ");
string strMessageID = newMail.EntryID;
strRFC822.Append(newMail.ReceivedTime.ToString("ddd, dd MMM yyyy
hh:mm:ss")); //0
strRFC822.Append("^ ");
strRFC822.Append(strFrom); //1
strRFC822.Append("^ ");
strRFC822.Append(strSubject); //2
strRFC822.Append("^ ");
strRFC822.Append(strTo); //3
strRFC822.Append("^ ");
strRFC822.Append(strCC);//4
strRFC822.Append("^ ");
strRFC822.Append(strHasAttachment);//5
strRFC822.Append("^ <");
strRFC822.Append(strMessageID);//6
strRFC822.Append(">");
strRFC822.Append("^ ");
strRFC822.Append(strMsgBody);//7
strRFC822.Append("^ ");
string oldFileName = string.Empty;
string extn = string.Empty;
string FileName = string.Empty;
string emailattachments = "";
strRFC822.Append(emailattachments);//8
strRFC822.Append("^ ");
strRFC822.Append(newMail.BodyFormat.ToString());//9
if (strSubject.Length > 80)
strSubject = strSubject.Substring(0, 80);
string strRecdOnDate =
newMail.ReceivedTime.ToString();
sqlQuery = "SELECT companyid FROM
tblcompanycontact WHERE accountno='" + strAccountNo + "'";
try
{
//calling webservice
ds =
crmService.executeCustomQuery(ThisAddIn.SessionID, sqlQuery,
objUser.userName.ToUpper(), ThisAddIn.IPAddress);
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
fnWriteErrorLog(Ex);
return;
}
//create new database record
crmEZService.EmailMessage objEmailMessage =
new CRMGoldOutlook.crmEZService.EmailMessage();
objEmailMessage.recID = "";
objEmailMessage.Flags = "";
objEmailMessage.lopRecId = "";
objEmailMessage.Folder = strFolderType;
objEmailMessage.Folder2 = "";
objEmailMessage.MessageID = strMessageID;
objEmailMessage.Attachment = strHasAttachment;
objEmailMessage.userId =
objUser.userName.ToUpper();
objEmailMessage.MailSize =
newMail.Size.ToString();
objEmailMessage.MailDate =
DateTime.Parse(strRecdOnDate).ToString("yyyy-MM-dd");
objEmailMessage.MailTime =
newMail.ReceivedTime.ToString("HH:mm");
objEmailMessage.MailRef = strSubject;
objEmailMessage.RFC822 = strRFC822.ToString();
objEmailMessage.contactID = strAccountNo;
objEmailMessage.linkRecId = "";
string MAILBOXRECID = string.Empty;
try
{
//a new id is generated and returned by webservice
MAILBOXRECID =
crmService.createNewCRMObject(ThisAddIn.SessionID, objEmailMessage,
ThisAddIn.objUser.userName.ToUpper(), ThisAddIn.IPAddress);
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
fnWriteErrorLog(Ex);
return;
}
sqlQuery = "SELECT ISNULL(company,'')as
Company, ISNULL(contact,'') as Contact FROM contact1 WHERE accountno='" +
strAccountNo + "'";
try
{
ds =
crmService.executeCustomQuery(ThisAddIn.SessionID, sqlQuery,
objUser.userName.ToUpper(), ThisAddIn.IPAddress);
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
fnWriteErrorLog(Ex);
return;
}
// From here onwards, if there are no 'Rules and Alerts' specifed to direct
the received mails to custom folder, the values are assigned
// perfectly to UserProperties. But when
there are rules mentioned to move the received mail to a user created
'Personal folder', then
// the following error is thrown 'The operation cannot be performed
because the message has been changed.' and the values are not fed
// into the user properties.
if (ds.Tables.Count > 0)
{
if (ds.Tables[0].Rows.Count > 0)
{
if (objCRMGoldRecid != null)
{
objCRMGoldRecid.Value =
MAILBOXRECID;
}
objLinkedToContact.Value =
ds.Tables[0].Rows[0]["Contact"].ToString();
objLinkedToCompany.Value =
ds.Tables[0].Rows[0]["Company"].ToString();
objLinkCheckBox.Value = true;
}
}
newMail.Save();
}
}
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
fnWriteErrorLog(Ex);
}
}
Thanks in advance.
The error i come across while dealing with saving the
UserProperties of mails being directed to custom folders is 'The operation
cannot be performed because the message has been changed.'
The following is my code.
// this is called in 'ThisAddIn_Startup' method whenver a new mail is received
this.Application.NewMailEx += new
Microsoft.Office.Interop.Outlook.ApplicationEvents_11_NewMailExEventHandler(Application_NewMailEx);
// the definition for 'Application_NewMailEx' is as follows
void Application_NewMailEx(string EntryIDCollection) //autolinking
{
if (strAutoLink == "ON")
{
string[] entries = EntryIDCollection.Split(',');
for (int c = 0; c < entries.Length; c++)
{
objMailItems =
(Outlook.MailItem)objNamesSpace.GetItemFromID(entries.GetValue(c).ToString(),
objInbox.StoreID);
threadMail = new Thread(new ThreadStart(fnNewMailRecv));
threadMail.Start();
}
}
}
//the definition for 'fnNewMailRecv()' is as follows
public void fnNewMailRecv()
{
try
{
Outlook.MailItem newMail = objMailItems;
currentMail = objMailItems;
GenModClass objGenMod = new GenModClass();
bool toLink = ThisAddIn.bLinkInCRM;
string strSenderName = newMail.SenderName.ToString();
string strUserName = objUser.userName.ToUpper();
Outlook.NameSpace objOUTLOOKNS =
this.Application.GetNamespace("MAPI");
Outlook.UserProperty objCRMGoldRecid;
Outlook.UserProperty objLinkedToContact;
Outlook.UserProperty objLinkedToCompany;
Outlook.UserProperty objLinkCheckBox;
newMail.Save();
objCRMGoldRecid = newMail.UserProperties.Add("RECID",
Outlook.OlUserPropertyType.olText, true, System.Reflection.Missing.Value);
objLinkedToContact = newMail.UserProperties.Add("Linked
to Contact", Outlook.OlUserPropertyType.olText, true,
System.Reflection.Missing.Value);
objLinkedToCompany = newMail.UserProperties.Add("Linked
to Company", Outlook.OlUserPropertyType.olText, true,
System.Reflection.Missing.Value);
objLinkCheckBox = newMail.UserProperties.Add("Is
Linked", Outlook.OlUserPropertyType.olYesNo, true,
System.Reflection.Missing.Value);
string strSenderEmailAddress = "";
if (newMail.SenderEmailAddress != null)
{
strSenderEmailAddress =
newMail.SenderEmailAddress.ToString();
string strFrom = strSenderEmailAddress == null ? ""
: strSenderEmailAddress;
string strTo = newMail.To == null ? "" : newMail.To;
string strCC = newMail.CC == null ? "" : newMail.CC;
string strBcc = newMail.BCC == null ? "" :
newMail.BCC;
string strSubject = newMail.Subject == null ? "" :
newMail.Subject;
if (strSubject.Length > 80)
strSubject = strSubject.Substring(0,
80).ToString();
string strMsgBody = newMail.HTMLBody == null ? "" :
newMail.HTMLBody;
string strImp = newMail.Importance.ToString();
string strAccountNo=string.Empty;
//gnerating some id
string strMailBoxRecID =
objGenMod.GenerateRecId().ToString(); string
strHasAttachment = (newMail.Attachments.Count > 0) ? "Yes" : "No";
//to get a user's account no from my database
string sqlQuery = "SELECT
dbo.Fun_Email_getLinkAccountNo('" + strSenderEmailAddress + "') AS
ACCOUNTNO";
DataSet ds= new DataSet();
try
{
// calling the webservice
ds =
crmService.executeCustomQuery(ThisAddIn.SessionID, sqlQuery,
objUser.userName, ThisAddIn.IPAddress);
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
fnWriteErrorLog(Ex);
return;
}
if (ds.Tables.Count > 0)
{
if (ds.Tables[0].Rows.Count > 0)
{
strAccountNo =
ds.Tables[0].Rows[0]["ACCOUNTNO"].ToString();
}
else
strAccountNo = "";
}
if (strAccountNo == "") //email address not found
in db
{
objCRMGoldRecid.Value = "UNLINKED";
objLinkedToContact.Value = "";
objLinkedToCompany.Value = "";
objLinkCheckBox.Value = false;
}
if (strAccountNo != "")
{
StringBuilder strRFC822 = new StringBuilder();
strRFC822.Append(" ");
string strMessageID = newMail.EntryID;
strRFC822.Append(newMail.ReceivedTime.ToString("ddd, dd MMM yyyy
hh:mm:ss")); //0
strRFC822.Append("^ ");
strRFC822.Append(strFrom); //1
strRFC822.Append("^ ");
strRFC822.Append(strSubject); //2
strRFC822.Append("^ ");
strRFC822.Append(strTo); //3
strRFC822.Append("^ ");
strRFC822.Append(strCC);//4
strRFC822.Append("^ ");
strRFC822.Append(strHasAttachment);//5
strRFC822.Append("^ <");
strRFC822.Append(strMessageID);//6
strRFC822.Append(">");
strRFC822.Append("^ ");
strRFC822.Append(strMsgBody);//7
strRFC822.Append("^ ");
string oldFileName = string.Empty;
string extn = string.Empty;
string FileName = string.Empty;
string emailattachments = "";
strRFC822.Append(emailattachments);//8
strRFC822.Append("^ ");
strRFC822.Append(newMail.BodyFormat.ToString());//9
if (strSubject.Length > 80)
strSubject = strSubject.Substring(0, 80);
string strRecdOnDate =
newMail.ReceivedTime.ToString();
sqlQuery = "SELECT companyid FROM
tblcompanycontact WHERE accountno='" + strAccountNo + "'";
try
{
//calling webservice
ds =
crmService.executeCustomQuery(ThisAddIn.SessionID, sqlQuery,
objUser.userName.ToUpper(), ThisAddIn.IPAddress);
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
fnWriteErrorLog(Ex);
return;
}
//create new database record
crmEZService.EmailMessage objEmailMessage =
new CRMGoldOutlook.crmEZService.EmailMessage();
objEmailMessage.recID = "";
objEmailMessage.Flags = "";
objEmailMessage.lopRecId = "";
objEmailMessage.Folder = strFolderType;
objEmailMessage.Folder2 = "";
objEmailMessage.MessageID = strMessageID;
objEmailMessage.Attachment = strHasAttachment;
objEmailMessage.userId =
objUser.userName.ToUpper();
objEmailMessage.MailSize =
newMail.Size.ToString();
objEmailMessage.MailDate =
DateTime.Parse(strRecdOnDate).ToString("yyyy-MM-dd");
objEmailMessage.MailTime =
newMail.ReceivedTime.ToString("HH:mm");
objEmailMessage.MailRef = strSubject;
objEmailMessage.RFC822 = strRFC822.ToString();
objEmailMessage.contactID = strAccountNo;
objEmailMessage.linkRecId = "";
string MAILBOXRECID = string.Empty;
try
{
//a new id is generated and returned by webservice
MAILBOXRECID =
crmService.createNewCRMObject(ThisAddIn.SessionID, objEmailMessage,
ThisAddIn.objUser.userName.ToUpper(), ThisAddIn.IPAddress);
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
fnWriteErrorLog(Ex);
return;
}
sqlQuery = "SELECT ISNULL(company,'')as
Company, ISNULL(contact,'') as Contact FROM contact1 WHERE accountno='" +
strAccountNo + "'";
try
{
ds =
crmService.executeCustomQuery(ThisAddIn.SessionID, sqlQuery,
objUser.userName.ToUpper(), ThisAddIn.IPAddress);
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
fnWriteErrorLog(Ex);
return;
}
// From here onwards, if there are no 'Rules and Alerts' specifed to direct
the received mails to custom folder, the values are assigned
// perfectly to UserProperties. But when
there are rules mentioned to move the received mail to a user created
'Personal folder', then
// the following error is thrown 'The operation cannot be performed
because the message has been changed.' and the values are not fed
// into the user properties.
if (ds.Tables.Count > 0)
{
if (ds.Tables[0].Rows.Count > 0)
{
if (objCRMGoldRecid != null)
{
objCRMGoldRecid.Value =
MAILBOXRECID;
}
objLinkedToContact.Value =
ds.Tables[0].Rows[0]["Contact"].ToString();
objLinkedToCompany.Value =
ds.Tables[0].Rows[0]["Company"].ToString();
objLinkCheckBox.Value = true;
}
}
newMail.Save();
}
}
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
fnWriteErrorLog(Ex);
}
}
Thanks in advance.