Archive for abril, 2009

Enviando e-mail no Asp.NET usando o provedor GMAIL

Neste curto artigo estarei demonstrando com enviar e-mail através de uma página ASP.NET utilizando o provedor Gmail, este artigo têm como foco estudantes que estão iniciando em desenvolvimento de sistemas.

Requisitos para o Exemplo: Neste nosso exemplo iremos usar o Visual Studio 2008 com Framework 3.5, caso não tenha instalado, efetue o download gratuitamente no seguinte site :  http://www.microsoft.com/Express/

Primeiramente abra o Visual Studio 2008, vá em File -> New -> Project, na tela de New Project escolha o projeto de C# -> Web,o nome do projeto e da solução deixe como SendMail

Agora vá em Solution Explorer e veja os itens que o Visual Studio criou, procure o arquivo Default.aspx e dê um duplo clique nele. A página irá abrir em branco insira os seguintes controles dentro da página conforme tabela abaixo.

Nota: (Procure os controles na aba ToolBox se a mesma não estiver visível pressione CTRL+ALT+X)

 

Controle

Propriedades

Observação

TextBox

- Altere a propriedade ID do controle para “destinatarioTextBox”;

É importante sempre que inserir um controle na pagina um nome simples e objetivo para que o mesmo possa ser localizado facilmente no código.

TextBox

- Altere a propriedade ID do controle para “mensagemTextBox”;

- Altere a propriedade TextMode para multiline;

 

Button

- Altere a propriedade ID do controle para “enviarButton”;

Este será o botão responsável por disparar o evento que irá chamar o envio do e-mail.

Label

- Altere a propriedade ID do controle para “RespostaEnvioLabel”;

- Altere a propriedade Visible para false;

Esta Label irá receber a mensagem se o envio foi executado com sucesso ou não, esta mensagem irá aparecer somente depois do envio.

 

Veja um exemplo abaixo da imagem2 de como deverá ficar sua página:


Imagem2 – Controles na página

Clique com o botão direito do mouse em qualquer ponto da página e escolha a opção ViewCode, no topo do código faça a inserção das seguintes linhas (abaixo) .

 

   1:  using System.Net.Mail;
   2:  using System.Net.Configuration;

Volte para o arquivo Default.aspx e dê um duplo clique no botão enviar e insira o código abaixo dentro do evento enviarButton_Click:

 
 
   1:  //O e-mail do remetente
   2:  string remetenteEmail = "nbsjunior@gmail.com"; 
   3:  MailMessage mail = new MailMessage();
   4:  mail.To.Add(destinatarioTextBox.Text);
   5:  mail.From = new MailAddress(remetenteEmail, "Nelson Borges", 
System.Text.Encoding.UTF8);
   6:  mail.Subject = "Assunto:Este e-mail é um teste do Asp.Net";
   7:  mail.SubjectEncoding = System.Text.Encoding.UTF8;
   8:  mail.Body = mensagemTextBox.Text;
   9:  mail.BodyEncoding = System.Text.Encoding.UTF8;
  10:  mail.IsBodyHtml = true;
  11:  //Prioridade do E-Mail
  12:   mail.Priority = MailPriority.High;
  13:   
  14:  SmtpClient client = new SmtpClient();
  15:  //Adicionando as credenciais do seu e-mail e senha:
  16:  client.Credentials = new System.Net.NetworkCredential
(remetenteEmail, "digiteAquiSuaSenhaGmail");
  17:   
  18:  // Esta porta é a utilizada pelo Gmail para envio
  19:  client.Port = 587;
  20:   
  21:  //Definindo o provedor que irá disparar o e-mail
  22:  client.Host = "smtp.gmail.com";
  23:   
  24:  //Gmail trabalha com Server Secured Layer
  25:   client.EnableSsl = true; 
  26:   try
  27:   {
  28:  client.Send(mail);
  29:  respostaEnvioLabel.Text = "Envio do E-mail com sucesso";
  30:  respostaEnvioLabel.Visible = true;
  31:  }
  32:  catch (Exception ex)
  33:  {
  34:  respostaEnvioLabel.Text = "Ocorreu um erro ao enviar:" 
+ ex.Message;
  35:  respostaEnvioLabel.Visible = true;
  36:  }
  37:   

Vamos à explicação do código acima: Para o envio do e-mail é necessário a utilização do namespace System.Web.Mail, para mais detalhes acesse: http://msdn.microsoft.com/en-us/library/system.web.mail.aspx dentro deste namespace você irá encontrar as várias classes relacionadas ao envio de e-mail:

MailMessage – Classe usada para criar e manipular o conteúdo de mensagem, no nosso exemplo instanciamos esta classe com o nome de mail (MailMessage mail = new MailMessage();).

Bom agora que entendemos o MailMessage vamos continuar com a explicação de cada linha do código que inserimos:

mail.To: Nesta linha estamos adicionando o valor do texto digitado na textbox destinatário, esta valor esta sendo passado para a propriedade To do mail através do método Add.

mail.From: Aqui estamos definindo o endereço de origem (remetente) que utilizaremos para enviar a apresentação do e-mail, no nosso caso usamos o MailAddress que é uma classe da System.Web.Mail usada para especificar o endereço de e-mail, exibição do nome no e-mail etc.

mail.Subject: Nesta linha estamos adicionando o assunto do e-mail.

mail.Body: Aqui estamos adicionando o conteúdo digitado no textbox mensagem ao corpo do e-mail.

mail.IsBodyHtml: Aqui definimos que o corpo da mensagem será um HTML, esta definição é um valor booleano ou seja true para verdade e false para falso.

mail.Priority: Você pode definir a prioridade do e-mail através desta propriedade.

No nosso exemplo estamos enviando um e-mail através do SMTP, existem outras formas que não serão tratadas neste artigo, dentro do namespace Sytem.Web.Mail existe também a classe SmtpClient que irá permitir o envio do e-mail, mais detalhes acesse: http://msdn.microsoft.com/pt-br/library/system.net.mail.smtpclient.aspx

client.Credentials: Após instanciar a classe SmtpClient, iremos definir algumas propredades, a primeira é a Credentials que irá validar o usuário e a senha no host (provedor de e-mail no nosso caso o Gmail), repare que usamos as credencias a classe da System .Net chamada NetworkCredential , esta classe fornece credenciais para esquemas de autenticação baseada em senhas como NTLM e Kerberos, mas detalhes acesse: http://msdn.microsoft.com/pt-br/library/system.net.networkcredential.aspx

client.Port: Aqui você irá definir a porta de saída do e-mail, como default é a porta 25, porém no provedor de SMTP do Gmail é utilizado a porta 587, a definição da porta é muito importante estar correto pois o envio do e-mail pode falhar por isso.

client.Host: O Host é provedor do serviço de e-mail, no nosso caso o Gmail, para outros provedores, é necessário conhecer o endereço de configuração do smtp, que neste artigo é “smtp.gmail.com”.

client.EnableSsl: Esta propriedade define se iremos utilizar o SSL para criptografar o e-mail.

client.Send: Este é método é responsável pelo envio do e-mail (MailMessage) que configuramos acima.

Finalizando o artigo, você agora pode efetuar um teste com sua nova página de envio de e-mails, basta apertar F5 no Visual Studio preencher os dados e clicar em enviar…

Até mais..

Aplicações OBA

Pessoal,
Em uma das caminhas por esse mundão a fora, resolvi dar umas estudada sobre aplicações OBA (Office Business Application), rapaz o negócio é chique..rs, bem maior do que imaginava, estive comentando algumas idéias com um pessoal especialista da Microsoft, então vou postando(compatilhando) aqui no blog algumas das minhas experiências, para que se um dia se alguém tiver interesse, ter um caminho mais facil para estudar.

1-) Meu primeiro passo foi conhecer um pouco sobre o Open Xml e  as diferenças entre as versões do Office.
Descobri muita coisa legal neste item, uma delas foi a estrutura de um arquivo docx, eu não sabia que ele era um arquivo comprimido (Content Types), e também não conhecia a estrutura organizacional destes arquivos (q programador eu sou neh.. rs). Esse link me ajudou, http://msdn.microsoft.com/pt-br/library/aa338205.aspx, também descobri que o projeto de Open XML já existia desde 1994.. e que é possivel abrir um arquivo 2007 no 2003 ou no Office 2000 apenas baixando um conector de acordo com a KB 924074 (Eu ficava sofrendo convertendo por sites, ou por aplicativos terceiros..rs).
Necessário para trabalhar com Package do Open XML no .NET :
- System.IO.Packaging;
- System.XML;
- Microsoft.Office.DocumentFormat.OpenXML.Packaging;

2-) Na etapa 2 criei meu primeiro Add-In no Excel.. rs, http://msdn.microsoft.com/en-us/library/3295w01c(VS.80).aspx
Eu vi tambem a questão de infra das aplicações .NET com Office, sobre o RunTime do VSTO (Visual Studio Tools for Office..rs), também entendi um pouco o conceito de Default Domain e Application Domain.
Nesta etapa achei interessante:
-Criação de Ribbons (Tanto pela interface do VS ou pelo arquivo XML).
-Conceito de ActionPane (Associado a um Documento);
-Conceito de TaskPane (Associado a um add-in na aplicação);
-Classe Microsoft.Office.Tools (que possui o Actions Pane, TaskPane e demais), achei bem legal quando estudei ela.
Para o próximo final de semana pretendo estudar sobre o Analisys Service do SQL, ver as conexões ADOMD e integrar este cara com os Add-In do Office, pois minha idéia é ter vários sistemas totalmente integrados com todas as areas de uma empresa, desde a criação de um sistema de ERP, MRP, CRM, as operações do Office e etc,  até o gerenciamento de dados estratégicos (BI, Data Mining) sei que parece uma idéia meio maluca, mas eu não tenho nada para fazer .. rs

 

Bom assim que fazer meu primeiro demo de aplicação OBA irei disponibilizar no blog.

 

Abraço

Alô Flex

Dando continuação ao post anterior falando um pouco sobre como codificar. O Flex usa tags padrão XML e Action Script. Um exemplo de uma tags padrão XML da biblioteca Flex 3 e o Button veja: <mx:Button x="470" y="159" label="Button"/>.

Para iniciar um exemplo Web bem simples, uma aplicação com um botão que dispara uma mensagem na tela. basica…

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

    <mx:Script>

        <![CDATA[

            import mx.controls.Alert;

            private function btnExemplo_click():void{

                Alert.show("Alô Flex!");

            } 

        ]]>

    </mx:Script>

    <mx:Button id="btnExemplo" x="32" y="10" label="Meu Botão" click="btnExemplo_click();"/>

</mx:Application>

Application e o container para aplicações Web, ao criar um novo Flex Project no Flex Builder ele já gera automaticamente uma Application, o componente Button tem uma referencia no seu evento click para a função btnExemplo_click, que dispara a mensagem de alerta. Tudo que esta dentro da tag de Script e  programação em Action Script. Até a próxima.
 
 

Evento em Franca – Developer

Olá, All.

Estou conversando muito com o Vinicius Sandim “blogueiro “ e com o Ricardo da InfoKraft e estamos pensando em criar um evento em Franca para desenvolvedores, estamos fechando alguns temas do evento e juntamente os especialistas que irão falar no evento.

Dentre os temas estão:

- Design Patterns
- Visual Studio 2008 e o CTP 2010
- .NET Framework
- Crystal Reports With Oracle
- PMI vs SCRUM
- Adobe Flex e o Conceito RIA
- Mesa Redonda (Neste tópico o publico irá participar com os palestrantes sobre assuntos diversos).

 

O que vocês acham destes temas? Têm algum tema que você gostaria de ver ai dentro?, se possível faça os comentários na pagina ou se preferir mande um e-mail para cromoborges@bol.com.br .

Pegando a Janela que esta em execução no Windows com C#

Olá,

Estarei demonstrando nestes post como pegar uma janela de um programa que esteja em execução no Windows. Neste exemplo para demostrar a janela eu irei usar o Caption da Janela ( Texto da Barra Superior). Crie um Form com os seguintes campos, 5 labels e 1 button e 1 Timer, deixe o formulário desta forma:

clip_image002
Imagem 01 – Form Principal

Para que nossa demo funcione precisamos importar o namespace System.Runtime.InteropServices conforme a tabela abaixo:

usingSystem.Runtime.InteropServices;

Agora precisamos chamar dois métodos estáticos externos da DLL User32

[ DllImport("user32.dll") ]
static extern int GetForegroundWindow();

[ DllImport("user32.dll") ]
static extern int GetWindowText(int hWnd,
StringBuilder text,int count);

O GetForegroundWindows retorna um handle para a janela com o qual o usuário está trabalhando atualmente.

O GetWindowText copia o texto da barra de titudo da janela especificada para um buffer.

Uma vez feito isso iremos implementar os métodos para pegar a Janela especificada, ficando assim:

private void BuscarJanelaAtiva()
        {

            const int nChars = 256;
            int handle = 0;
            StringBuilder Buff = new StringBuilder(nChars);

            handle = GetForegroundWindow();

            if ( GetWindowText(handle, Buff, nChars) > 0 )
            {
                this.captionWindowLabel.Text = Buff.ToString();
                this.IDWindowLabel.Text = handle.ToString();
            }

        }

Agora no Timer que vc inseriu na pagina faça a chamada para o método BuscarJanelaAtiva

private void timer1_Tick(object sender, System.EventArgs e)
 {
     BuscaJanelaAtiva();
 }

Nota: Eu deixe o Timer com a configuração no Intervalo de 100 m/s.

Agora implemente no Botão Sair o código abaixo para fechar o formulário

private void sair_Click(object sender, System.EventArgs e)
{
    this.Close();
}

Pronto, já pode rodar seu programa e efetuar os testes, parece bem simples mas acredite este pequeno exemplo é muito perguntado nos fóruns de desenvolvimento em .NET.

Classe genérica de conexão. Essa é pra guardar com carinho!

Boa tarde pessoal, olha eu aqui de novo, agora que já mostrei como configurar o apache + php + mysql, vou mostrar a vocês uma classe de conexão que uso em 90% das aplicações que faço em PHP, nos outros 10% não faço conexão com base de dados (tá explicado porque uso a classe só em 90%, rs).

Funciona da seguinte forma, nessa classe você pode utilizar métodos de conexão com “n” bancos de dados diferentes, passando apenas no método construtor o tipo de banco de dados que irá utilizar, no exemplo que vou mostrar nesse tutorial utilizo apenas conexão com MySQL e PostgreSQL, mas fica a critério de vocês qual tipo de banco de dados utilizar, basta adicionar mais uma cláusula nos métodos da classe, referente ao banco de dados que irá utilizar.

Neste tutorial não vou enrolar muito não, vou postar a classe inteira aqui e explicá-la nos comentários, crie um arquivo chamado Conn.php e dentro dele coloque o seguinte código:

<?php

    /* Declaração da Classe deve ter o mesmo nome do arquivo (conceitos de OO) */    

 

    /**

     * @author Dheyson Wildny - www.devfranca.com.br

     */

    class Conn {

        

        /* Declaração dos atributos da classe */

        private $servidor;

        private $usuario;

        private $senha;

        private $banco;

        private $tipoBanco;

        private $conn;

        private $resultado;

        private $sql;

        

        /**

         * @param String $tipo

         * @param String $server

         * @param String $user

         * @param String $pass

         * @param String $banco

         */

        public function conn($tipo, $server, $user, $pass, $banco) {        

            $this->setTipoBanco($tipo);

            $this->setServidor($server);

            $this->setUsuario($user);

            $this->setSenha($pass);

            $this->setBanco($banco);            

        }

        

        /**

         * @param String $server

         */

        public function setServidor($server) {

            $this->servidor = $server;

        }

        /**

         * @param String $user

         */   

        public function setUsuario($user) {

            $this->usuario = $user;

        }

        /**

         * @param String $pass

         */     

        public function setSenha($pass) {

            $this->senha = $pass;

        }        

        /**

         * @param String $banco

         */     

        public function setBanco($banco) {

            $this->banco = $banco;

        }

        /**

         * @param String $tipo

         */     

        public function setTipoBanco($tipo) {

            $this->tipoBanco = $tipo;

        }

        

        /**

         * @return Conexão Aberta

         */     

        public function connDB() {

            //Se o banco for MySQL

            if ($this->tipoBanco == "mysql") {        

                $this->conn = mysql_connect($this->servidor, $this->usuario, $this->senha);                

                if(!$this->conn) {

                    echo "<p>N&atilde;o foi poss&iacute;vel conectar-se ao servidor MySQL. <br>Erro MySQL: ".mysql_error()."</p>";

                    exit();

                } elseif (!mysql_select_db($this->banco, $this->conn)) {

                    echo "<p>N&atilde;o foi poss&iacute;vel selecionar o banco de dados desejado. <br>Erro MySQL: ".mysql_error()."</p>";

                    exit();

                }

            //Se o banco for PostgreSQL

            } else if ($this->tipoBanco == "pgsql") {

                $this->conn = pg_connect($this->servidor, $this->usuario, $this->senha);

                if(!$this->conn) {

                    echo "<p>N&atilde;o foi poss&iacute;vel conectar-se ao servidor PostgreSQL. <br>Erro PgSQL: ".pg_errormessage()."</p>";

                    exit();

                } elseif (!pg_select($this->banco, $this->conn)) {

                    echo "<p>N&atilde;o foi poss&iacute;vel selecionar o banco de dados desejado. <br>Erro MySQL: ".mysql_error()."</p>";

                    exit();

                }

            }

        }

        

        /**

         * @return Fecha Conexão

         */     

        public function closeConnDB() {

            if ($this->tipoBanco == "mysql") {    

                return mysql_close($this->conn);

            } else if ($this->tipoBanco == "pgsql") {

                return pg_close($this->conn);

            } else {

                return false;

            }

        }

        

        /**

         * @return Query - retorna o resultado de algum comando executado

         */     

        public function runQuery($sql) {

            $this->connDB();

            $this->sql = $sql;

            if ($this->tipoBanco == "mysql") {

                $this->resultado = mysql_query($this->sql);

            } else if ($this->tipoBanco == "pgsql") {

                $this->resultado = pg_query($this->sql);

            }

            if($this->resultado) {

                $this->closeConnDB();

                return $this->resultado;

            } else {

                $this->closeConnDB();

                if ($this->tipoBanco == "mysql") {

                    exit("<p>N&atilde;o foi poss&iacute;vel executar o comando solicitado.<br>Erro MySQL: ".mysql_error()."</p>");

                } else if ($this->tipoBanco == "pgsql") {

                    exit("<p>N&atilde;o foi poss&iacute;vel executar o comando solicitado.<br>Erro PgSQL: ".pg_errormessage()."</p>");

                } else {

                    exit("<p>N&atilde;o foi poss&iacute;vel executar o comando solicitado.</p>");

                }

            }

        }

        

        /**

         * @return Objeto de Conexão - Retorna uma instância da classe de conexão

         */     

        static public function conexao(){

            $con = new Conn('mysql', 'localhost', 'root', '', 'devfranca');

            return $con;

        }                    

    }

?>

Com esta classe de conexão vocês não precisarão de mais nada para realizar suas operações CRUD (Create, Retrieve, Update e Delete – Criar, Recuperar, Alterar e Deletar).

Para que quizer baixar essa classe prontinha, clique aqui.

Nos próximos tutoriais vou mostrar a vocês como aplicar essa classe de conexão, e então vocês vão perceber que essa classe pode ser aplicada com extrema facilidade em qualquer projeto que exija conexão com banco de dados.

Abraço e até a próxima!