Envio de E-mail com Delphi 2010, Indy 10, OpenSSL e GMail

Código-Fonte, Delphi, Open Source, Programação abril 7th, 2011

Depois de alguma horas de pesquisa, devido, dificuldades no envio de e-mail usando uma conta do GMAIL e outras; tivemos que modificar o código para usar autenticação segura. Interessante que em algumas máquinas funcionava sem o serviço de autenticação (qdo descobrir o motivo eu digo, rsrsrs). Compartilho com vocês essas informações.

Alguns erros reportados durante as falhas de envio de e-mail foram: “Must issue a STARTTLS command first” (indicando que seria necessário TLS ou, autenticação de segurança) e depois de implentado o código abaixo sem baixar a OpenSSL na máquina “Could not load SSL library”.

Modificamos então, o código para permitir o envio de e-mails usando autenticação ou não. Usando autenticação, é necessário instalar a OpenSSL  e, declarar alguns units no seu código. Na web encontrei vários artigos sobre isso, mas, a maioria com informações incompletas, agradeço mesmo assim essas informações, pois me auxiliaram a entender o que precisaria fazer e, juntando as peças (copiando e colando) montei o código abaixo.

As ferramentas e recursos de desenvolvimento utilizadas são: Delphi 2010, Indy 10 (disp. no Delphi), OpenSSL e testado com uma conta do GMAIL.

Veja o código:

Clique para continuar lendo “Envio de E-mail com Delphi 2010, Indy 10, OpenSSL e GMail”

Tags: , , ,

JEDI VCS – Controle de Versões

Código-Fonte, Delphi, Dicas Blog, Ferramentas, Open Source, Programação setembro 16th, 2010

Introdução

Tenho visto que muitos colegas não usam nenhum sistema de controle de versões; uns por acharem que é muito caro, outros muito difícil de implementar. Para quem usa o Delphi, por exemplo, existem algumas opções interessantes; sem nenhum custo e de fácil implementação.

Eu diria que, se vc. nunca usou um sistema de controle de versões, não sabe quanta dor de cabeça poderia ter evitado; Lembra aquele código que vc modificou, não deu certo e, quando vc. viu já era tarde para recuperar o antigo. Ou pior, seu computador deu problema (HD pifou, foi roubado, etc), backup desatualizado e dai?.

Um sistema integrado de “Controle de Versões” resolve todos esses problemas. Vou citar aqui o “JEDI VCS” cujo projeto está disponível no “sourceforge”. É muito fácil de instalar, eu uso com o meu banco de dados preferido, o Firebird.

JEDI VCS

O JediVCS versão 4.5 é a versão estável mais recente; a 2.5 está na Beta 3. Eu instalei o Jedi há alguns anos atrás e

Clique para continuar lendo “JEDI VCS – Controle de Versões”

Tags: , , ,

Delphi 2010, Problema com “encoding” usando TXMLDocument

Código-Fonte, Dicas Blog, Programação dezembro 17th, 2009

Estava recompilando alguns componentes do meu sistema, desenvolvidos originalmente com o Delphi 7 para o Delphi 2010, e percebi o seguinte erro ao tentar abrir um XML gerado pela aplicação compilada com o D2010 “caractere inválido encontrado no texto“.

Na verdade o XML contêm campos acentuados usando “ISO-8859-1″ e, após algum tempo perdido descobri que o código abaixo, embora estivesse correto não gerava o XML como deveria; ou seja, a propriedade “encoding” simplesmente não é adicionada (como deveria) no cabeçalho do XML. Isso não acontece no Delphi 7, por exemplo.

01 – Codigo que não funciona no Delphi 2010:

Clique para continuar lendo “Delphi 2010, Problema com “encoding” usando TXMLDocument”

Tags: , , ,

Lendo o XML gerado pelo WINMFD2 da Bematech

Código-Fonte, Dicas Blog outubro 16th, 2009

Para quem não conheçe o WINMFD2 é um utilitário da BEMATECH que pode ser usado para a captura da memória de fita detalhe do ECF que gera o arquivo em vários formatos; inclusive XML, o qual vamos usar de exemplo:

Vou usar como exemplo o XML abaixo (que é exatamente igual ao formato do XML gerado pelo WINMFD2):

01 – Exemplo XML gerado pelo utilitário WINMFD2:

< ?xml version="1.0"?>
<documentos>
<cupom_fiscal>
	<hora_inicio>15/10/2009 15:22:00</hora_inicio>
	<coo>0005</coo>
	<ccf>0009</ccf>
	<venda_de_item>
		<ordem>1</ordem>
		<codigo>0000000000001</codigo>
		<descricao>PRODUTO EXEMPLO 1</descricao>
		<quantidade>1</quantidade>
		<valor_unitario>2,34</valor_unitario>
		<valor_bruto>2,34</valor_bruto>
		<aliquota>FF</aliquota>
	</venda_de_item>
	<venda_de_item>
		<ordem>2</ordem>
		<codigo>0000000000002</codigo>
		<descricao>PRODUTO EXEMPLO 2</descricao>
		<quantidade>1</quantidade>
		<valor_unitario>2,34</valor_unitario>
		<valor_bruto>2,34</valor_bruto>
		<aliquota>FF</aliquota>
	</venda_de_item>
	<subtotal>4,68</subtotal>
	<acrescimo>0,00</acrescimo>
	<desconto>0,00</desconto>
	<total>4,68</total>
	<soma_pgto>4,68</soma_pgto>
	<troco>0,00</troco>
</cupom_fiscal>
<cupom_fiscal>
	<hora_inicio>15/10/2009 15:24:02</hora_inicio>
	<coo>0007</coo>
	<ccf>0010</ccf>
	<venda_de_item>
		<ordem>1</ordem>
		<codigo>0000000000001</codigo>
		<descricao>PRODUTO EXEMPLO 1</descricao>
		<quantidade>1</quantidade>
		<valor_unitario>2,34</valor_unitario>
		<valor_bruto>2,34</valor_bruto>
		<aliquota>FF</aliquota>
	</venda_de_item>
	<subtotal>2,34</subtotal>
	<acrescimo>0,00</acrescimo>
	<desconto>0,00</desconto>
	<total>2,34</total>
	<soma_pgto>2,34</soma_pgto>
	<troco>0,00</troco>
</cupom_fiscal>
</documentos>

Clique para continuar lendo “Lendo o XML gerado pelo WINMFD2 da Bematech”

Tags: , , ,

Videos de Treinamento x YouTube

Código-Fonte, Dicas Blog, Programação abril 24th, 2009

Na matéria CamStudio, crie seus vídeos de treinamento; falamos em criação de vídeos usando uma ferramenta open source (CamStudio). Mas, após criar os vídeos, qual a melhor maneira de distribuí-los?. Os vídeos normalmente ultrapassam facilmente a barreira dos 100MB (cada um) e, não é nada prático ficar distribuindo isso cliente por cliente; na verdade, muitas vezes desisti de fazê-lo porque não via uma forma de distribuição que fosse viável.

Surgiu o YouTube!!! (novidade né, rsrsrs). Mas, o que vou falar agora pode ser novidade para alguns. Repare que vc pode distribuir os seus vídeos de treinamento no YouTube e personalizar o seu sistema, usando uma API de programação disponibilizada pela Google para criar sua própria interface e trazer os seus vídeos na tela do seu sistema; tipo (Menu Ajuda/Videos de Treinamento).

Clique para continuar lendo “Videos de Treinamento x YouTube”

Tags: , ,

ACBrNFe – Componente OpenSource p/Nota Fiscal Eletrônica

Código-Fonte, Delphi, Open Source, Programação abril 22nd, 2009

Mais componente (gratuíto) para: gerar, transmitir e obter respostas do WebService da SEfAZ; o componente é disponibilizado em duas versões: ACBr_NFe_CAPICOM e ACBr_NFe_OpenSSL.

A ACBr_NFE_CAPICOM; usa as DLL da Capicom da Microsoft (para conexão) e MSXML (para assinatura e validação do XML da NFe). Limitada para uso com Delphi e Windows. Pode ser usada com certificados tipo A1 ou A3.

Clique para continuar lendo “ACBrNFe – Componente OpenSource p/Nota Fiscal Eletrônica”

Tags: , ,

Distribuição da NF-e autorizada para o Destinatário (Parte II)

Código-Fonte janeiro 26th, 2009

Vimos no artigo anterior como gerar o arquivo da NF-e compartilhada à partir do XML da NF-e assinada e do XML do protocolo de autorização da NF-e. Nesse artigo vamos demonstrar o uso do componente Indy do Delphi para enviar o arquivo da NF-e compartilhada via E-mail; complentando-se assim, o processo de compartilhamento da NF-e com o destinatário:

Vamos partir do código anterior e implementar os recursos de envio do e-mail para o destinatário. Nesse exemplo, fazemos uso do componente Indy também disponível nas distribuições do Delphi.

Adicione os seguintes componentes no seu programa: idSMTP e idMessage; em seguida escreva o código abaixo:

Código-fonte para comandar o envio do e-mail da NF-e compartilhada para o destinatário:

begin
    // configura servidor smtp
    idSMTP1.Host := 'smtp.empresaxyz.com.br';
    idSMTP1.Username := 'controlenfe@empresaxyz.com.br';
    idSMTP1.Password := 'xxxxxxxx';
 
    // configurando mensagem
    // e-mail da sua loja
    idmessage1.ContentType := 'text/html';
    idmessage1.from.address := 'controlenfe@empresazyz.com.br';
    // e-mail destinatario
    idmessage1.recipients.emailaddresses := 'contato@empresaxyz.com.br';
    // Assunto (titulo E-mail)
    idmessage1.subject := 'Empresa XYZ (Envio automático NF-e) '+DateTimeToStr(now);
 
    // Corpo da Mensagem (use aqui um HTML ou texto que deseja enviar
    // juntamente com a mensagem.
    idmessage1.body.Add(
    'Prezado Cliente,'+
    'Obrigado por comprar na Empresa XYZ. Estamos encaminhando esse e-mail contendo'+
    ' em anexo, o arquivo eletrônico da sua Nota Fiscal de Compra; de acordo com '+
    ' o "Manual de Integração do Contribuinte" da Nota Fiscal Eletrônica. '+
    'Sds,'+
    'A administração!'+
    '
'+
    'PS. Caso tenha alguma dúvida favor entrar em contato conosco '+
    'pelos fones: xx xxx xxxxx ou E-mail: xxxxxx@xxxxx.xx.x'+
    ';
'+
    '<strong>Favor não responder!</strong>. Esse e-mail foi enviado automáticamente pelo'+
    ' nosso servidor após registro da autorização de uso da NF-e para a vossa '+
    'Empresa.'
    );
    // ou carregue uma mensagem pré-definida em um arquivo
    //idmessage1.Body.LoadFromFile('mensageNFe_destinatario.html');
 
    // anexa o XML da NFe compartillhada no e-mail
    TIdAttachment.create(idmessage1.MessageParts,
    TFileName('c:\nfe_arquivos\compartilhadas\procNFE.xml'));
 
    // conecta com o servidor SMTP
    idSMTP1.connect;
    try
    // Envia o e-mail
    idSMTP1.send(idmessage1);
    finally
        idSMTP1.Disconnect;
    end;
end;

Com isso concluímos o artigo sobre a Nota Fiscal Eletrônica Compartilhada, na primeira parte (parte I) geramos o arquivo da NF-e compartilhada à partir dos arquivos XML da NF-e assinada e do XML do recibo de autorização da NF-e. Nesse ultimo artigo vimos como enviar esse arquivo via e-mail para o destinatário.

Espero que essas informações sejam úteis para vcs e que eliminem com isso, algumas horas de pesquisa e trabalho.

Tags: , , , ,

Distribuição da NF-e autorizada para o Destinatário (Parte I)

Código-Fonte janeiro 23rd, 2009

Atualmente, a SEFAZ não está verificando a distribuição das NF-e para o destinatário; mas com o decorrer do processo esse recurso (previsto no projeto) será exigido em breve (conforme “nota” no próprio manual). Em resumo, o arquivo eletrônico da NF-e, quando autorizada, deverá ser enviado pelo emitente para o destinatário de acordo com a cláusula décima do AJUSTE SINIEF 07/05.

Clique para continuar lendo “Distribuição da NF-e autorizada para o Destinatário (Parte I)”

Tags: , ,

Consulta CEP com Webbroker e JavaScript

Código-Fonte, Delphi, JavaScript, Novidades, Sem categoria dezembro 24th, 2008

Uma das funções mais interessantes hoje em qualquer tipo de cadastro que contenha endereço postal é a busca pelo CEP, para obter o endereço, bairro, cidade e estado; muitos desenvolvedores mantém uma base de dados do CEP local (em cada cliente) para que possa ser usada pela aplicação durante a edição dos endereços no cadastro.

O “buscarcep.com.br” é um WebService de consulta de CEP gratuíto e foi usado nesse exemplo. Esse serviço pode facilitar a vida de muita gente, já que usando o serviço, não mais será necessário manter uma base de dados do CEP local (em cada cliente).

Abaixo dou um exemplo de como implementar isso em uma aplicação WEB usando Delphi Webbroker e Javascript (para dar um toque Web 2.0 na aplicação).

Clique para continuar lendo “Consulta CEP com Webbroker e JavaScript”

Tags: , , ,

Armazenando os dados do Certificado Digital Selecionado

Código-Fonte, Delphi dezembro 22nd, 2008

Sempre que necessário assinar ou enviar dados para o serviço da NF-e; é necessário informar o nome do certificado digital; é interessante, então, armazenar esses dados de forma que sempre que houver necessidade de usar o certificado vc possa informar os dados armazenados evitando assim que tenha que selecionar o mesmo à cada comando;

Como fazer isso então? A primeira coisa a fazer é inserir uma opção de seleção do certificado na sua aplicação e nela, um evento onde após a seleção do certificado onde vc. guarda em um arquivo esses dados; veja abaixo o código que permite armazenar os dados do certificado (usando recursos da NFe_UTIL.dll):

Ex.01: Salvando dados do Certificado Digital Selecionado

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var Util:NFe_Util_Interface;
    i:integer;
    F: TextFile;
begin
  Util := CoUtil.Create;
  Try
  nomeCertificado := '';
  i:= Util.PegaNomeCertificado(nomeCertificado, msg);
 
  if i > 1 then
      MessageDlg( 'Ocorreu uma falha no acesso ao repositório de certificados digitais...'+#13+#13+msg, mtInformation, [mbOk], 0)
  else
      begin
        AssignFile(F, 'CertificadoDigital.res');
        Rewrite(F);
        Write(F,nomeCertificado);
        CloseFile(F);
      end;
  finally
     Util := nil;
  end;

Ex.02 Recuperando dados do certificado digital selecionado

1
2
3
4
5
6
7
8
9
10
11
var F: TextFile;
    nomecertificado: string;
begin
  if FileExists('CertificadoDigital.res') then
  begin
     AssignFile(F, 'CertificadoDigital.res');
     Reset(F);
     Readln(F,nomecertificado); // a variável nomecertificado vai receber os dados armazenados.
     CloseFile(F);
  end;
end;

Com isso, problema resolvido, após ler os dados do certificado na variável “nomecertificado” vc pode passar essa informação, por exemplo, para assinar o XML como abaixo (o exemplo usa uma função da NFE_UTIL.dll):

          i:= Util.Assinar(xmlNaoAssinado, 'infNFe', nomecertificado, 
               xmlAssinado, mensagem);
          // a variável "nomercertificado" já contendo os dados do certificado 
          // conforme obtido no exemplo 02.

Tags: ,