Fórum list index out of bounds(1) - Envio de email? #360311
25/06/2008
0
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.
Adriano_servitec
Curtir tópico
+ 0Posts
25/06/2008
Micheus
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
Gostei + 0
25/06/2008
Adriano_servitec
LIdMessage.Headers.Values[´Return-Receipt-To´] := ´adrianoservitec@uol.com.br´; //FSMTP_From; //LIdMessage.Headers.Add(´Disposition-Notification-To: "Fulano de Tal" <adrianoservitec>´);
LIdMessage.Headers.Add(´Return-Receipt-To=adrianoservitec@uol.com.br´);
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.
Gostei + 0
25/06/2008
Adriano_servitec
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
:(
Gostei + 0
26/06/2008
Micheus
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)