Esqueci a senha UserControl - enviar email

Delphi

14/09/2012

Olá. Estou tentando enviar email pelo UserControl na opção Esqueci minha Senha. Mas só quando clico nela, ou qualquer parte que envia emails (como qd se cadastra no sistema) dá o erro: Winsock getHostName failed.
Já tentei configurar com email da hotmail, yahoo, do servidor do meu site e sempre dá este erro. Não tenho certeza se é alguma configuração errada q fiz no UCMail ou sei lá o quê. Se alguem tiver alguma idéia da resolução, desde já agradeço.
Rodrigo Barra

Rodrigo Barra

Curtidas 0

Respostas

Rodrigo Barra

Rodrigo Barra

14/09/2012

O erro está dando nesta função:
function ALgetLocalHostName: String;
var
{$IFDEF DELPHI12_UP}
  Buffer: PAnsiChar;
{$ELSE}
  Buffer: array [0 .. 255] of char;
{$ENDIF}
  WSAData: TWSAData;
begin
  WSAData.wVersion := 0;
  WSAStartup(MAKEWORD(2, 2), WSAData);
  try
    Buffer := '';
    if gethostname(Buffer, SizeOf(Buffer)) <> 0 then
      raise Exception.Create('Winsock GetHostName failed');
    Result := StrPas(Buffer);
  finally
    if WSAData.wVersion = 2 then
      WSACleanup;
  end;


E está caindo nesta mensagem: raise Exception.Create('Winsock GetHostName failed');
Alguém que conhece sobre sockets, envio de email em delphi tem alguma luz de como posso resolver o problema.
Obrigado.
GOSTEI 0
Alisson Santos

Alisson Santos

14/09/2012

Gostaria de saber se debugou o programa, e caso tenha feito, o que ele retorna nas linhas.
Pois como disse pode ser configuração, pode ser bloqueio do proprio sistema operacional, pode ser bloqueio do proprio servidor de e-mail não aceitando spam.
Entendeu, tem que verificar se está trazendo tudo correto e ver qual é a linha errada, caso realmente esteja errada.
GOSTEI 0
Rodrigo Barra

Rodrigo Barra

14/09/2012

Abaixo o método EsqueceuSenha:

procedure TUserControl.ActionEsqueceuSenha(Sender: TObject);
var
  FDataset, FDataPer: TDataSet;
begin
  FDataset := DataConnector.UCGetSQLDataset('Select * from ' +
    TableUsers.TableName + ' Where ' + TableUsers.FieldLogin + ' = ' +
    QuotedStr(TfrmLoginWindow(FFormLogin).EditUsuario.Text));

  FDataPer := DataConnector.UCGetSQLDataset('select ' + TableUsers.FieldUserName +
     ' from ' + TableUsers.TableName + ' Where ' + TableUsers.FieldUserID +
    ' = ' + FDataset.FieldByName(TableUsers.FieldProfile).AsString);
  try
    if not FDataset.IsEmpty then
   //if FDataset.RecordCount > 0 then
    begin
      {$IFNDEF FPC}
      MailUserControl.EnviaEsqueceuSenha
        (FDataset.FieldByName(TableUsers.FieldUserID).AsInteger,
        FDataset.FieldByName(TableUsers.FieldUserName).AsString,
        FDataset.FieldByName(TableUsers.FieldLogin).AsString,
        FDataset.FieldByName(TableUsers.FieldPassword).AsString,
        FDataset.FieldByName(TableUsers.FieldEmail).AsString,
        FDataPer.FieldByName(TableUsers.FieldUserName).AsString)
      {$ENDIF}
    end
    else
      MessageDlg(UserSettings.CommonMessages.InvalidLogin, mtWarning,
        [mbOK], 0);
  finally
    FDataset.Close;
    FDataset.Free;
  end;
end;
GOSTEI 0
Rodrigo Barra

Rodrigo Barra

14/09/2012

Primeiramente, se o usuário não existir ele dá o seguinte erro:
Exception Class TDBXError: Unnexpected end for comando line 1, column 50 no segundo select.

FDataPer := DataConnector.UCGetSQLDataset('select ' + TableUsers.FieldUserName +
     ' from ' + TableUsers.TableName + ' Where ' + TableUsers.FieldUserID +
    ' = ' + FDataset.FieldByName(TableUsers.FieldProfile).AsString);
GOSTEI 0
Alisson Santos

Alisson Santos

14/09/2012

mais nesse teste que você fez o usuário existe ou não?
GOSTEI 0
Rodrigo Barra

Rodrigo Barra

14/09/2012

Já se o usuário existir ele dá erro naquela função que postei lá em cima: ALgetLocalHostName;
Esta função está na classe SMTPClient. E o erro "Winsock gethostname failed."

Fiz umas alterações que diz neste artigo, https://www.devmedia.com.br/usercontrol/485 , mas que não fizeram diferença.
GOSTEI 0
Mário Reis

Mário Reis

14/09/2012

Rodrigo,

Esta função funciona:
Function GetIPAddress: String;
type pu_long = ^u_long;
var varTWSAData : TWSAData;
varPHostEnt : PHostEnt;
varTInAddr : TInAddr;
namebuf : Array[0..255] of ansichar;
begin
try
try
If WSAStartup($101,varTWSAData) <> 0 Then
Result := ''
Else Begin
gethostname(namebuf,sizeof(namebuf));
varPHostEnt := gethostbyname(namebuf);
varTInAddr.S_addr := u_long(pu_long(varPHostEnt^.h_addr_list^)^);
Result := inet_ntoa(varTInAddr);
End;
except
Result := '';
end;
finally
WSACleanup;
end;
end;

Me dê fio de bak.
Abr
GOSTEI 0
Erick

Erick

14/09/2012

Boa Tarde, como se abre o código fonte do UserControl? Estou com o mesmo problema, mas não consigo abrir o arquivo .PAS dos forms, só aparece em .DCU aqui
GOSTEI 0
Mário Reis

Mário Reis

14/09/2012

Dando dois clicks em cima do DPK respectivo.
GOSTEI 0
Erick

Erick

14/09/2012

Boa Noite, esse código funcionou mesmo? E onde coloco ele? Estou com o mesmo problema!
GOSTEI 0
POSTAR