list index out of bounds(1) - Envio de email?

25/06/2008

1

Pessoal, quero enviar e-mail pelo Delphi 7 usando a paleta Indy, mais não estou conseguindo.
O código é este aqui, mais nada ainda de enviar

procedure Tf_EnviarPed.Button2Click(Sender: TObject);
var
  LidSMTP: TIdSMTP;
  LIdMessage : TIdMessage;
  I : Integer;
begin
  LidSMTP   := TIdSMTP.Create(nil);
  while not (LidSMTP.Connected) do   // enquanto não conectar, o programa vai ficar tentando conectar infinitamente.
  begin
    try
      LidSMTP.Disconnect;
      LidSMTP.Host          := edtHost.Text;
      LidSMTP.Port          := 25;
      LidSMTP.Username      := edtUsuario.Text;
      LidSMTP.Password      := edtSenha.Text;

      LidSMTP.AuthenticationType   := atLogin;
      LidSMTP.Connect;
      if not LidSMTP.Connected then
        Exit;

      LIdMessage := TIdMessage.Create(nil);
      try
        LIdMessage.From.Text                   := emailDe.Text;
        LIdMessage.Recipients.EMailAddresses   := edtPara.Lines.Text;
        LIdMessage.MessageParts.Clear;
        {:Foi criado para enviar a mensagem que esta na descricao}
        LIdMessage.Body.Text := emailMensagem.Text;

        for I := 0 to emailanexo.Items.Count - 1 do
            TIdAttachment.Create(LIdMessage.MessageParts, TFileName(emailanexo.Items[I].Caption));
            LIdMessage.Subject       := edtAssunto.Text; //File_Name + ´ em ´ + FormatDateTime(´dd/mm/yyyy hh:mm´, Now);
            LIdMessage.Priority      := mpHighest;
            LidSMTP.Send(LIdMessage);
            MessageDlg(´E-Mail enviado com sucesso!´, mtInformation,[mbOk], 0);
        {:Estou verificando se retorna alguma mensagem de volta para meu e-mail}
        LIdMessage.Headers.Values[´Return-Receipt-To´] := ´adrianoservitec@uol.com.br´; //FSMTP_From;
        //LIdMessage.Headers.Add(´Disposition-Notification-To: "Fulano de Tal" <adrianoservitec>´);
        LIdMessage.SaveToFile(´c:\Logerros.txt´);
        {:Fim da modificação}
      finally
        LIdMessage.Free;
      end;
    except
      {Não conseguiu conectar, tenta conectar novamente em 1 minuto}
      Sleep(1000);
      Continue;
    end; // try
  end; // while
    LidSMTP.Disconnect;
    LidSMTP.Free;
end;



Mosta este erro aqui
[b:7ac9a128f3] list index out of bounds(1)[/b:7ac9a128f3]

Ele para nesta parte aqui, desta unit
[b:7ac9a128f3]unit IdHeaderList;[/b:7ac9a128f3]
procedure TIdHeaderList.SetValue(const Name, Value: string);
var
  I: Integer;
begin
  I := IndexOfName(Name);
  if Value <> ´´ then    {Do not Localize}
  begin
    if I < 0 then
    begin
      I := Add( ´´ );    {Do not Localize}
    end; //if I < 0 then
    if FFoldLines then
    begin
      DeleteFoldedLines( I );
      FoldAndInsert( Name + FNameValueSeparator + Value, I );
    end
    else
    begin
      Put( I, Name + FNameValueSeparator + Value );
    end;  //else..FFoldLines
  end //if Value <then>= 0 then
    begin
      if FFoldLines then
      begin
        DeleteFoldedLines( I );
      end;
      Delete( I );
    end; //if I >= 0 then
  end;  //else .. if Value <> ´´ then    {Do not Localize}
end;

Bem nesta linha aqui
[b:7ac9a128f3] FoldAndInsert( Name + FNameValueSeparator + Value, I );[/b:7ac9a128f3]
Verifiquei esta linha ai e diz o seguinte em negrito
Name = [b:7ac9a128f3]From[/b:7ac9a128f3]
FNameValueSeparator = [b:7ac9a128f3][size=18:7ac9a128f3]:[/size:7ac9a128f3][/b:7ac9a128f3]
Value = [b:7ac9a128f3]adrianoservitec@uol.com.br[/b:7ac9a128f3]
I = [b:7ac9a128f3]0[/b:7ac9a128f3]

Agora não sei se para ali, ou aqui nesta linha
[b:7ac9a128f3]DeleteFoldedLines( I );[/b:7ac9a128f3]

e aponta pro erro
[color=red:7ac9a128f3]list index out of bounds(1)[/color:7ac9a128f3]

Aonde posso arrumar algo que realmente funcione e que posso mandar os e-mail pelo Delphi?
Grato
Adriano.


Responder

Posts

25/06/2008

Micheus

[b:879cc0cca2]Adriano_Servitec[/b:879cc0cca2], realmente parece estranho aquele [i:879cc0cca2]DeleteFoldedLines( I );[/i:879cc0cca2], em uma condição que não haverá nada na lista. Aquele procedimento deveria avaliar também a existência ou não de algo na lista.

Mas, observando esta parte do seu código:
LIdMessage.Headers.Values[´Return-Receipt-To´] := ´adrianoservitec@uol.com.br´; //FSMTP_From;
//LIdMessage.Headers.Add(´Disposition-Notification-To: "Fulano de Tal" <adrianoservitec>´);

vemos que vc está tentando acessar o valor do header ´Return-Receipt-To´, que é quando ele está fazendo a chamada ao procedimento SetValue. Mas este ´campo´ não existe na lista.
O procedimento mais apropriado para inserí-lo, no meu entendimento, seria:
LIdMessage.Headers.Add(´Return-Receipt-To=adrianoservitec@uol.com.br´);

o par Nome-Valor, em um TStringList, é viabilizado quando vc usa o ´=´ que é o delimitador padrão (pode ser alterado via propriedade [i:879cc0cca2]NameValueSeparator[/i:879cc0cca2]).

Mas acho que vc também poderia utilizar a propriedade [i:879cc0cca2]ReceiptRecipient[/i:879cc0cca2] do seu componente [i:879cc0cca2]LIdMessage[/i:879cc0cca2].

Experimente...

Abraços


Responder
[b:41fc0b03d9]Adriano_Servitec[/b:41fc0b03d9], realmente parece estranho aquele [i:41fc0b03d9]DeleteFoldedLines( I );[/i:41fc0b03d9], em uma condição que não haverá nada na lista. Aquele procedimento deveria avaliar também a existência ou não de algo na lista. Mas, observando esta parte do seu código:
LIdMessage.Headers.Values[´Return-Receipt-To´] := ´adrianoservitec@uol.com.br´; //FSMTP_From;
//LIdMessage.Headers.Add(´Disposition-Notification-To: "Fulano de Tal" <adrianoservitec>´);
vemos que vc está tentando acessar o valor do header ´Return-Receipt-To´, que é quando ele está fazendo a chamada ao procedimento SetValue. Mas este ´campo´ não existe na lista. O procedimento mais apropriado para inserí-lo, no meu entendimento, seria:
LIdMessage.Headers.Add(´Return-Receipt-To=adrianoservitec@uol.com.br´);
o par Nome-Valor, em um TStringList, é viabilizado quando vc usa o ´=´ que é o delimitador padrão (pode ser alterado via propriedade [i:41fc0b03d9]NameValueSeparator[/i:41fc0b03d9]). Mas acho que vc também poderia utilizar a propriedade [i:41fc0b03d9]ReceiptRecipient[/i:41fc0b03d9] do seu componente [i:41fc0b03d9]LIdMessage[/i:41fc0b03d9]. Experimente... Abraços
Olá [b:41fc0b03d9]micheus[/b:41fc0b03d9], sempre ajudando amigo.

Bom modifiquei o retorno, mais meu problema maior não era ali, alias eu ia verificar isso depois amigo, mais o negócio está pegando mesmo é nas Units do Indy, será que está bugado estas units aqui? Eu segui passo a passo o artigo que veio na revista ClubeDelphi pra mim e não funciona também, para naquele ponto.

O procedimento da revista é praticamente o mesmo que eu fiz ai, apenas modifiquei alguns campos, mas mesmo assim tanto o que está na revista como este ai, simplesmente não quer funcionar, também vi outros artigos na net e tentei fazer igual e para naquele ponto também.

Obrigado amigo pela ajuda.
Adriano.


Responder
Pior [b:be908fa767]Micheus[/b:be908fa767] que deve estar bugado sim o o pacote Indy aqui, fiz o mesmo teste no BDS2006 com os componente Indy daquele Delphi e funcionou.

procedure Tf_EnviarPed.Button2Click(Sender: TObject);
var
  LidSMTP: TIdSMTP;
  LIdMessage : TIdMessage;
  I : Integer;
begin
  LidSMTP   := TIdSMTP.Create(nil);
  while not (LidSMTP.Connected) do   // enquanto não conectar, o programa vai ficar tentando conectar infinitamente.
  begin
    try
      LidSMTP.Disconnect;
      LidSMTP.Host          := edtHost.Text;
      LidSMTP.Port          := 25;
      LidSMTP.Username      := edtUsuario.Text;
      LidSMTP.Password      := edtSenha.Text;

      LidSMTP.AuthType   := atDefault;
      LidSMTP.Connect;
      if not LidSMTP.Connected then
        Exit;

      LIdMessage := TIdMessage.Create(nil);
      try
        LIdMessage.From.Text                   := emailDe.Text;
        LIdMessage.Recipients.EMailAddresses   := edtPara.Lines.Text;
        LIdMessage.MessageParts.Clear;
        {:Foi criado para enviar a mensagem que esta na descricao}
        LIdMessage.Body.Text := emailMensagem.Text;

        for I := 0 to emailanexo.Items.Count - 1 do
            //TIdAttachment.Create(LIdMessage.MessageParts, TFileName(emailanexo.Items[I].Caption));
            LIdMessage.Subject       := edtAssunto.Text; //File_Name + ´ em ´ + FormatDateTime(´dd/mm/yyyy hh:mm´, Now);
            LIdMessage.Priority      := mpHighest;
            LidSMTP.Send(LIdMessage);
            MessageDlg(´E-Mail enviado com sucesso!´, mtInformation,[mbOk], 0);
        {:Modificado por Adriano - Estou verificando se retorna alguma mensagem de volta para meu e-mail}
        //LIdMessage.Headers.Values[´Return-Receipt-To´] := ´adrianoservitec@uol.com.br´; //FSMTP_From;
        LIdMessage.Headers.Add(´Return-Receipt-To=adrianoservitec@uol.com.br´);
        //LIdMessage.Headers.Add(´Disposition-Notification-To: "Fulano de Tal" <adrianoservitec@uol.com.br>´);
        LIdMessage.SaveToFile(´c:\Logerros.txt´);
        {:Fim da modificação}
      finally
        LIdMessage.Free;
      end;
    except
      {Não conseguiu conectar, tenta conectar novamente em 1 minuto}
      Sleep(1000);
      Continue;
    end; // try
  end; // while
    LidSMTP.Disconnect;
    LidSMTP.Free;
end;



Só que aqui nesta linha ele não aceitou
[b:be908fa767]//TIdAttachment.Create(LIdMessage.MessageParts, TFileName(emailanexo.Items[I].Caption));[/b:be908fa767]

E aqui tive que mudar assim
[b:be908fa767] LidSMTP.AuthType := atDefault;[/b:be908fa767]

E não estou trazendo no e-mail recebido o assunto, mais isso é o de menos, posso com mais calma arrumar, pq esta pulando esta linha aqui
[b:be908fa767]LIdMessage.Subject := edtAssunto.Text; [/b:be908fa767]

Mais acho que o problema é que pelo jeito meu Delphi 7 esta condenado
:(


Responder

26/06/2008

Micheus

[b:e3c1cfb18c]Adriano_Servitec[/b:e3c1cfb18c], vc já experimentou desinstalar seu Indy7 e reinstalá-lo?

Caso interesse, neste [url=http://www.atozed.com/indy/Installer/Files.EN.aspx]link[/url] (Atozed) há as versões novas para download.

Abraços


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira