Bom dia pessoal,
Tive um problema com o envio do outlookexpress e com o novo tambem na questão de anexos e decidi correr atrás mais pro lado do thunderbird, foi meio chato , mas consegui fazer funcionar, e pelo o que sei , a procedure abaixo funcionara com qualquer cliente de email, desde que ele esteja como padrão do sistema operacional.
Vocês vão precisar :
-Componentes Jedi.
-Unit JclMapi.
Passos:
1 - Criar uma aplicacação nova.
2 - Inserir um button na mesma.
3 - Declarar na secao uses a unit JclMapi.
4 - Declarar a função
procedure EnviarEmailPadrao(sListaEmail:TStringList;sListaAnexos:TStringList;sAssunto:string;sTextoEmail:string);
Acima da seção private.
5 - Implementar ela :
procedure TForm1.EnviarEmailPadrao(sListaEmail:TStringList;sListaAnexos:TStringList;sAssunto:string;sTextoEmail:string);
var TmpEmail: TjclEmail;
var i:integer;
begin
TmpEmail := TjclEmail.Create;
//Adicionando Emailas
for I := 0 to sListaEmail.Count-1 do
TmpEmail.Recipients.Add(sListaEmail[i]);
//Adicionando Anexos
for I := 0 to sListaAnexos.Count-1 do
TmpEmail.Attachments.Add(sListaAnexos[i]);
TmpEmail.Subject := sAssunto;
TmpEmail.Body := sTextoEmail;
TmpEmail.Send(True);
end;
6 - O evento onClick do Button deverá ficar assim:
procedure TForm1.btn1Click(Sender: TObject);
var sListaEmail:TStringList;
var slistaAnexos:TStringList;
var sAssunto,sTextoEmail:string;
begin
//Cria as 2 String List pois a procedure EnviaEmail varre as stringlist em busca de email's e anexos.
sListaEmail := TStringList.Create();
slistaAnexos := TStringList.Create();
//Populando a lista de emails
sListaEmail.Clear();
sListaEmail.Add('gustavo@taltal.com.br');
sListaEmail.Add('outro@taltal.com.br');
//Populando a lista de anexos
slistaAnexos.Clear();
slistaAnexos.Add('C:\Temp\gustavo.txt');
slistaAnexos.Add('C:\Temp\gustavo.sql');
//Adicionando o Assunto a email
sAssunto := 'Teste de Email';
//Adicionando o Texto do email
sTextoEmail := 'Programa para envio de email padrao para sistemas que tenham algum programa de email padrao instalado.';
//Enviando o Email pela Procedure
EnviarEmailPadrao(sListaEmail,slistaAnexos,sAssunto,sTextoEmail);
Pronto Galera!
O que ele faz?
Voce vai adicionar tantos seus destinatarios de emails, quanto seus anexos de email , em 2 stringList, adicionar o assunto e o texto do email e enviá-los para a procedure, o trabalho sujo, ela faz... hahaha!
Obs :
-Testei somente com o thunderbird, mas deverá funcionar com qualquer cliente que esteja como PADRÃO no SO.
- Compilado pelo Delphi Xe2.
- Cliente de Email padrão : Thunderbird v. 10.0.1, released: February 12th, 2012.
DOWNLOAD EXEMPLO AQUI
Gustavo Luís Hinterholz - Dicas e informação sobre Programação.
Desenvolvimento em Delphi, php;Banco de Dados Mysql,Firebird,Postgree.
quarta-feira, 15 de fevereiro de 2012
quarta-feira, 14 de dezembro de 2011
Completar string com algum caracter até determinado tamanho.
Bom dia,
Segue abaixo uma função bem simples, mas que dá uma mão bem grande quando não estamos em dias bons de lógica. hahahaha.
Ela consiste em completar um string ate determinado tamanho com uma outra string a ser mandada, tanto para o lado direito , quanto para o lado esquerdo.
Exemplo:
Tenho o numero 1 e quero completálo com zeros a esquerda, quero completar com tamanho máximo de 10 a string final.
PreencheCaracter('0','1','E';'10').
A mesma coisa pode ser feita com o lado direito, apenas mudando uma variavel da função.
PreencheCaracter('0','1','D';'10').
Passos:
1 - Declarar a função na seção desejada , private,public ... etc :
function PreencheCaracter(sCaracter:char;sTexto,sLado:string;iTamanho:integer):string;
2 - Implementar a função abaixo da seção "Iimplementation".
Obs:Foi utilizado um form chamado FrmTeste.
function TfrmTeste.PreencheCaracter(sCaracter:char;sTexto,sLado:string;iTamanho:integer):string;
var i:Integer;
begin
if Length(sTexto) > iTamanho then Begin
sTexto := Copy(sTexto, 1, iTamanho);
End
else if sLado='E' then begin
sTexto := StringofChar(sCaracter, iTamanho-length(sTexto))+sTexto;
end
else if sLado='D' then begin
sTexto := sTexto+ StringofChar(sCaracter, iTamanho-length(sTexto));
end;
Result := sTexto ;
end;
Segue abaixo uma função bem simples, mas que dá uma mão bem grande quando não estamos em dias bons de lógica. hahahaha.
Ela consiste em completar um string ate determinado tamanho com uma outra string a ser mandada, tanto para o lado direito , quanto para o lado esquerdo.
Exemplo:
Tenho o numero 1 e quero completálo com zeros a esquerda, quero completar com tamanho máximo de 10 a string final.
PreencheCaracter('0','1','E';'10').
A mesma coisa pode ser feita com o lado direito, apenas mudando uma variavel da função.
PreencheCaracter('0','1','D';'10').
Passos:
1 - Declarar a função na seção desejada , private,public ... etc :
function PreencheCaracter(sCaracter:char;sTexto,sLado:string;iTamanho:integer):string;
2 - Implementar a função abaixo da seção "Iimplementation".
Obs:Foi utilizado um form chamado FrmTeste.
function TfrmTeste.PreencheCaracter(sCaracter:char;sTexto,sLado:string;iTamanho:integer):string;
var i:Integer;
begin
if Length(sTexto) > iTamanho then Begin
sTexto := Copy(sTexto, 1, iTamanho);
End
else if sLado='E' then begin
sTexto := StringofChar(sCaracter, iTamanho-length(sTexto))+sTexto;
end
else if sLado='D' then begin
sTexto := sTexto+ StringofChar(sCaracter, iTamanho-length(sTexto));
end;
Result := sTexto ;
end;
quarta-feira, 23 de novembro de 2011
Conexão Delphi com banco de dados Mysql 5.1 - Delphi
Bom dia galera,
Hoje vou mostrar uma conexão do delphi com o banco de dados Mysql versão 5.1, mas que pode ser adaptado para a conexão em outras versões.
Primeiramente a conexão vai ser feita em um datamodule chamado dmConexao, onde contera um componente TSQLConnection e quantas TSQLQuery acharem necessárias, no meu caso, so coloquei uma query.
vamos la ...
Passos:
1 - Criar um datamodule com o nome dmConexao.
2 - Colocar um Componente de conexão ao banco do tipo TSQLConnection e uma query do tipo TSQLQuery, ambos da aba DBExpress.
3 - Configurar o componente de conexão ao banco, conforme o print:
sIp,sBase,sUser,sPassword:string;
begin
Try
sIp := 'localhost';
sBase := 'nome_banco';
sUser := 'nome_usuario_banco';
sPassword := 'senha_usuario_banco';
SQLConnection.Connected := False;
SQLConnection.Params.Clear();
SQLConnection.DriverName := 'MySQL (Core Lab)';
SQLConnection.GetDriverFunc := 'getSQLDriverMYSQL50';
SQLConnection.LibraryName := 'dbxopenmysql50.dll';
SQLConnection.VendorLib := 'libmysql.dll';
SQLConnection.LoginPrompt := False;
SQLConnection.Params.Append('Database='+sBase);
SQLConnection.Params.Append('User_Name='+sUser);
SQLConnection.Params.Append('Password='+sPassword);
SQLConnection.Params.Append('HostName='+sIp);
SQLConnection.Connected := True;
except
On E:exception do begin
Application.MessageBox(PChar('Não foi possivel conectar a base'+#13#10+
E.Message),
'Configurações de Conexão',MB_ICONERROR);
Application.Terminate();
end;
end;
end;
ConectaBanco();
end;
Hoje vou mostrar uma conexão do delphi com o banco de dados Mysql versão 5.1, mas que pode ser adaptado para a conexão em outras versões.
Primeiramente a conexão vai ser feita em um datamodule chamado dmConexao, onde contera um componente TSQLConnection e quantas TSQLQuery acharem necessárias, no meu caso, so coloquei uma query.
vamos la ...
Passos:
1 - Criar um datamodule com o nome dmConexao.
2 - Colocar um Componente de conexão ao banco do tipo TSQLConnection e uma query do tipo TSQLQuery, ambos da aba DBExpress.
3 - Configurar o componente de conexão ao banco, conforme o print:
4 - Colocar os arquivos libmysql.dll,qtintf70.dll,dbxopenmysql50.dll na pasta corrente do projeto e caso for colocar o exe em outra pasta, copiar para la também.
5 - Criar uma procedure igual abaixo:
procedure TdmConexao.ConectaBanco();
varsIp,sBase,sUser,sPassword:string;
begin
Try
sIp := 'localhost';
sBase := 'nome_banco';
sUser := 'nome_usuario_banco';
sPassword := 'senha_usuario_banco';
SQLConnection.Connected := False;
SQLConnection.Params.Clear();
SQLConnection.DriverName := 'MySQL (Core Lab)';
SQLConnection.GetDriverFunc := 'getSQLDriverMYSQL50';
SQLConnection.LibraryName := 'dbxopenmysql50.dll';
SQLConnection.VendorLib := 'libmysql.dll';
SQLConnection.LoginPrompt := False;
SQLConnection.Params.Append('Database='+sBase);
SQLConnection.Params.Append('User_Name='+sUser);
SQLConnection.Params.Append('Password='+sPassword);
SQLConnection.Params.Append('HostName='+sIp);
SQLConnection.Connected := True;
except
On E:exception do begin
Application.MessageBox(PChar('Não foi possivel conectar a base'+#13#10+
E.Message),
'Configurações de Conexão',MB_ICONERROR);
Application.Terminate();
end;
end;
end;
6 - Chamar a procedure ConectaBanco no evento on Create do datamodule:
procedure TdmConexao.DataModuleCreate(Sender: TObject);
beginConectaBanco();
end;
Observações :
- Caso ocorra alguma mensagem de erro ao conectar, verifique:
- Se as dlls estao na pasta de output do exe.
- Se as variaveis sIp,sBase,sUser,sPassword estao com valores corretos.
##ATENÇÃO ##
O zip com os codigo fontes do datamodule e as dlls , seguem abaixo :
quinta-feira, 10 de novembro de 2011
Procedure para fechar aplicação e remover software da memória - Delphi
Boa Tarde,
Me deparei essa semana com um problema, no Windows 7 e Windows server 2008, ao fechar a aplicação com os Comandos : Close, ou Application.Terminate, a mesma continuava em memória, por isso efetuei a procedure abaixo .
Considerando um form chamado frmTeste.
procedure frmTeste.FechaAplicacao();
Var
h : HWND;
Begin
h:= FindWindow( nil, 'Caption da Tela onde a procedure vai ser chamada.' );
{Exemplo
h:= FindWindow( nil, 'Menu Principal' );}
if h <> 0 then begin
PostMessage( h, WM_CLOSE, 0, 0 );
end
End;
{Chamar a funcao diretamente como FechaAplicacao() , no local desejado.
By
Gustavo Luís H.
}
Me deparei essa semana com um problema, no Windows 7 e Windows server 2008, ao fechar a aplicação com os Comandos : Close, ou Application.Terminate, a mesma continuava em memória, por isso efetuei a procedure abaixo .
Considerando um form chamado frmTeste.
procedure frmTeste.FechaAplicacao();
Var
h : HWND;
Begin
h:= FindWindow( nil, 'Caption da Tela onde a procedure vai ser chamada.' );
{Exemplo
h:= FindWindow( nil, 'Menu Principal' );}
if h <> 0 then begin
PostMessage( h, WM_CLOSE, 0, 0 );
end
End;
{Chamar a funcao diretamente como FechaAplicacao() , no local desejado.
By
Gustavo Luís H.
}
Arredondamento Inteligente por Casa Decimal - Delphi
Função de Arredondamento.
Considerando ...um form chamado frmTeste.
A sintaxe Basica dela é ArredondaPorDecimal(valorAserArredondado,CasaDecimalQueSeraArredondado).
Caso o valor decimal a ser arredondado seja >=5 entao arredondara, caso contrario não.
Exemplos :
ArredondaPorDecimal(14,987,2).
Retorno := 14,99
ArredondaPorDecimal(14,924,2).
Retorno := 14,92
function frmTeste.ArredondaPorDecimal(valor:Real;casasDecimais:integer):Real;
var
Fator, Fracao: Extended;
begin
{Eleva o Valor 10 ao expoente mandado na variavel casasDecimais}
Fator:= IntPower(10, casasDecimais);
{ Multiplica o valor pelo fator e faz a conversao de string e depois para float novamente para evitar arredondamentos. }
valor:= StrToFloat(FloatToStr(valor* Fator));
{Pega a Parte Inteira do Numero}
Result := Int(valor);
{Pega a Parte Fracionaria}
Fracao:= Frac(valor);
{Faz a regra de arredondamento}
if Fracao >= 0.5 then
Result := Result + 1
else if Fracao <= -0.5 then
Result := Result - 1;
{O valor Final inteiro divide por 100 para transformar em decimal novamente.}
Result := Result / Fator;
end;
{By
Gustavo Luis H.
}
Considerando ...um form chamado frmTeste.
A sintaxe Basica dela é ArredondaPorDecimal(valorAserArredondado,CasaDecimalQueSeraArredondado).
Caso o valor decimal a ser arredondado seja >=5 entao arredondara, caso contrario não.
Exemplos :
ArredondaPorDecimal(14,987,2).
Retorno := 14,99
ArredondaPorDecimal(14,924,2).
Retorno := 14,92
function frmTeste.ArredondaPorDecimal(valor:Real;casasDecimais:integer):Real;
var
Fator, Fracao: Extended;
begin
{Eleva o Valor 10 ao expoente mandado na variavel casasDecimais}
Fator:= IntPower(10, casasDecimais);
{ Multiplica o valor pelo fator e faz a conversao de string e depois para float novamente para evitar arredondamentos. }
valor:= StrToFloat(FloatToStr(valor* Fator));
{Pega a Parte Inteira do Numero}
Result := Int(valor);
{Pega a Parte Fracionaria}
Fracao:= Frac(valor);
{Faz a regra de arredondamento}
if Fracao >= 0.5 then
Result := Result + 1
else if Fracao <= -0.5 then
Result := Result - 1;
{O valor Final inteiro divide por 100 para transformar em decimal novamente.}
Result := Result / Fator;
end;
{By
Gustavo Luis H.
}
terça-feira, 8 de novembro de 2011
Criação e permissões de Usuários - MYSQL
- Neste primeiro comando criamos e damos permissões totais a um usuario com acesso local.
GRANT ALL PRIVILEGES ON *.* TO usuario@localhost IDENTIFIED BY 'senha' WITH GRANT OPTION;
- Neste segundo comando criamos e damos permissões totais a um usuario com acesso remoto.
GRANT ALL PRIVILEGES ON *.* TO usuario@'%' IDENTIFIED BY 'senha' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO usuario@localhost IDENTIFIED BY 'senha' WITH GRANT OPTION;
- Neste segundo comando criamos e damos permissões totais a um usuario com acesso remoto.
GRANT ALL PRIVILEGES ON *.* TO usuario@'%' IDENTIFIED BY 'senha' WITH GRANT OPTION;
quinta-feira, 3 de novembro de 2011
Leitura e Gravação de Arquivos INI - Delphi
Bom dia Pessoal,
Posto abaixo 1 rotina para a leitura de arquivos INI, que são muito úteis para as configurações de um sistema, considerando um form chamado FrmLogin.
{-----------------------------}
{LEITURA DO ARQUIVO }
{-----------------------------}
procedure TFrmLogin.LeArquivoIni();
var sCaminho,sArquivo,sUsuario,sIp:string;
config: TIniFile;
begin
{Considera que o ini, esta na mesma pasta da aplicação e carrega o seu caminho na variavel abaixo.}
sCaminho := ExtractFilePath(Application.ExeName);
{Concatena o nome do arquivo com o caminho dele, nome do arquivo 'Config.ini'}
sArquivo := sCaminho + '\config.ini';
{Cria o ini em tempo de execucao}
config := TIniFile.Create(sArquivo);
{Le do cabecalho default , com a linha de nome usuario e carrega na variavel sUsuario}
sUsuario := config.readstring('default', 'usuario', 'teste');
//O 3° parametro acima, é o valor default, caso a linha usuario, esteja vazia ou não exista.
{Le do cabecalho conexao , com a linha de nome ip e carrega na variavel sIp}
sIp := config.readstring('conexao', 'ip', '192.168.0.37');
//O 3° parametro acima, é o valor default, caso a linha ip, esteja vazia ou não exista.
{
Poderiamos tambem utilizar
config.ReadInteger();
config.ReadBool();
config.ReadDate();
config.ReadTime();
config.ReadDateTime();
config.ReadFloat();
Todos Esses com o o retorno diferente, conforme o proprio nome da funcao diz.
By
Gustavo Luís H.
}
end;
{-----------------------------}
{GRAVACAO DO ARQUIVO }
{-----------------------------}
procedure TFrmLogin.gravaArquivoIni();
var sArquivo, sCaminho: string;
config: TIniFile;
begin
{Considera que o ini, esta na mesma pasta da aplicação e carrega o seu caminho na variavel abaixo.}
sCaminho := ExtractFilePath(Application.ExeName);
{Concatena o nome do arquivo com o caminho dele, nome do arquivo 'Config.ini'}
sArquivo := sCaminho + '\config.ini';
{Cria o ini em tempo de execucao}
config := TIniFile.Create(sArquivo);
config.WriteString('configuracoes', 'Usuario', Trim(edUsuario.Text));
//O 3° parametro acima, é o valor a ser gravado no cabecalho configuracoes, tag usuario.
config.WriteString('configuracoes', 'ip', Trim(edConexao.Text));
//O 3° parametro acima, é o valor a ser gravado no cabecalho configuracoes, tag ip.
{
Poderiamos tambem utilizar
config.WriteInteger();
config.WriteBool();
config.WriteDate();
config.WriteTime();
config.WriteDateTime();
config.WriteFloat();
Todos Esses com o o retorno diferente, conforme o proprio nome da funcao diz.
By
Gustavo Luís H.
}
end;
Nome do arquivo Ini utilizado : config.ini.
Conteudo do arquivo Ini Utilizado :
[conexao]
ip=192.168.0.137
[default]
usuario=1
Posto abaixo 1 rotina para a leitura de arquivos INI, que são muito úteis para as configurações de um sistema, considerando um form chamado FrmLogin.
{-----------------------------}
{LEITURA DO ARQUIVO }
{-----------------------------}
procedure TFrmLogin.LeArquivoIni();
var sCaminho,sArquivo,sUsuario,sIp:string;
config: TIniFile;
begin
{Considera que o ini, esta na mesma pasta da aplicação e carrega o seu caminho na variavel abaixo.}
sCaminho := ExtractFilePath(Application.ExeName);
{Concatena o nome do arquivo com o caminho dele, nome do arquivo 'Config.ini'}
sArquivo := sCaminho + '\config.ini';
{Cria o ini em tempo de execucao}
config := TIniFile.Create(sArquivo);
{Le do cabecalho default , com a linha de nome usuario e carrega na variavel sUsuario}
sUsuario := config.readstring('default', 'usuario', 'teste');
//O 3° parametro acima, é o valor default, caso a linha usuario, esteja vazia ou não exista.
{Le do cabecalho conexao , com a linha de nome ip e carrega na variavel sIp}
sIp := config.readstring('conexao', 'ip', '192.168.0.37');
//O 3° parametro acima, é o valor default, caso a linha ip, esteja vazia ou não exista.
{
Poderiamos tambem utilizar
config.ReadInteger();
config.ReadBool();
config.ReadDate();
config.ReadTime();
config.ReadDateTime();
config.ReadFloat();
Todos Esses com o o retorno diferente, conforme o proprio nome da funcao diz.
By
Gustavo Luís H.
}
end;
{-----------------------------}
{GRAVACAO DO ARQUIVO }
{-----------------------------}
procedure TFrmLogin.gravaArquivoIni();
var sArquivo, sCaminho: string;
config: TIniFile;
begin
{Considera que o ini, esta na mesma pasta da aplicação e carrega o seu caminho na variavel abaixo.}
sCaminho := ExtractFilePath(Application.ExeName);
{Concatena o nome do arquivo com o caminho dele, nome do arquivo 'Config.ini'}
sArquivo := sCaminho + '\config.ini';
{Cria o ini em tempo de execucao}
config := TIniFile.Create(sArquivo);
config.WriteString('configuracoes', 'Usuario', Trim(edUsuario.Text));
//O 3° parametro acima, é o valor a ser gravado no cabecalho configuracoes, tag usuario.
config.WriteString('configuracoes', 'ip', Trim(edConexao.Text));
//O 3° parametro acima, é o valor a ser gravado no cabecalho configuracoes, tag ip.
{
Poderiamos tambem utilizar
config.WriteInteger();
config.WriteBool();
config.WriteDate();
config.WriteTime();
config.WriteDateTime();
config.WriteFloat();
Todos Esses com o o retorno diferente, conforme o proprio nome da funcao diz.
By
Gustavo Luís H.
}
end;
Nome do arquivo Ini utilizado : config.ini.
Conteudo do arquivo Ini Utilizado :
[conexao]
ip=192.168.0.137
[default]
usuario=1
Assinar:
Postagens (Atom)