自动解析E-Mail地址到联系人(part II)
OK,第一个问题解决了,那么第二问题是什么呢?
想象一下,如果ContactA在CRM系统里有2个Email(Email1, Email2)。如果当ContactA用Email2发送邮件到CRM系统,那么当我们给ContactA回复邮件的时候,CRM会选用哪个邮件地址呢?答案是Email1,因为CRM永远使用EmailAddress1,而不去看ContactA用哪个地址发的邮件。
这样ContactA可能会感到很奇怪:为什么我用我公司的邮箱联系他们,却回复到了我的私人邮箱里?很明显这不是他所期望的。我们同样决定把EmailAddress1变成动态的,也就是说只记录最近使用的地址。由于Email Router 不能执行pre/post callout,所以我决定使用Workflow Assembly。代码如下,记住要更改Workflow.config,还要配置Workflow。
/*
* Update contact.emailaddress1 by email sender
*
* */
public void GetEmailSender(Guid activityid, String sender)
{
CrmService service = new CrmService();
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
string connectionString = "Server=_db;Database=_MSCRM;Integrated Security=SSPI";
//only select a contact(partyobjecttypecode=2) which is also a sender(participationtypemask=1)
string queryString = "SELECT partyid FROM FilteredActivityParty "
+ "WHERE(participationtypemask = 1) AND "
+ "(partyobjecttypecode = 2) AND "
+ "(activityid = '" + activityid.ToString()
+ "')";
SqlConnection connection = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand(queryString, connection);
command.Connection.Open();
try
{
SqlDataReader reader = command.ExecuteReader();
Guid cid = new Guid();
while(reader.Read())
{
cid = reader.GetGuid(0); // get FilteredActivityParty.partyid
}
if(cid.ToString() != "00000000-0000-0000-0000-000000000000")
{
contact c = new contact();
c.contactid = new Key();
c.contactid.Value = cid;
c.emailaddress1 = sender;
service.Update(c);
}
}
catch (Exception ex)
{
TextWriter log = TextWriter.Synchronized(File.AppendText(@"C:\CRM_Debug\error.txt"));
log.WriteLine(DateTime.Now);
log.WriteLine(ex.ToString());
log.WriteLine("");
log.Close();
}
finally
{
connection.Close();
}
} 


浙公网安备 33010602011771号