View Single Post
  #2  
Old August 11th 09, 02:52 PM posted to microsoft.public.outlook.program_addins
Ken Slovak - [MVP - Outlook]
external usenet poster
 
Posts: 5,848
Default UserProperty of mail object problem while dealing with custom fold

You're using a new thread to access the Outlook object model, which is
really, really bad. That is not supported and will cause Outlook to crash or
hang in most cases. Get rid of that and localize where the problem is coming
in your code. You need to show only the relevant code, no one is going to
want to wade through all that code to try to find problems.

--
Ken Slovak
[MVP - Outlook]
http://www.slovaktech.com
Author: Professional Programming Outlook 2007.
Reminder Manager, Extended Reminders, Attachment Options.
http://www.slovaktech.com/products.htm


"Problem with UserProperty of mail object"
icrosoft.com wrote in
message ...
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(entr ies.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("dd d, 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.


Ads