Archive

Posts Tagged ‘Programaticamente’

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

clip_image002

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):

Screen Shot 2016-07-13 at 8.05.47 PM 

Abraço!

Convertendo programaticamente Claim em Login Name – SharePoint 2010 Claims Authentication

January 17, 2011 Leave a comment

Olá! Smile

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

December 21, 2010 1 comment

Olá! Smile

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…

http://www.eggheadcafe.com/software/aspnet/30320968/how-to-set-the-value-to-the-hyperlink-field-programmatically.aspx

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

December 14, 2010 Leave a comment

Olá! Smile

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!