quarta-feira, 10 de dezembro de 2008

>> CRM 4.0 - Envio de Email Template (com anexos)

Segue código completo para envio de Email Template, com anexos.

A função SendEmailTemplate recebe como parâmetros o número, nome e ID da entidade como referência para o email (campo "referente a"), a descrição do Template do CRM a ser usado para envio do email, para quais usuários enviar e os anexos.


public static string SendEmailTemplate(int otc, string CrmEntityName, Guid oID, string templateTitle, string[] aUser, string[] aFiles)
{
// Set up the CRM Service.
CrmAuthenticationToken token = new CrmAuthenticationToken();
token.AuthenticationType = 0;
token.OrganizationName = "OrgName";

CrmService CrmWebService = new CrmService();
CrmWebService.Url = "http://localhost:5555/mscrmservices/2007/crmservice.asmx";
CrmWebService.CrmAuthenticationTokenValue = token;
CrmWebService.Credentials = System.Net.CredentialCache.DefaultCredentials;

Guid emailTemplateID = getTemplate(CrmWebService, otc, templateTitle);

if (emailTemplateID.Equals(Guid.Empty))
{
string err = "Não foi possível localizar o Email template ";
err += "com a palavra chave [" + templateTitle + "] para a entidade [" + otc.ToString() + "].";
return err;
}

crmSdk.WhoAmIRequest userRequest = new crmSdk.WhoAmIRequest();
crmSdk.WhoAmIResponse userResponse = (crmSdk.WhoAmIResponse)CrmWebService.Execute(userRequest);

crmSdk.BusinessEntity beSystemUser = CrmWebService.Retrieve(crmSdk.EntityName.systemuser.ToString(), userResponse.UserId, new crmSdk.AllColumns());
crmSdk.systemuser _systemuser = beSystemUser as crmSdk.systemuser;

if (_systemuser.internalemailaddress == null)
{
string err = "Seu usuário, no CRM, não possui EMAIL cadastrado (Email Primário).";
return err;
}

crmSdk.Owner _owner = new crmSdk.Owner();
_owner.type = crmSdk.EntityName.systemuser.ToString();
_owner.Value = userResponse.UserId;

// Instantiate the Template as an EMAIL Object.
crmSdk.InstantiateTemplateRequest instTemplate = new crmSdk.InstantiateTemplateRequest();
instTemplate.TemplateId = emailTemplateID;
instTemplate.ObjectId = oID;
instTemplate.ObjectType = CrmEntityName;
crmSdk.InstantiateTemplateResponse instTemplateResponse = null;

try
{
instTemplateResponse = (crmSdk.InstantiateTemplateResponse)CrmWebService.Execute(instTemplate);
}
catch (System.Web.Services.Protocols.SoapException ex)
{
return "InstantiateTemplateResponse Error - " + ex.Detail.InnerText;
}
catch (Exception ex)
{
return "InstantiateTemplateResponse Error - " + ex.Message;
}

//Convert the returned entity to an email entity, this is really just the merged template body
crmSdk.email emailFromTemplate = (crmSdk.email)instTemplateResponse.BusinessEntityCollection.BusinessEntities[0];

//Add Recipients to the email
CrmUtil.crmSdk.activityparty partyFROM = new CrmUtil.crmSdk.activityparty();
partyFROM.partyid = new CrmUtil.crmSdk.Lookup();
partyFROM.partyid.type = CrmUtil.crmSdk.EntityName.systemuser.ToString();
partyFROM.partyid.Value = userResponse.UserId;

crmSdk.activityparty[] aParties = new crmSdk.activityparty[aUser.Length];

int loop = 0;

for (int j = 0; j < aUser.Length; j++)
{
aParties[loop] = new crmSdk.activityparty();
aParties[loop].partyid = new crmSdk.Lookup();
aParties[loop].partyid.type = crmSdk.EntityName.systemuser.ToString();
aParties[loop].partyid.Value = new Guid(aUser[j]);
loop++;
}

emailFromTemplate.from = new crmSdk.activityparty[] { partyFROM };
emailFromTemplate.to = aParties;
emailFromTemplate.ownerid = _owner;
emailFromTemplate.regardingobjectid = new crmSdk.Lookup();
emailFromTemplate.regardingobjectid.type = CrmEntityName;
emailFromTemplate.regardingobjectid.Value = oID;

// Create the Email
crmSdk.TargetCreateEmail targetCreate = new crmSdk.TargetCreateEmail();
targetCreate.Email = emailFromTemplate;
crmSdk.CreateRequest request = new crmSdk.CreateRequest();
request.Target = targetCreate;
crmSdk.CreateResponse response = null;
try
{
response = (crmSdk.CreateResponse)CrmWebService.Execute(request);
}
catch (System.Web.Services.Protocols.SoapException ex)
{
return "TargetCreateEmail Error - " + ex.Detail.InnerText;
}

// Add Attachments
string msgRet = AddAttachments(response.id, aFiles);
if (!string.IsNullOrEmpty(msgRet)) return msgRet;

// Send Email
crmSdk.SendEmailRequest req = new crmSdk.SendEmailRequest();
req.EmailId = response.id;
req.TrackingToken = "";
req.IssueSend = true;
crmSdk.SendEmailResponse res = null;
try
{
res = (crmSdk.SendEmailResponse)CrmWebService.Execute(req);
}
catch (System.Web.Services.Protocols.SoapException ex)
{
return "SendEmailRequest - " + ex.Detail.InnerText;
}

return "Email criado com sucesso.";
}

private static Guid getTemplate(crmSdk.CrmService CrmWebService, int otc, string templateTitle)
{
crmSdk.QueryExpression _Query = new crmSdk.QueryExpression();
_Query.EntityName = crmSdk.EntityName.template.ToString();
_Query.ColumnSet = new crmSdk.AllColumns();

crmSdk.ConditionExpression _ce1 = new crmSdk.ConditionExpression();
crmSdk.ConditionExpression _ce2 = new crmSdk.ConditionExpression();

_ce1.AttributeName = "templatetypecode";
_ce1.Operator = crmSdk.ConditionOperator.Equal;
_ce1.Values = new object[] { otc };

_ce2.AttributeName = "title";
_ce2.Operator = crmSdk.ConditionOperator.Like;
_ce2.Values = new object[] { "%" + templateTitle + "%" };

crmSdk.FilterExpression _FilterExpression = new crmSdk.FilterExpression();
_FilterExpression.FilterOperator = crmSdk.LogicalOperator.And;
_FilterExpression.Conditions = new crmSdk.ConditionExpression[] { _ce1, _ce2 };

_Query.Criteria = _FilterExpression;
crmSdk.BusinessEntityCollection _Bec = CrmWebService.RetrieveMultiple(_Query);

Guid gResult = Guid.Empty;

if (_Bec.BusinessEntities.Length > 0)
{
crmSdk.template oTemplate = _Bec.BusinessEntities[0] as crmSdk.template;
gResult = oTemplate.templateid.Value;
}

return gResult;
}

private static string AddAttachments(crmSdk.CrmService CrmWebService, Guid emailID, string[] aFiles)
{
string retMsg = string.Empty;
string sServerPath = HttpContext.Current.Server.MapPath(@"\");
sServerPath = sServerPath.Replace(@"\", "||");

for (int i = 0; i < aFiles.Length; i++)
{
string fileNameCRM = aFiles[i];
RemoveSpecialChars(ref fileNameCRM);

string file = sServerPath + @"UploadFiles\\" + aFiles[i];
string Newfile = sServerPath + @"UploadFiles\\" + fileNameCRM;

file = file.Replace("||", "\\\\");
Newfile = Newfile.Replace("||", "\\\\");

string additionalError = "\nTentando adicionar anexo: " + Newfile;

FileInfo info = new FileInfo(file);
string sExtension = info.Extension;

try
{
string fileCompare1 = aFiles[i].Trim().ToLower();
string fileCompare2 = fileNameCRM.Trim().ToLower();
if (!fileCompare1.Equals(fileCompare2))
{
info.MoveTo(Newfile);
}
}
catch (IOException ex)
{
retMsg ="IOException (MoveTo) - " + ex.Message + additionalError;
return retMsg;
}
catch (Exception ex)
{
retMsg = "IOException (MoveTo) - " + ex.Message + additionalError;
return retMsg;
}

FileStream fl = File.OpenRead(Newfile);

byte[] byteData = new byte[fl.Length];
fl.Read(byteData, 0, (int)fl.Length);
fl.Close();

crmSdk.activitymimeattachment oMimeAttach = new crmSdk.activitymimeattachment();
oMimeAttach.activityid = new crmSdk.Lookup();
oMimeAttach.activityid.Value = emailID;
oMimeAttach.activityid.type = crmSdk.EntityName.email.ToString();
oMimeAttach.attachmentnumber = new crmSdk.CrmNumber();
oMimeAttach.attachmentnumber.Value = i;
oMimeAttach.filename = fileNameCRM;
oMimeAttach.body = Convert.ToBase64String(byteData, 0, byteData.Length);

try
{
CrmWebService.Create(oMimeAttach);
try { info.Delete(); }catch { }
}
catch (SoapException ex)
{
retMsg = "Activitymimeattachment Error - " + ex.Detail.InnerText + additionalError;
}
catch (Exception ex)
{
retMsg = "Activitymimeattachment Error - " + ex.Message + additionalError;
}

}
return retMsg;
}

private static string RemoveSpecialChars(ref string fileName)
{
fileName = Regex.Replace(fileName, @"[^\w\.@-]", "");
fileName = fileName.Replace("ª", "");
fileName = fileName.Replace("º", "");
return fileName;
}

Nenhum comentário:

Postar um comentário

<< Ao enviar um comentário, favor clicar na opção [Enviar por e-mail comentários de acompanhamento para gtezini@gmail.com] >>