自动解析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();  
    }
  
}
  
posted @ 2008-03-25 18:22  MicrosoftCRM  阅读(451)  评论(0)    收藏  举报