Enviando e-mails programaticamente usando o Office 365 (Exchange Online)
CENÁRIO:
Cenário bem comum em automação de processos é ter algum serviço que fique monitorando algum processo e depois envie e-mails de notificação aos interessados.
ANÁLISE:
Com o EWS Managed API 2.0 isso ficou muito simples. Principalmente utilizando o Office 365 ao invés de um Exchange Server on-premises.
Para facilitar BASTANTE as coisas, utilizaremos o Microsoft.Exchange.WebServices desenvolvido pela própria Microsoft.
https://msdn.microsoft.com/en-us/library/dd877012(v=exchg.150).aspx
Para instalar esse NugetPackage no projeto, é requisito que ele seja .NET 4.0.
HOW TO:
Instale o pacote no projeto. E o resto é bem simples.
static void Main(string[] args)
{
ExchangeService service = new ExchangeService();
service.Credentials = new WebCredentials(meuemail@dominioOffice365.com.br, "SENHA");
service.TraceEnabled = true;
service.TraceFlags = TraceFlags.All;
service.AutodiscoverUrl(meuemail@dominioOffice365.com.br, RedirectionUrlValidationCallback);
EmailMessage email = new EmailMessage(service);
email.ToRecipients.Add(meuemail@dominioOffice365.com.br);
email.Subject = "HelloWorld";
email.Body = new MessageBody("Este é o primeiro e-mail que envio usando o EWS Managed API.");
email.Send();
Console.ReadLine();
}
E o método de apoio para validar o esquema do AutoDiscover:
private static bool RedirectionUrlValidationCallback(string redirectionUrl)
{
// The default for the validation callback is to reject the URL.
bool result = false;
Uri redirectionUri = new Uri(redirectionUrl);
// Validate the contents of the redirection URL. In this simple validation
// callback, the redirection URL is considered valid if it is using HTTPS
// to encrypt the authentication credentials.
if (redirectionUri.Scheme == "https")
{
result = true;
}
return result;
}
Atualizado (resultado):
Abraço!
Convertendo programaticamente Claim em Login Name – SharePoint 2010 Claims Authentication
Olá!
Overview:
SharePoint 2010 introduziu o Claims Based Authentication e, quando o utilizamos, percebemos algumas diferenças quando trabalhando com informações de autenticação.
Cenário:
Por exemplo, o que é muito comum, é utilizarmos o loginName para algumas tarefas. Mas quando utilizamos Claims Based Authentication, ao solicitar o loginName do usuário logado (ou qualquer outra referência ao loginName de algum usuário), nos deparamos com alguns carecteres estranhos, como: i:0#.w|loginName ou i:0#.f|myprovider|loginName (FBA).
Usamos um String.Replace? Não! O SharePoint nos ajuda com isso também, assim como fazemos para valores Lookup, Hyperlink, etc:
https://thiagottss.wordpress.com/2010/12/21/trabalhando-com-campos-hyperlink-no-sharepoint-programaticamente/ – Trabalhando com campos HyperLink no SharePoint programaticamente
https://thiagottss.wordpress.com/2010/08/31/trabalhando-com-campos-lookup-e-lookup-multi-value-no-sharepoint-programaticamente/ – Trabalhando com Campos Lookup e Lookup Multi Value no SharePoint programaticamente
SOLUÇÃO:
Similar aos posts dos links acima, temos uma classe para tratar os valores do Claims Based Authentication.
string userName = string.Empty; SPClaimProviderManager claimManager = SPClaimProviderManager.Local; if (claimManager != null) { userName = claimManager.DecodeClaim(SPContext.Current.Web.CurrentUser.LoginName).Value; }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
Ao solicitar o loginName do usuário atual logado no site (SPContext.Current.Web.CurrentUser.LoginName) é retornado o valor: “i:0#.w|domínio\login”. Usando o código acima, tratamos a parte da autenticação e solicitamos apenas o login do usuário (Value): domínio\login.
Abraço!
Trabalhando com campos HyperLink no SharePoint programaticamente
Olá!
Overview:
O SharePoint possui diversos tipos de campos (colunas) nativos, que já acompanham o produto, para adequar a sua informação. Por exemplo, campo tipo texto, texto com várias linhas, números, etc.
Um desses campos, é o campo do tipo HyperLink. Neste campo nós atribuímos o valor e a descrição do link, ou seja, podemos colocar o link de fato e também “label” do link. Algo assim: Teste.
Cenário:
Como todo campo do SharePoint, podemos manipular estes valores usando o Object Model do SharePoint, sem fazer “workaround’s”. Trabalhando da forma correta.
Por exemplo, estes amigos fazem do jeito errado, mas funciona…
ERRADO:
SPListitem[“MeuCampoHyperLink”] = “http://algumlink.com” + “, ” + “minha descrição”;
Vamos fazer do jeito certo, então!
SOLUÇÃO:
Similar a trabalhar com campos Lookup (https://thiagottss.wordpress.com/2010/08/31/trabalhando-com-campos-lookup-e-lookup-multi-value-no-sharepoint-programaticamente/), usamos o Object Model do SharePoint para adequar os valores do campo HyperLink. Da seguinte forma:
Atribuindo valor:
SPFieldUrlValue url = new SPFieldUrlValue(); url.Url = "https://thiagottss.wordpress.com"; url.Description = "Blog do Thiago Silva!"; SPListitem["CampoHyperLink"] = url; SPListitem.Update();
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
Lendo valores do item:
SPFieldUrlValue url = new SPFieldUrlValue(item["CampoHyperLink"].ToString()); string link = url.Url; string description = url.Description;
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
Abraço!
Iniciando um Workflow programaticamente para um item de Lista no SharePoint
Olá!
Overview:
Como muitos sabem, o SharePoint possui a capacidade de automatizar processos usando seus recursos nativos, um deles é o Workflow. Uma ferramenta poderosíssima!
A ideia deste post não é falar sobre Workflows, para isso, consulte este outro post: https://thiagottss.wordpress.com/2010/09/29/workflow-state-machine-no-sharepoint-2010/.
Cenário:
Muitas vezes, desenvolvendo aplicações para SharePoint, utilizamos o Workflow para automatizar alguns processos e/ou ações, coletar informações do usuário, etc. E, em algumas dessas vezes, precisamos iniciar o Workflow programaticamente. Ou seja, em determinada ação da nossa aplicação, é necessário que o Workflow inicie automaticamente.
O SharePoint pode fazer isso para nós se você optar por permitir que o Workflow inicie automaticamente quando um novo item é criado na lista ou para que inicie automaticamente quando algum item sofreu alteração.
Mas, no meu caso, nenhuma dessas ocasiões atendia meu cenário. Preciso iniciar o Workflow via código em determinado momento!
SOLUÇÃO:
Isso é bem simples, vamos ao que interessa!
using (SPWeb web = site.OpenWeb()) { SPList lista = web.Lists.TryGetList("Nome da Lista"); SPListItem itemDaLista = lista.GetItemById(5); foreach (SPWorkflowAssociation wfkAssociation in lista.WorkflowAssociations) { if (wfkAssociation.Name == "Nome do Workflow") { site.WorkflowManager.StartWorkflow(itemDaLista, wfkAssociation, "<root />"); } break; } }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
A dica aqui, é usar um XML vazio (“<root />”) para o eventData (3º parâmetro). Não tente passar string vazia ou null. Não funciona! 😉
Isso, claro, se você não estiver usando um AssociationForm. Caso contrário, passe a informação do AssociationForm.
É isso aí! =)
Abraço!