Instalando o Microsoft SQL Server 2016 Release … 07:Configuração do Servidor. Deveremos...

20
Instalando o Microsoft SQL Server 2016 Release Candidate 3 No mês passado, foi abordada algumas funcionalidades do pré-lançamento deste Banco de dados com o artigo “Principais recursos do Microsoft SQL Server 2016”. Para este mês, irei demonstrar como adquirir e instalar esta primeira demonstração pública desta nova versão do banco de dados da Microsoft. Pré - requisitos Alguns pré-requisitos serão necessários para a instalação, sendo: -Sistema de Arquivo: é recomendável executar o SQL Server 2016 em computadores com o formato de arquivo NTFS. - Sistemas Operacionais suportados: Windows Server 2012, Windows 10, Windows 8.1, Windows 8. - Todos os sistemas operacionais estão disponíveis apenas como de 64 bits, ou seja, o SQL Server deverá ser instalado apenas em sistemas operacionais 64 bits. - Mínimo de 512 MB para a edição “Express” e mínimo de 1GB para as outras. - Processador no mínimo 1,4 GHz e recomendado 2.0 GHz. Page 1 of 20 Artigos 17/05/2016 file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

Transcript of Instalando o Microsoft SQL Server 2016 Release … 07:Configuração do Servidor. Deveremos...

Instalando o Microsoft SQL Server 2016 Release Candidate 3

No mês passado, foi abordada algumas funcionalidades do pré-lançamento deste Banco de dados com o artigo “Principais recursos do Microsoft SQL Server 2016”. Para este mês, irei demonstrar como adquirir e instalar esta primeira demonstração pública desta nova versão do banco de dados da Microsoft.

Pré-requisitos

Alguns pré-requisitos serão necessários para a instalação, sendo:-Sistema de Arquivo: é recomendável executar o SQL Server 2016 em computadores com o formato de arquivo NTFS.- Sistemas Operacionais suportados: Windows Server 2012, Windows 10, Windows 8.1, Windows 8.- Todos os sistemas operacionais estão disponíveis apenas como de 64 bits, ou seja, o SQL Server deverá ser instalado apenas em sistemas operacionais 64 bits.- Mínimo de 512 MB para a edição “Express” e mínimo de 1GB para as outras.- Processador no mínimo 1,4 GHz e recomendado 2.0 GHz.

Page 1 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

- 8 GB de espaço disponível em disco rígido.

Realizando o Download

Para efetuar o download deveremos seguir alguns passos acessando o site:https://www.microsoft.com/pt-br/evalcenter/evaluate-sql-server-2016?lc=1046

A primeira etapa seria clicar no item “Baixar” e logo em seguida no botão “Entrar” (É necessário possuir uma conta na Microsoft). Ver Imagem 01.

Figura 01: Efetuando a primeira etapa.

Já no próximo passo escolheremos o tipo de arquivo para ser baixando, tendo como opções: ISO, CAB e AZURE. Para o nosso exemplo, iremos escolher o “ISO” para termos uma imagem para ser emulada ou gravada em um DVD. Clique no botão “Registre para Continuar”. Ver Imagem 02.

Figura 02: Escolhendo o tipo de arquivo.

A última etapa seria preencher um formulário de cadastro com algumas informações para finalmente iniciarmos o Download. O arquivo possui o tamanho de aproximadamente 2.3 GB.

Realizando a Instalação

A instalação é muito simples e intuitiva. Ela segue os mesmos conceitos das versões anteriores, por isto comentarei apenas algumas das principais etapas.Execute o arquivo “SQLServer2016RC3-x64-CHT” e teremos uma tela conforme indica a Figura 03.

Page 2 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

Figura 03: Instalação.

Na etapa “Planejamento” teremos algumas informações como:  Requisitos de Hardware e Software, Documentação, Notas da versão entre outros dados. Clique na região “Instalação” para iniciarmos o processo. Ver Imagem 04.

Figura 04: Instalação Autônoma.

Ao clicar em “Nova instalação autônoma do SQL Server ...” iniciaremos um assistente para a instalação do banco de dados em um ambiente não clusterizado.

Na tela a seguir temos a possibilidade de especificar a edição do SQL Server 2016 RC3 a ser instalada. Podemos inserir a chave de 25 caracteres do certificado de autenticidade da Microsoft ou alguma edição gratuita como: Developer, Evaluation ou Express. Especificaremos a “Express” e logo em seguida clicaremos no botão “Avançar” para logo em seguida aceitar os termos de licença do produto.

Na Figura 05 podemos conferir as regras globais de instalação, as quais identificam problemas que poderão ocorrer quando instalamos arquivos de base.

Importante: Todas as regras deverão estar com o Status “Aprovado”, conforme indica a imagem supracitada.

Page 3 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

Figura 05: Regras Globais.

Temos a opção de atualização do Sistema Operacional e do Produto para a instalação dos arquivos e das regras. As próximas telas darão ênfase para estas operações. Não teremos muito o que se preocupar, basta escolhermos o botão “Avançar”. A Figura 06 engloba todas estas etapas.

Figura 06:Atualizando e instalando Arquivos.

Na opção “Seleção de Recursos” selecionaremos todos os recursos presentes e aproveitaremos para deixar o “Diretório raiz da instância”, “Diretório de recursos compartilhados” e “Diretório de recursos compartilhados (x86)” como padrão clicando no botão “Avançar”.

Em “Configuração da Instância” escolheremos a opção “Instância nomeada” como “SQLExpress” e em “Configuração do Servidor” deixaremos como a Microsoft recomenda, ou seja, uma conta separada para cada serviço do SQL Server. Ver Figura 07.

Page 4 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

Figura 07:Configuração do Servidor.

Deveremos especificar o modo de segurança da autenticação, os diretórios de dados e as configurações de TempDB do Mecanismo de Banco de Dados. Na aba “Configuração do Servidor” deixaremos como Modo de autenticação “Misto” (autenticação do BD e do Windows) especificando uma senha de administrador. Clicaremos no botão “Adicionar Usuário Atual” para adicioná-lo em nossa lista de acesso.

Nas abas “Diretório de Dados”, “TempDB”, “Instâncias de Usuário” e FILESTREAM” deixaremos as configurações padrões. Ver Imagem 08.

Figura 08: Configuração do Mecanismo de Banco de Dados.

Iremos configurar e instalar o “Reporting Services” no próximo passo clicando em Avançar. Já no item “Consentimento para instalar o Microsoft R Open” baixaremos alguns pré-requisitos necessários.

Importante: A instalação demorará cerca de 30 à 60 minutos, dependendo do hardware utilizado.

Na Imagem 09 teremos a conclusão da instalação com êxito.

Page 5 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

Figura 09: Conclusão da Instalação.

Conclusões

Neste artigo procurei descrever todas as etapas para adquirir e instalar o Microsoft SQL Server 2016 Release Candidate 3. Em artigos futuros irei explorar outros itens deste banco de dados, fica a dica para quem deseja testar seus projetos nesta nova ferramenta da Microsoft.

Um abraço e até o mês que vem!Referências

https://www.microsoft.com/pt-br/evalcenter/evaluate-sql-server-2016?lc=1046

AngularJS – Consumindo serviços REST

Introdução

Até pouco tempo atrás as principais formas de transmissão de dados eram via XML e Webservices SOAP, porém esses tipos de recursos eram complexos e muitas vezes necessitavam de um grande número de recursos para sua leitura e escrita e por isso o programador Douglas Crockford criou o formato chamado de JSON (leia-se Jay-son) que é um acrônimo para JavaScript Object Notation. Esse formato é extremamente leve e sua leitura é muito simples. Todo o seu conteúdo é escrito em JavaScript e a sua extensão oficial é .json.Hoje nós vamos aprender a consumir um serviço REST utilizando o formato JSON.

REST?

A sigla REST vem de Representational State Transfer (REST), que em português significa Transferência de Estado Representacional. A Wikipédia define REST como uma abstração da arquitetura da World Wide Web, mais precisamente, é um estilo arquitetural que consiste de um conjunto coordenado de restrições arquiteturais aplicadas a componentes, conectores e elementos de dados dentro de um sistema de hipermídia distribuído.

Na prática um serviço rest pode ser consumido através de requisições HTML, como por exemplo ao acessar o endereço http://www.exemplo.com/usuario/123 você está consultado as informações do usuário com ID 123. É muit comum também serviços que fazem uso do cabeçalho do HTTP, assim se você consultar o mesmo endereço utilizando o cabeçalho DELETE ao invés do GET o usuário com ID 123 será apagado da base de dados.

Para testarmos nossa aplicação nós iremos utilizar o JSONPlaceholder, um serviço REST que retorna informações aleatórias para fins de teste.

Código Inicial

Vamos iniciar nosso artigo com uma página HTML básica que inclui dois arquivos Java Scripts, um com o framework e o outro chamado de app.js com os códigos de nossa aplicação.

<!DOCTYPE html>

<html ng-app>

<head>

Page 6 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

<title>The Club</title>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>

<script type="text/javascript" src="app.js"></script>

</head>

<body>

<div ng-app="aplicacao">

</div>

</body>

</html>

Consultando um objeto

No primeiro exemplo vamos pegar as informações de apenas um objeto e para isso o endereço que iremos consultar será o http://jsonplaceholder.typicode.com/users/2 o JSON retornado deverá ser assim:

{

"name": "Ervin Howell",

"email": "[email protected]",

"website": "anastasia.net",

"id": 2

}

Para exibir as informações nosso HTML deverá ser:

<!-- Arquivo Exemplo 1/index.html -->

<!DOCTYPE html>

<html>

<head>

<title>The Club</title>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>

<script type="text/javascript" src="app.js"></script>

Page 7 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

</head>

<body>

<div ng-app="aplicacao">

<h1>Consumindo servi&ccedil;os REST</h1>

<div ng-controller="Rest">

<p>

<strong>ID:</strong> {{ usuario.id }}

</p>

<p>

<strong>Nome:</strong> {{ usuario.name }}

</p>

<p>

<strong>Email:</strong> {{ usuario.email }}

</p>

<p>

<strong>Website:</strong> {{ usuario.website }}

</p>

</div>

</div>

</body>

</html>

Já o nosso arquivo app.js deverá conter nosso controller que neste exemplo chamamos de Rest e importar o modulo responsável por fazer as requisições HTTP do Angular, o $http. Após o sucesso da requisição nós armazemos o retorno na variável usuario.

/* Arquivo: Exemplo 1/app.js */

angular.module('aplicacao', []);

angular.module('aplicacao').controller('Rest', function ($scope, $http){

Page 8 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

$http.get('http://jsonplaceholder.typicode.com/users/2').

success(function(data) {

$scope.usuario = data;

}

);

});

Se executarmos o arquivo verificaremos que após alguns segundos (tempo necessário para realizar a chamada AJAX) o retorno será igual a figura 1.

Figura 1 – Página com o resultado da chamada AJAX.

Consultando vários objetos

No segundo exemplo vamos pegar as informações de uma lista de tarefas e exibi-las em uma tabela, para isso o endereço que iremos consultar será o http://jsonplaceholder.typicode.com/todos o JSON retornado deverá ser mais ou menos assim:

[

{

"userId": 2,

"id": 21,

"title": "suscipit repellat esse quibusdam voluptatem incidunt",

"completed": false

},

{

"userId": 2,

"id": 22,

Page 9 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

"title": "distinctio vitae autem nihil ut molestias quo",

"completed": true

},

{

"userId": 2,

"id": 23,

"title": "et itaque necessitatibus molestiae qui quas velit",

"completed": false

}

]

Vamos agora alterar nosso HTML e criar uma tabela que passe por todos os elementos do nosso JSON e exiba os dados de cada um em uma tabela.

<!-- Arquivo Exemplo 2/index.html -->

<!DOCTYPE html>

<html>

<head>

<title>The Club</title>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>

<script type="text/javascript" src="app.js"></script>

</head>

<body>

<div ng-app="aplicacao">

<h1>Consumindo servi&ccedil;os REST</h1>

<div ng-controller="Rest">

<table>

<thead>

Page 10 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

<tr>

<th>ID</th>

<th>ID Usu&aacute;rio</th>

<th>T&iacute;tulo</th>

<th>Completo</th>

</tr>

</thead>

<tbody>

<tr ng-repeat="tarefa in tarefas">

<td>{{ tarefa.id }}</td>

<td>{{ tarefa.userId }}</td>

<td>{{ tarefa.title }}</td>

<td>{{ tarefa.completed }}</td>

</tr>

</tbody>

</table>

</div>

</div>

</body>

</html>

É possível notar como é facil iterar sobre elementos utilizando a tag ng-repeat do Angular.Nosso arquivo app.js não deverá ficar muito diferente do exemplo anterior, a principal mudança é a URL que iremos realizar a chamada.

/* Arquivo: Exemplo 2/app.js */

angular.module('aplicacao', []);

angular.module('aplicacao').controller('Rest', function ($scope, $http){

$http.get('http://jsonplaceholder.typicode.com/todos').

Page 11 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

success(function(data) {

$scope.tarefas = data;

}

);

});

Conclusão

No artigo de hoje nós aprendemos como utilizar o cabeçalho GET do HTML para consumir um serviço REST com o módulo $http do AngularJS. No próximo artigo nós iremos aprender a enviar informações a alterar o cabeçalho.Até a próxima!

Threads – técnicas turbinadas e recursos interessantes de envio de emails via GMail –

parte II

Caros leitores, agora nesta parte vamos finalmente dar continuidade à função de envio de emails via GMail pelo nosso aplicativo em Delphi. Vamos mostrar exemplos interessantes de envio de email, a partir com a infraestrutura já discutida no artigo anterior. Já inicializamos com a estrutura dos componentes Indy, instalando e testando os componentes, e portanto agora vamos basicamente instanciar suas principais classes para disparar com sucesso os emails desejados.Vamos a um exemplo prático de como enviar email pelo Indy. Segue abaixo o código-fonte:

procedure TForm1.Button3Click(Sender: TObject);var // objetos necessários para o funcionamento IdSSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL; IdSMTP: TIdSMTP; IdMessage: TIdMessage; CaminhoAnexo: string;begin // instanciação dos objetos IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(Self); IdSMTP := TIdSMTP.Create(Self); IdMessage := TIdMessage.Create(Self);

try // Configuração do SSL IdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv23; IdSSLIOHandlerSocket.SSLOptions.Mode := sslmClient;

// Configuração do SMTP IdSMTP.IOHandler := IdSSLIOHandlerSocket; IdSMTP.AuthType := satSASL; IdSMTP.Port := 465; IdSMTP.Host := 'smtp.gmail.com'; IdSMTP.Username := '[email protected]'; IdSMTP.Password := 'minhasenha001';

// Tentativa de conexão e autenticação try IdSMTP.Connect; IdSMTP.Authenticate; except on E:Exception do begin MessageDlg('Erro na conexão e/ou autenticação: ' + E.Message, mtWarning, [mbOK], 0); Exit; end;

Page 12 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

end;

// Configuração da mensagem IdMessage.From.Address := '[email protected]'; IdMessage.From.Name := 'fulano'; IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address; IdMessage.Recipients.EMailAddresses := '[email protected]'; IdMessage.Subject := 'Assunto do e-mail'; IdMessage.Body.Text := 'Corpo do e-mail';

// Anexo da mensagem (opcional) // CaminhoAnexo := 'C:\Anexo.txt'; // if FileExists(CaminhoAnexo) then // TIdAttachment.Create(IdMessage.MessageParts, CaminhoAnexo);

// Envio da mensagem try IdSMTP.Send(IdMessage); MessageDlg('Mensagem enviada com sucesso.', mtInformation, [mbOK], 0); except On E:Exception do MessageDlg('Erro ao enviar a mensagem: ' + E.Message, mtWarning, [mbOK], 0); end; finally // liberação dos objetos da memória FreeAndNil(IdMessage); FreeAndNil(IdSSLIOHandlerSocket); FreeAndNil(IdSMTP); end;

end;

Acima é mostrada uma forma, provavelmente a mais simples, para envio de emails. Todas as classes necessárias requeridas pelo Indy para conexão com servidor SMTP, configuração com SSL, formatação de mensagens HTML, etc, são instanciadas em tempo de execução. São basicamente estas:

1. TIdSMTP: Classe para conexão com servidor SMTP;2. TIdSSLIOHandlerSocketOpenSSL: Classe para configuração e utilização do projeto opensource OpenSSL

(https://www.openssl.org/) necessária para compilação e implementação do protocolo SSL, requerido pelo GMail;3. TIdMessage: Classe para formatação de texto HTML para ser inserido no corpo do email.

 Para isso são necessárias as seguintes units para compilação:

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdSMTP, IdMessage, IdSSLOpenSSL,

IdSASLLogin, IdUserPassProvider, IdBaseComponent, IdAttachmentFile, IdAttachment, IdComponent, IdIOHandler, IdIOHandlerSocket, IdExplicitTLSClientServerBase, IdText, IdHTTPProxyServer, IdConnectThroughHttpProxy, StdCtrls, IndySecureMailClient;

TThreadMail Demo – Aplicativo para envio de emails multi-threadEste aplicativo irá demonstrar via multithread como vamos disparar emails a partir de uma coleção – neste caso é um

descendente de TDataSet chamado THVDataSetStream, discutido em outros artigos – é o nosso “banco de dados” baseado em TStream. Este programa utilizará um recurso crítico que é um arquivo de log, escrevendo nele o resultado do processamento de cada email (cada registro da tabela), seja enviado com sucesso, seja não enviado devido a alguma falha. Este status do processamento será escrito nele – e daí a nossa implementação em uma fila de threads para que eles sejam enfileirados para não acessarem simultaneamente.

Page 13 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

Figura 02 – Tela do programa de exemplo do TThreadMail.

type PEmailRequest = ^TEmailRequest; TEmailRequest = record UserName : String; end;

TThreadMail = class(TObject) private FThreadPool: TThreadPool; procedure HandleMailRequest(Data: Pointer; AThread: TThread); public constructor Create; destructor Destroy; override; procedure Mail(const UserName: string); procedure Init; end;

{ ...}procedure TThreadMail.HandleMailRequest(Data: Pointer; AThread: TThread);var Request: PEmailRequest;begin Request := Data; try SendEmailToGmail(Request^.UserName); finally Dispose(Request); end;end;

procedure TThreadMail.Mail(const UserName: string);var Request: PEmailRequest;begin New(Request); Request^.UserName := UserName; FThreadPool.Add(Request);end;{ ...}

unit ThreadUtilities;

interface

Page 14 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

uses Windows, SysUtils, Classes;

type EThreadStackFinalized = class(Exception); TSimpleThread = class;

// Thread Safe Pointer Queue TThreadQueue = class private FFinalized: Boolean; FIOQueue: THandle; public constructor Create; destructor Destroy; override; procedure Finalize; procedure Push(Data: Pointer); function Pop(var Data: Pointer): Boolean; property Finalized: Boolean read FFinalized; end;

TThreadExecuteEvent = procedure (Thread: TThread) of object;

TSimpleThread = class(TThread) private FExecuteEvent: TThreadExecuteEvent; protected procedure Execute(); override; public constructor Create(CreateSuspended: Boolean; ExecuteEvent: TThreadExecuteEvent; AFreeOnTerminate: Boolean); end;

TThreadPoolEvent = procedure (Data: Pointer; AThread: TThread) of Object;

TThreadPool = class(TObject) private FThreads: TList; FThreadQueue: TThreadQueue; FHandlePoolEvent: TThreadPoolEvent; procedure DoHandleThreadExecute(Thread: TThread); public constructor Create(HandlePoolEvent: TThreadPoolEvent; MaxThreads: Integer = 1); virtual; destructor Destroy; override; procedure Add(const Data: Pointer); end;

implementation

constructor TThreadQueue.Create;begin //-- Create IO Completion Queue FIOQueue := CreateIOCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0); FFinalized := False;end;

procedure TThreadQueue.Finalize;begin //-- Post a finialize pointer on to the queue PostQueuedCompletionStatus(FIOQueue, 0, 0, Pointer($FFFFFFFF)); FFinalized := True;end;

(* Pop will return false if the queue is completed *)function TThreadQueue.Pop(var Data: Pointer): Boolean;var A: Cardinal;

Page 15 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

OL: POverLapped;begin Result := True;

if (not FFinalized) then //-- Remove/Pop the first pointer from the queue or wait GetQueuedCompletionStatus(FIOQueue, A, Cardinal(Data), OL, INFINITE);

//-- Check if we have finalized the queue for completion if FFinalized or (OL = Pointer($FFFFFFFF)) then begin Data := nil; Result := False; Finalize; end;end;

GMailSender – aplicativo customizável para envio de emails via GMail O GMailSender é um programa freeware que escrevi para demonstrar, profissionalmente, de uma forma bem

interessante e intuitiva, como podemos configurar várias opções de entrada requeridas pelo servidor do GMail para conexão e envio de mensagens.

Figura 03 – Tela inicial do GMailSender.

Ele utiliza vários componentes mas todos free. O foco principal é enviar emails. Por isso a configuração da infraestrutura é importante, discutido na edição anterior. Vamos discorrer brevemente sobre os componentes utilizados:

1. Design eXperince Visual Component Library (classe TdxWinXPBar) – utilizado para novos temas (estilo gradiente e bem soft) simulando uma barra de ferramentas formato horizontal estilo WindowsXP. Continuado seu desenvolvimento no projeto JVCL (http://jvcl.sourceforge.net);

2. TIceTabSet – componente que simula o estilo de abas do navegador Chrome do Google. É um TTabSet com este layout bem moderno e atraente, com gradientes, imagens de fundo, ícones customizáveis, etc – projeto https://sourceforge.net/projects/icetabset/;

3. TMaskEditHV e THVDataSetStream – componentes desenvolvidos por mim para validação de dados  e persistência do tipo TStream, respectivamente (já discutidos em outros artigos);

4. THTMLViewer – componente para visualizar textos HTML, renderizando em um descendente de TWinControl para exibir como em uma “pré-visualização” dos dados, no caso todo o texto é exibido, dispensando navegadores e a internet para tal. Esta visualização será exibida na mesma hora em que o código-fonte do HTML é alterado.

Page 16 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

Figuras 04 e 05 – Telas de funcionamento do GMailSender. Características:

1. Carrega internamente (por meio de arquivos de recursos) as dll´s libeay32.dll e ssleay32.dll (do framework

OpenSSL) e descompacta no diretório do Windows. É necessário para conexão com o GMail para funcionamento e envio de emails;

2. Carrega internamente um banco de dados para nossos testes, do tipo stream, utilizando pelo componente THVDataSetStream;

3. Carrega internamente uma página de testes formato HTML, chamada modelo.htm, para ser exibida quando na execução do programa. É como um template, para servir de exemplo do potencial de renderização HTML oferecido pelo nosso aplicativo;

4. Suporte a opções de pré-visualização formato dinâmico (no mesmo tempo em que se edita o texto) bem como em uma opção como pré-impressão (carregado como uma página a ser impressa, com o HTML gerado a partir do texto de entrada do programa)

Page 17 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

Figura 06 – Tela de visualização de impressão do GMailSender.

1. Multithread e thread-safe – todas as operações de gerenciamento de emails (conexão, carregamento de emails pra memória a fim de serem lidos pelas threads, envio e registro sincronizado com a interface principal, etc) são executadas em paralelo de forma que não se onere o aplicativo – sendo eficientemente gerenciado e notificado seus erros através de um implementador de um stack tracer (assunto a ser discutido nos próximos artigos).

Segue um trecho desta funcionalidade de debug avançado abaixo:

10/05/2016 16:05:10Exception: EIdSocketErrorIn C:\Hamden\Papirus\Artigos\Desenvolvimento\GMailSender\GMailSender.exeSocket Error # 10060Connection timed out.Stack trace:Physical Logical Unit (######) Routine005411F8 001401F8 IdIOHandlerStack.pas ( 279) IdIOHandlerStack.DoConnectTimeout00541463 00140463 IdIOHandlerStack.pas ( 352) IdIOHandlerStack.TIdIOHandlerStack.ConnectClient00563DF5 00162DF5 IdSSLOpenSSL.pas ( 2684) IdSSLOpenSSL.TIdServerIOHandlerSSLOpenSSL.MakeClientIOHandler00544EB1 00143EB1 IdIOHandlerSocket.pas ( 371) IdIOHandlerSocket.TIdIOHandlerSocket.Open0054C2C3 0014B2C3 IdExplicitTLSClientServerBase.pas ( 258) IdExplicitTLSClientServerBase.TIdExplicitTLSClient.Connect0057267A 0017167A UnConexaoGmail.IdConnectThroughHttpProxy00632AE2 00231AE2 UnMain.pas ( 740) UnMain.TSendMailThread.Execute00632D63 00231D63 UnMain.pas ( 800) UnMain.TTestGMailValidAccountThread.ConnectGMailAccountToTestIfIsValid0042972F 0002872F Classes.ThreadProc00404F6E 00003F6E System.ThreadWrapper

TStopWatch – Classe para marcar o tempo entre operações (funcionalidades) – no nosso caso para medir o tempo gasto para o envio de emails.

1. Suporte a recurso de importação de emails via delimitador “;” – inserindo para o nosso dataset do tipo THVDataSetStream. Foi implementada uma rotina que captura estes dados.

2. Classe TConexaoGmail – utilizada para encapsular as funcionalidades básicas de conexão com o GMail e envio de mensagens.

Segue abaixo um trecho do código-fonte da classe TConexaoGmail:

unit UnConexaoGmail;

{ …}procedure TConexaoGmail.InitMailMessage;var idText: TIdText; MBuilder: TIdMessageBuilderRtf;begin

Page 18 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

IdMessage.ContentType := 'multipart/mixed'; //'text/plain'; //'application/x-zip-compressed'; IdMessage.Clear; IdMessage.Charset := 'UTF-8'; //'iso-8859-1'; IdMessage.Encoding := meDefault; // IdMessage.Body := edBody; IdMessage.Sender.Text := edSenderEMail; IdMessage.From.Name := edSenderName; IdMessage.From.Address := edSenderEMail; IdMessage.ReplyTo.EMailAddresses := edSenderEmail; IdMessage.Recipients.EMailAddresses := edToEmail; IdMessage.Subject := edSubject; IdMessage.Priority := edPriority; IdMessage.CCList.EMailAddresses := edCCEMail; IdMessage.ReceiptRecipient.Text := ''; IdMessage.BccList.EMailAddresses := edBCCEMail;

if (AttachmentFile <> '') then if FileExists(AttachmentFile) then TIdAttachmentFile.Create(IdMessage.MessageParts, AttachmentFile); // TIdAttachmentFile.Create(IdMessage.MessageParts, 'C:\test.txt');

idText := TIdText.Create(IdMessage.MessageParts); idText.Body.Clear; idText.Body.Text := edBody.Text; idText.ContentType := 'text/html';

end;

procedure TConexaoGmail.AddSSLHandler;var SSLHandler: TIdSSLIOHandlerSocketOpenSSL;begin SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP); // SSL/TLS handshake determines the highest available SSL/TLS version dynamically SSLHandler.SSLOptions.Method := sslvSSLv23; SSLHandler.SSLOptions.Mode := sslmClient; SSLHandler.SSLOptions.VerifyMode := []; //SSLHandler.PassThrough := False; SSLHandler.SSLOptions.VerifyDepth := 0; SMTP.IOHandler := SSLHandler;end;

procedure TConexaoGmail.InitSASL;var IdUserPassProvider: TIdUserPassProvider; IdSASLCRAMMD5: TIdSASLCRAMMD5; IdSASLCRAMSHA1: TIdSASLCRAMSHA1; IdSASLPlain: TIdSASLPlain; IdSASLLogin: TIdSASLLogin; IdSASLSKey: TIdSASLSKey; IdSASLOTP: TIdSASLOTP; IdSASLAnonymous: TIdSASLAnonymous;

IdSASLExternal: TIdSASLExternal;begin IdUserPassProvider := TIdUserPassProvider.Create(SMTP); IdUserPassProvider.Username := edUserName; IdUserPassProvider.Password:= edPassword;

IdSASLCRAMSHA1 := TIdSASLCRAMSHA1.Create(SMTP); IdSASLCRAMSHA1.UserPassProvider := IdUserPassProvider; IdSASLCRAMMD5 := TIdSASLCRAMMD5.Create(SMTP); IdSASLCRAMMD5.UserPassProvider := IdUserPassProvider; IdSASLSKey := TIdSASLSKey.Create(SMTP); IdSASLSKey.UserPassProvider := IdUserPassProvider; IdSASLOTP := TIdSASLOTP.Create(SMTP); IdSASLOTP.UserPassProvider := IdUserPassProvider;

Page 19 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx

IdSASLAnonymous := TIdSASLAnonymous.Create(SMTP); IdSASLExternal := TIdSASLExternal.Create(SMTP); IdSASLLogin := TIdSASLLogin.Create(SMTP); IdSASLLogin.UserPassProvider := IdUserPassProvider; IdSASLPlain := TIdSASLPlain.Create(SMTP); IdSASLPlain.UserPassProvider := IdUserPassProvider;

SMTP.SASLMechanisms.Add.SASL := IdSASLCRAMSHA1; SMTP.SASLMechanisms.Add.SASL := IdSASLCRAMMD5; SMTP.SASLMechanisms.Add.SASL := IdSASLSKey; SMTP.SASLMechanisms.Add.SASL := IdSASLOTP; SMTP.SASLMechanisms.Add.SASL := IdSASLAnonymous; SMTP.SASLMechanisms.Add.SASL := IdSASLExternal; SMTP.SASLMechanisms.Add.SASL := IdSASLLogin; SMTP.SASLMechanisms.Add.SASL := IdSASLPlain;end;

function TConexaoGmail.SendEmail: Boolean;begin Result := True; InitMailMessage; try SMTP.Send(IdMessage); except on E:Exception do begin Result := False; fErrorException := E.Message; end;end;

end;

Conclusão

Abordamos nesta edição implementações distintas sobre envio de emails utilizando o excelente framework Indy bem como demais componentes para exibição no formato HTML como o THTMLViewer. Também discorremos sobre dois aplicativos construídos para solidificar nosso aprendizado na construção destas funcionalidades de conexão e envio. Construímos classes para encapsular estes métodos, de modo que não precisaremos escrever longos códigos-fonte para rotinas de comunicação com os componentes Indy, que por sua vez comunicam-se com as dll´s da implementação SSL e consequentemente a conexão com o servidor SMTP do GMail. Tudo isso agora está feito de forma transparente pra você leitor, usufruindo gratuitamente dos fontes disponíveis para aprendizado e de base para novos projetos, alterando eles ou construindo outros novos; acrescentando novas funcionalidades ou aprimorando as já existentes (como possibilidade de anexar vários arquivos de uma só vez, ou suporte a imagens como anexos inseridos a partir do HD do usuário, mala direta com templates pré-definidos a serem enviados ao GMail, etc). Enfim, o horizonte das possibilidades cabe a você leitor, portanto, bons frutos com a leitura, bom aprendizado e é claro, bons testes também!! Até a próxima edição!

Sobre o Autor

TheClub

E-mail: [email protected]

Page 20 of 20Artigos

17/05/2016file:///R:/Restrito/Revistas/BASE/ModeloPDF.aspx