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.

Posts Relacionados

Tags: , , , ,



10 Comentários

  • At 2009.02.03 12:14, Adriano said:

    Olá Caio,

    Bem enviando o email ele esta, porém a linha onde esta o envio do anexo esta dando erro quando compilo, na linha onde esta o erro aponta a seguinte mensagem
    A linha onde da o erro:
    TIdAttachment.Create(idmessage1.MessageParts,
    TFileName(‘C:\Sunrise_net\Projeto NotaFiscalEletronica\NFE_XML\XML_Destinatario\procNFE.xml’));
    A mensagem de erro:

    [DCC Error] nfe.pas(1007): E2034 Too many actual parameters

    O que pode ter ocorrido?

    Desde já agradeço

    • At 2009.02.03 20:18, admin said:

      Olá Adriano,

      Como vc. me disse no comentário anterior, vc. usa o DS 2007; não tive oportunidade de usá-lo aqui ainda, esse código foi testado no Delphi 7 e BDS 2006; então só se houve mudança na lista de parâmetros do TIdAttachment.

      Sds, Caio

      • At 2009.03.31 10:16, Alaercio said:

        Tudo bem Caio, gostaria que me ajudasse no seguinte, utilizei o exemplo acima, e funcionou perfeitamente, o envio, mas por solicitação de clientes,e oque parece é necessario que o destinatario confirme que recebeu anota, entao inclui, o codigo abaixo para solicitar a confirmação de leitura:

        IdMessage1.ReceiptRecipient.Text := IdMessage1.From.Text; //autoresposta

        mas estou tendo um problema , no outlook quando aparece a mensagem de enviar confirmacao qdo clico sim, aparece o seguinte erro:

        ‘o Outlook Express não pode enviar a confirmação’

        nao é problema com provedor, pois ela nem chega a ir para a caixa de saida, se mando um outro email normal esta funcionando, ocorre somente qdo envio pelo programa,
        cheguei a entrar em contato com a Microsoft, mas disseram que nao dão suporte se foi enviado por programa de terceiros, se ja teve esta situacao e puder me ajudar, estou a uma semana tentando resolver e não consigo

        abraço e obrigado antecipadamente

        • At 2009.05.06 10:10, Marcio Luis said:

          Olá Caio , estou tentando usar o codigo para distribuição para destinatario, mas estou tendo problemas com SPAM.

          Pesquisando muito na net descobri , que muitos anti-spams bloqueiam o INDY por alguns motivos.

          estou utilizando Indy9, sem o anexo vai, mas qndo coloco
          o anexo , pimba , spam.

          temos que tentar achar uma solucao,senao o sistema fica muito vuneravel.

          ja fiz varias configuracoes .. e nada …
          vou instalar o INDY10 .. para ver se resolve ..

          Att. MArcio Luis

          segue o codigo para analise.

          procedure TfrmNFE.BitBtn5Click(Sender: TObject);
          var
          DeEmail : String;
          DeNome : String;
          ParaEmail : String;
          Assunto : String;
          Anexo : TStringList ;
          i : Integer;
          IdAnexo : TIdAttachment;
          lTextPart: TIdText;
          sTmp : String;

          begin

          DeEmail := ‘xxxxxx@ssssssss.com.br’;
          DeNome := usuprd;
          ParaEmail := ‘yyyyyy@gmail.com.br’;

          // configura servidor smtp
          IdSMTP1.AuthenticationType := aTlogin;
          idSMTP1.Port:=25;//porta é sempre essa não mude isso
          IdSMTP1.Host := ssssssss.com.br’;
          IdSMTP1.Username := ‘x8x8x8x8′;
          IdSMTP1.Password := ‘********’;

          //——————————————————————————-
          // Cria a Estrutura da Mensagem:
          //——————————————————————————-
          IdMessage1.Clear;
          IdMessage1.Date := Now;
          IdMessage1.IsEncoded := True;
          //IdMessage1.AttachmentEncoding := ‘MIME’;

          IdMessage1.Headers.Values['X-Library'] := ”;
          IdMessage1.MessageParts.Clear;
          IdMessage1.Encoding := meMIME; // meDefault;
          IdMessage1.Priority := mpNormal; // mpHighest ou Priority := TIdMessagePriority(0);
          IdMessage1.ContentType := ‘multipart/mixed’; //’multipart/alternative’ ; //’multipart/mixed’; // obrigatoriamente! application/xml
          IdMessage1.CharSet := ‘ISO-8859-1′; // NOSSA LINGUAGEM PT-BR (Latin-1)!!!!

          //——————————————————————————-
          // Define o Remetente e Destinatário:
          //——————————————————————————-
          IdMessage1.From.Name :=’sss S/A’; //nome de quem manda
          IdMessage1.From.Address := DeEmail; // ou ‘[EMAIL PROTECTED]‘ //end de retorno
          //IdMessage1.From.Text := DeNome; // From.Text:=UserName+’ ‘+UserSurname+’ ‘;
          IdMessage1.From.Text := ‘empresa-’ + DeNome + ”;
          //IdMessage1.BccList.Clear;
          //IdMessage1.BccList.Add.Address := ‘marcio@sss.com.br’; //com cópia oculta
          // IdMessage.CCList.EMailAddresses := lista de com cópia
          // IdMessage.BccList.EMailAddresses := lista de com cópia oculta
          IdMessage1.ReplyTo.EMailAddresses := DeEmail;
          IdMessage1.Recipients.Clear;
          IdMessage1.Recipients.EMailAddresses := Trim(ParaEmail);
          //IdMessage1.ReceiptRecipient.Text := DeEmail; // auto-resposta (confirmação de leitura!)
          IdMessage1.Subject := ‘nfe ‘ + timetostr(now) ; //Trim( Assunto );
          //——————————————————————————-
          // Adiciona o CORPO da Mensagem:
          //——————————————————————————-

          // IdMessage1.Body.Clear;
          // IdMessage1.Body.Add(‘ Corpo ‘);
          // idmessage1.Body.Add(‘TESTE -NFE DISTRIBUICAO’);
          // idmessage1.Body.Add(datetostr(date));
          // idmessage1.Body.Add(timetostr(now));
          // idmessage1.Body.Add(‘Deu Certo’);

          lTextPart:=TIdText.Create(IdMessage1.MessageParts);
          lTextPart.Body.Text:=’ ‘;
          lTextPart.ContentType:=’text/plain’;
          lTextPart:=TIdText.Create(IdMessage1.MessageParts);
          lTextPart.Body.Text:=’oi aqui é o marcio’ ; // modo texto

          //——————————————————————————-
          // Define o ANEXO: (pode haver looping para vários anexos)
          //——————————————————————————-

          // TIdAttachment.create(idmessage1.MessageParts,TFileName(‘c:\nfe_arquivos\enviados\procNFE.xml’));
          // IdAnexo := TIdAttachment.create(idmessage1.MessageParts,TFileName(‘c:\nfe_arquivos\enviados\42090382636911000174550030001673307771851012-nfe.xml’));
          //IdAnexo.BoundaryBegin := true;
          // IdAnexo.ContentType := ‘application/xml’;
          // IdAnexo.Headers.Values['X-Library'] := ”;
          // IdAnexo.BoundaryEnd;

          // sTmp := ‘c:\nfe_arquivos\enviados\42090382636911000174550030001673307771851012-nfe.xml’;
          // with TIdAttachment.create(idmessage1.MessageParts,TFileName(sTmp)) do
          // begin
          // Headers.Add(‘Content-ID: ‘);
          // ContentType := ‘application/xml’;
          // ContentDisposition := ‘attachment’;
          // ContentTransfer := ‘base64′;
          // FileName := ExtractFileName(sTmp);

          // end;

          // IdAnexo.Boundary:= ‘sendfile-attachment-boundary’;
          // IdAnexo.Headers.Values['X-Library'] :=”;
          //IdAnexo.Headers.Add(‘Content-ID: ‘);
          //IdAnexo.Headers.Add(‘Content-ID: ‘);

          // IdAnexo.FileName := ExtractFileName(sTmp);
          // IdAnexo.Headers.Add(‘Content-ID: ‘);

          // anexo.Add(‘c:\nfe_arquivos\enviados\42090382636911000174550030001673307771851012-nfe.xml’);

          // for i := 0 to Pred(Anexo.Count) do
          // begin
          // if FileExists(Anexo.Strings[i]) then
          // begin
          // try
          // //IdAnexo := TIdAttachmentFile.Create(IdMessage.MessageParts, Anexo.Strings[i]);iind10
          // //IdAnexo :=TIdAttachment.create(idmessage1.MessageParts,TFileName(‘c:\nfe_arquivos\compartilhadas\procNFE.xml’));
          // IdAnexo :=TIdAttachment.create(idmessage1.MessageParts,TFileName(Anexo.Strings[i]));
          // except
          // end;
          // end;
          // end;

          {

          ‘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’+
          ‘;’+
          Favor não responder!. 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

          //mlb TIdAttachment.create(idmessage1.MessageParts,
          //MLB 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;

          idSMTP1.connect;
          try
          // Envia o e-mail
          try
          IdSMTP1.Send(IdMessage1);
          except
          on E: Exception do
          MessageDlg(E.Message, mtError, [mbOK], 0);
          end;
          finally
          idSMTP1.Disconnect;
          end;

          end;

          • At 2009.05.06 12:10, admin said:

            Não observei esse problema em nossos testes. Mas é um caso para ser analisado sim, vou verificar.

            abços

            • At 2010.01.14 19:28, Carlos Fernando said:

              Caio muito bom o artigo mas estou tendo um problema serio, tentei outros exemplos e acontece o mesmo.
              O problema e o seguinte:
              o arquivo XML ao inves de ir em anexo ele aparece logo abaixo do corpo do email.
              Se nào colocar o corpo dai ele vai certo.

              Mas eu queria um corpo simples com alguns dizeres mais o anexo de forma anexa mesmo nao junto com o corpo.

              Se souber a resposta envie um email

              Obrigado

              Carlos

              • At 2010.01.18 08:33, admin said:

                Olá Carlos,

                O exemplo faz exatamente isso, o arquivo XML vai como anexo. Repare que, como é um anexo em formato “texto” (o XML nada mais é do que um arquivo texto). Os programas de e-mail normalmente mostram o conteúdo no final da mensagem.

                Sds

                • At 2010.10.05 14:16, wellington said:

                  estou com problemas ao configurar o smtp, está exibindo uma mensagm de falha de configuração pode me ajudar?

                  • At 2010.10.27 07:27, Adriana said:

                    Olá Caio.

                    Estava vendo os posts sobre a distribuição da NF-e para o destinatário e fiquei com uma dúvida.

                    Existe um padrão para o nome do arquivo que é enviado ao destinatário?

                    Como vi no seu exemplo, foi utilizado procNFe.xml e no Manual de Integração da NFe, não achei um padrão para esse arquivo…

                    Obrigada!!!

                    • At 2011.09.07 06:25, Renan Kemp said:

                      Adriano
                      Tem que fazer assim no Delphi 2010

                      TIdAttachmentFile.Create(IdMessage.MessageParts, ‘C:Arquivo.pdf’ );

                      You must be logged in to post a comment.