Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Ajuda para envio de e-mails em delphi


Kali

Pergunta

Olá amigos da Scripbrasil.

Então, estou utilizando um script para enviar e-mails para multiplos destinários pelo Delphi.

Segue o código-fonte:

var
  // objetos necessários para o funcionamento
  IdSSLIOHandlerSocket: TIdSSLIOHandlerSocket;
  IdSMTP: TIdSMTP;
  IdMessage: TIdMessage;
  CaminhoAnexo: string;
begin
  // instanciação dos objetos
  IdSSLIOHandlerSocket := TIdSSLIOHandlerSocket.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.AuthenticationType := atLogin;
    IdSMTP.Port := 465;
    IdSMTP.Host := 'smtp.gmail.com';
    IdSMTP.Username := 'usuario';
    IdSMTP.Password := 'senha';
 
    // 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;
    end;
 
    // Configuração da mensagem
    IdMessage.From.Address := 'meu.email@gmail.com';
    IdMessage.From.Name := 'Meu Nome';
    IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address;
    IdMessage.Recipients.EMailAddresses := 'destinatario@email.com';
    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;

Até ai tudo bem, o envio vai perfeitamente para minha caixa de entrada, porém quando envio para vários destinários ao mesmo tempo á minha aplicação trava.

Queria saber como para minha aplicação autenticar o envio conforme enviado para o destinário com um delay de 3 segundos para envio de cada mensagem, por por exemplo:

Enviado e-mail para : destinario1@hotmail.com - OK!

Delay (3) segundos.

Enviado e-mail para : destinario2@hotmail.com - OK!

Delay (3) segundos.

Enviado e-mail para : destinario3@hotmail.com - OK!

Delay (3) segundos.

Envio de e-mail market completo, você já pode fechar á aplicação.

Com base nesse script em perl.

#!/usr/local/bin/perl
     
    $ARGC=@ARGV;
    if ($ARGC !=4) {
       printf "Você deve ter digitado os comandos de forma errada\n";
       printf "Veja como usar corretamente...\n";
       printf "perl $0 <mailist> <remetente\@mail.com> <assunto> <corpo.html>\n";
       printf "Exemplo: perl $0 lista01.txt peu\@msn.com Ola index.html\n";
       exit(1);
    }
     
    $mailtype = "content-type: text/html";
    $sendmail = '/usr/sbin/sendmail';
    $sender = $ARGV[1];
    $subject = $ARGV[2];
    $efile = $ARGV[0];
    $emar = $ARGV[0];
    open(FOO, $ARGV[3]);
    @foo = <FOO>;
    $corpo = join("\n", @foo);
    open (BANDFIT, "$emar") || die "Can't Open $emar";
    $cont=0;
     
    while(<BANDFIT>) {
       ($ID,$options) = split(/\|/,$_);
       chop($options);
       foreach ($ID) {
          $recipient = $ID;
          open (SENDMAIL, "| $sendmail -t");
          print SENDMAIL "$mailtype\n";
          print SENDMAIL "Subject: $subject\n";
          print SENDMAIL "From: $sender\n";
          print SENDMAIL "To: $recipient\n\n";
          print SENDMAIL "$corpo\n\n";
          close (SENDMAIL);
          $cont=$cont+1;
          printf "$cont Enviado para $recipient";
       }
    }
    close(BANDFIT);

Abraços, espero que alguém me ajude!!

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0

use

voce pode usar o comando

Sleep(3000); // espera 3 segundos

entretanto voce pode enviar para mais de um email usando ponto e virgulas entre os emails

exemplo

IdMessage.Recipients.EMailAddresses := 'destinatario1@email.com; destinatario2@email.com; destinatario3@email.com' ;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Então, eu consigo enviar para mais de um e-mail porém a aplicação trava.

Eu queria enquanto estivese enviando abrir um allocconsole, tipo.

Enquanto está enviando os e-mails abriria um AllocConsole é mostraria os emails que estão sendo enviados tipo

Mensagem enviada para destinario1@hotmail.com - OK

Mensagem enviada para destinario2@hotmail.com - OK

Mensagem enviada para destinario3@hotmail.com - OK

Mensagem enviada para destinario4@hotmail.com - OK

Conforme o envio é o script em perl, abrçs

Link para o comentário
Compartilhar em outros sites

  • 0

não testei ... mas faça as correções se precisar

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  // objetos necessários para o funcionamento
  IdSSLIOHandlerSocket: TIdSSLIOHandlerSocket;
  IdSMTP: TIdSMTP;
  IdMessage: TIdMessage;
  CaminhoAnexo: string;
  cont,i : integer;
begin
  cont := 0; 
  for i := 1 to Memo1.Lines.Count do
  begin
     // instanciação dos objetos
     IdSSLIOHandlerSocket := TIdSSLIOHandlerSocket.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.AuthenticationType := atLogin;
       IdSMTP.Port := 465;
       IdSMTP.Host := 'smtp.gmail.com';
       IdSMTP.Username := 'usuario';
       IdSMTP.Password := 'senha';

       // 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;
       end;

       // Configuração da mensagem
       IdMessage.From.Address := 'meu.email@gmail.com';
       IdMessage.From.Name := 'Meu Nome';
       IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address;
       IdMessage.Recipients.EMailAddresses := Memo1.lines.String[i];
       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
         cont := cont + 1;
         IdSMTP.Send(IdMessage);
         MessageDlg('Mensagem enviada com sucesso.', mtInformation, [mbOK], 0);

         MessageDlg(inttostr(cont) + ' Enviado por ' + IdMessage.From.Name  + ' para ' + Memo1.lines.String[i], 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;
   sleep(3000); // espera 3 segundos
   end; // finaliza o For
end;

end.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Funcionou perfeitamente como eu queria amigo, tenho somente mais uma dúvida.

Então, cada SMTP possuí um limite de envios diários. Queria saber como faço para adicionar multiplos servidores SMTP e limitar o envio de cada um por exemplo

SMTP: smtp.gmail.com

Username: minhaconta@gmail.com

Password: senha123

Port: 465

Eu queria que esse SMTP envia-se apenas 10 e-mails após enviar os 10 e-mails ele trocaria de SMTP para um segundo.

Abrçs

Link para o comentário
Compartilhar em outros sites

  • 0

use da mesma forma na configuração do SMTP

use um 2º Memo e coloque, nessa ordem, essa configuração

Porta , Host, Usuario e Senha

465;smtp.gmail.com;usuario;senha;

vou colocar separado do seu código principal para voce entender como extrair essa informação do memo e jogar em variaveis

cada variavel vai receber o valor ( texto ) que esta entre ponto e virgulas

OBS: tem um pequeno detalhe ai que vou deixar voce descobrir...

procedure TForm1.Button1Click(Sender: TObject);
var x : integer; s,Texto : string;
    Porta, Host, Username, Password : string;
begin
   for x := 0 to Memo1.Lines.Count do
      begin
         s := memo1.lines.Strings[x];
         while Pos(';', S) > 0 do
            begin
               Texto := copy(S,1,Pos(';', S));
               delete(s,1,length(trim(Texto)));
               case x of
                 0: Porta := Texto;
                 1: Host := Texto;
                 2: Username := Texto;
                 3: Password := Texto;
               end;

               showmessage(Texto);
            end;
      end;


end;

depois voce passa para o codigo esses valores

       for i := 1 to 10 do // Limitar em 10 emails por Host
       begin
          // Configuração do SMTP
          IdSMTP.IOHandler := IdSSLIOHandlerSocket;
          IdSMTP.AuthenticationType := atLogin;
          IdSMTP.Port := Porta
          IdSMTP.Host := Host;
          IdSMTP.Username := Username;
          IdSMTP.Password := Password;
       end;

ao finalizar o envio de 10 emails para o mesmo Host , voce pega o proximo valor configurado no Memo e repete o processo

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  // objetos necessários para o funcionamento
  IdSSLIOHandlerSocket: TIdSSLIOHandlerSocket;
  IdSMTP: TIdSMTP;
  IdMessage: TIdMessage;
  CaminhoAnexo: string;
  cont,i,j,k : integer;
  Porta, Host, Username, Password : string;
begin
  cont := 0;
  for i := 1 to Memo1.Lines.Count do
  begin
     // instanciação dos objetos
     IdSSLIOHandlerSocket := TIdSSLIOHandlerSocket.Create(Self);
     IdSMTP := TIdSMTP.Create(Self);
     IdMessage := TIdMessage.Create(Self);

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

       for i := 1 to 10 do // Limitar em 10 emails por Host
       begin
          // Configuração do SMTP
          IdSMTP.IOHandler := IdSSLIOHandlerSocket;
          IdSMTP.AuthenticationType := atLogin;
          IdSMTP.Port := Porta
          IdSMTP.Host := Host;
          IdSMTP.Username := Username;
          IdSMTP.Password := Password;
       end;

       // 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;
       end;

       // Configuração da mensagem
       IdMessage.From.Address := 'meu.email@gmail.com';
       IdMessage.From.Name := 'Meu Nome';
       IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address;
       IdMessage.Recipients.EMailAddresses := Memo1.lines.String[i];
       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
         cont := cont + 1;
         IdSMTP.Send(IdMessage);
         MessageDlg('Mensagem enviada com sucesso.', mtInformation, [mbOK], 0);

         MessageDlg(inttostr(cont) + ' Enviado por ' + IdMessage.From.Name  + ' para ' + Memo1.lines.String[i], 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;
   sleep(3000); // espera 3 segundos
   end; // finaliza o For
end;

end.

as alterações no seu código ficam por sua conta... mas preste atenção a lógica de programação

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...