27 de jul. de 2010

Enviando e-mails com Indy através de uma conta do GMail

Além de toda a parafernália que a gente já sabe, para enviar emails pro Gmail, você precisa acrescentar as seguinte linhas:
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
with SSL do begin
  Destination := SMTPHost + ':' + IntToStr(SMTPPort);
  Host := SMTPHost;
  MaxLineAction := maException;
  Port := SMTPPort;
  DefaultPort := 0;
  SSLOptions.Method := sslvTLSv1;
  SSLOptions.Mode := sslmUnassigned;
  SSLOptions.VerifyMode := [];
  SSLOptions.VerifyDepth := 0;
end;
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseExplicitTLS;
SMTP.UserName := SMTPUser;
SMTP.Password := SMTPPassword;

Porquê? Porque para enviar emails via Gmail, só via conexão segura, SSL (sslvTLSv1) .Nesse caso, as DLLs do OpenSSL tem de estar disponiveis pra sua aplicação.

Pra baixar o OpenSSL que rode com o Indy, vá em http://indy.fulgan.com/SSL/ e baixe de acordo com sua versão do Indy. Eu uso a versão OpenSSL 0.9.8h juntamente com o Indy que vem no Delphi 2007 e funciona bem. A unica limitação que achei foi fazer funcionar numa DLL ISAPI sob o IIS, pelo fato de que o IIS já tem seu próprio SSL.

Bom proveito.

26 de jan. de 2010

Carregando uma imagem no banco de dados

Faz tempo que não tem postagem nova, então vamos lá. Uma dica que resolve uma pergunta recorrente em alguns fórums de Delphi.

Como fazer pra gravar uma imagem num campo Blob? Fiz uma função para isso, a seguir:
procedure LoadPictureToDataset(FileName: TFileName; Dataset: TDataset; PictureFieldName: String);
begin
if StrIsEmpty(FileName) then
raise Exception.Create('Nome de arquivo não pode ser vazio.');
Assert(Dataset <> Nil);
Assert(Dataset.FindField(PictureFieldName) <> Nil, 'Nome de campo inválido: ' + PictureFieldName);
Assert(not (Dataset.FieldByName(PictureFieldName) is TGraphicField), 'Campo ' + PictureFieldName + ' não suporta imagens');
TBlobField(Dataset.FieldByName(PictureFieldName)).LoadFromFile(FileName);
end;