public class AddEmailPartiesFromCreatedAndRegarding : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
ITracingService tracingService =
(ITracingService)serviceProvider.GetService(typeof(ITracingService));
IPluginExecutionContext context = (IPluginExecutionContext)
serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService crmService = serviceFactory.CreateOrganizationService(context.UserId);
if (context.InputParameters.Contains("Target"))
{
Entity entity = (Entity)context.InputParameters["Target"];
Entity emailMessage = crmService.Retrieve("email", entity.Id, new ColumnSet(true));
if (!emailMessage.Contains("subcategory")) return;
var description = (string)emailMessage["description"];
var subject = (string)emailMessage["subject"];
var emailUpdate = new Entity("email", emailMessage.Id);
emailUpdate["from"] = GetSender(description);
emailUpdate["to"] = GetRecipients(description);
emailUpdate["cc"] = GetCCs(description);
emailUpdate["statuscode"] = new OptionSetValue(2);
emailUpdate["statecode"] = new OptionSetValue(1);
emailUpdate["description"] = StripDescription(description);
emailUpdate["subject"] = StripSubject(description, subject);
crmService.Update(emailUpdate);
}
}
// Sender: (?i)(?<=From:)[\s\S]+(?=\nSubject:)
// Subject: (?i)(?<=Subject:)[\s\S]+(?=\nTo:)
// Recipients: (?i)(?<=To:)[\s\S]+(?=\ncc:)
// CC: (?i)(?<=cc:)[\s\S]+(?=\nMessage\-ID:)
// Email: (?=\<).*(?=\>)
static Entity[] GetRecipients(string str)
{
var stringData = str;
Regex regex = new Regex(@"(?i)(?<=To:)[\s\S].*?(?=\ncc:|cc:|\nMessage-ID:|\nContent-Type:|\nX-GM-Attachments-Sync-Time:)");
var partylist = GetPartyList(stringData, regex);
return partylist;
}
static Entity[] GetCCs(string str)
{
var stringData = str;
Regex regex = new Regex(@"(?<=cc:)[\s\S].*?(?=\nMessage-ID:|Message-ID:)");
var partylist = GetPartyList(stringData, regex);
return partylist;
}
static Entity[] GetSender(string str)
{
var stringData = str;
var regex = new Regex(@"(?i)(?<=From:)[\s\S].*?(?=\nSubject:|Subject:|cc:)");
var partylist = GetPartyList(stringData, regex);
return partylist;
}
static string RegexMatch(string str, string regexStr)
{
var stringData = str;
Regex regex = new Regex(regexStr);
Match match = regex.Match(stringData);
if (match.Success)
{
return match.Groups[0].Value;
}
else return str;
}
static string StripDescription(string str)
{
var stringData = str;
var regexStr = @"(?i)(?=<html)[\S\s]+(?:<\/html>)";
return RegexMatch(stringData, regexStr);
}
static string StripSubject(string str, string subject)
{
var stringData = str;
var regexStr = @"(?i)(?<=Subject:)[\s\S].*?(?=\nTo:|To:)";
var match = RegexMatch(stringData, regexStr);
var returnValue = subject;
if (match != stringData)
{
returnValue = match;
}
return returnValue;
}
static string StripEmailAddress(string str)
{
var stringData = str;
Regex regex = new Regex(@"(?<=\<)[\s\S\r]+(?=\>)");
Match match = regex.Match(stringData);
if (match.Success)
{
return match.Groups[0].Value;
}
else return str;
}
static Entity[] GetPartyList(string body, Regex regex)
{
var stringData = body;
List<Entity> partyList = new List<Entity>();
Match match = regex.Match(stringData);
if (match.Success)
{
var emailString = match.Groups[0].Value;
string[] emailArray;
if (emailString.Contains(','))
{
var parsedString = emailString.Replace(",", ";");
emailString = parsedString;
}
if (emailString.Contains(";"))
{
emailArray = emailString.Split(';');
}
else
{
emailArray = new[] { emailString };
}
for (var i = 0; i < emailArray.Length; i++)
{
var emailAddress = (StripEmailAddress(emailArray[i])).Trim();
if (emailAddress.Length > 0)
{
var emailParty = new Entity("activityparty");
emailParty["addressused"] = emailAddress;
emailParty["participationtypemask"] = 2;
partyList.Add(emailParty);
}
else
{
throw new InvalidPluginExecutionException(emailString + " " + regex.ToString());
}
}
return partyList.ToArray<Entity>();
}
else return null;
}
}
Related
No comment yet, add your voice below!