Email no Delphi 7

Delphi

04/09/2005

Fiz um programa somente para cadastrar clientes e então enviar email. Tenho uma dúvida? Ele deve enviar no corpo do email, uma imagem .jpg e um texto promocional. Os endereços de email, vêm do banco de clientes. Como fazer para colocar uma imagem dentro de um memo(onde fiz o corpo do meu email), e será que um while no banco, selecionando o campo email para compor o endereço para onde enviarei o email, funcionará? Uso D7 com FB 1.5. Espero ter sido claro.


Paulo

Paulo

Curtidas 0

Respostas

Michael

Michael

04/09/2005

Olá colega!

Para colocar uma imagem em um email, vc deve usar a linguagem [b:30e241d78c]HTML[/b:30e241d78c]. Então, no memo que vc usa, coloque algo como:
 <img src="http://www.seusite.com.br/imagem.jpg" width="123" height="123">

Troque o src pelo caminho da sua imagem, e [b:30e241d78c]Width [/b:30e241d78c]e [b:30e241d78c]Height [/b:30e241d78c]pela largura e altura dela, respectivamente.

Se a imagem não estiver online, então vc deve anexá-la ao corpo do email, e então referenciá-la na tag [b:30e241d78c]IMG [/b:30e241d78c]localmente.

[]´s


GOSTEI 0
Paulo

Paulo

04/09/2005

Deixa-me explicar melhor:
1) O meu programa de cadastro, é que vai gerar e enviar o email. Fiz um formulário, com um Memo(body do email), um edit(Assunto) e outro edit(endereço de envio). No Delphi 6, usava-se o TNSMTP para envio de menssagens. No D7, ainda não sei qual usar, talvez o da palheta INDY(IdNSMTP).
2)Eu não sei, como colocar uma imagem no meu componente TMemo, ou TRxMemo, TJvMemo ou qualquer outro componente semelhante.
3)No caso do TJvMail, da Jedi Componente, Configurar as propriedades, Body, Recipient e Subject em Run-Time. Estas são as minhas dúvidas


GOSTEI 0
Michael

Michael

04/09/2005

Olá!

Realmente, a partir do Delphi 7 é vc deve usar os componentes da palheta Indy.

Sobre uma imagem dentro do Memo, isso não seria a solução. Como já falei, para exibir alguma figura em um email, deve-se criar a mensagem no formato HTML, que é suportado por quase todos os clientes de email. Vc deve usar a tag que mencionei na mensagem anterior.

Se sua intenção é mostrar a imagem dentro da mensagem ao usuário, por alguma razão, então antes de enviar invariavelmente vc terá que inserir a tag IMG.

[]´s


GOSTEI 0
Paulo

Paulo

04/09/2005

Deveria ser mais ou menos assim:

tabela.first; Texto:=´Compre meus produtos´; while not tabela.eof do begin endereco:=Tabelaemail.Value; meucomponentedeemail.send; meucomponentedeemail.body:=Texto; tabela.next; end;


Agora como enviar essa imagem no corpo do email? A imagem, por exemplo, está em: C:\Imagens\LOGO.jpg. Essa imagem ela fica logo abaixo do Texto do Email. Não pode ir Anexada. Ela deve ir no corpo do email. Eu fiz o corpo com um componente RxRichEdit. Ainda não consegui nada. Os endereços vêm do banco de dados, do campo email, por isso o while acima, para ir prenchendo e enviando automaticamente, já com o texto e a imagem (igual para todos). Grato.


GOSTEI 0
Paulo

Paulo

04/09/2005

Eis aí a minha UNIT completa. Aceito sugestões. Não consigo enviar uma imagem por este email. A dúvida é como acrescentar uma tag html no body do email. Também gostaria de enviar os emails, cujos destinatários estão cadastrados no banco de dados, direto, dentro de um while. Fiz, mas não funcionou. Creio que a rotina de envio deve estar dentro do loop e a medida que vai encontrando um destinatário, ela vai enviando. Creio que é isto, pois como está, não vai. Desde ja, grato!!


unit untEmail; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, ToolWin, ImgList, LMDCustomComponent, LMDCustomHint, LMDCustomShapeHint, LMDShapeHint, JvComponent, JvMail, IdMessage, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient, IdSMTP, JvExControls, JvEditorCommon, JvEditor, RxRichEd, Buttons; type TfrmEmail = class(TForm) Panel1: TPanel; GroupBox1: TGroupBox; ImageList1: TImageList; ControlBar1: TControlBar; ToolBar1: TToolBar; ToolButton1: TToolButton; ToolButton2: TToolButton; LMDShapeHint1: TLMDShapeHint; edPara: TEdit; edAssunto: TEdit; IdSMTP1: TIdSMTP; IdMessage1: TIdMessage; OpenDialog1: TOpenDialog; Bevel1: TBevel; Bevel2: TBevel; Bevel3: TBevel; Label1: TLabel; Label2: TLabel; Label3: TLabel; edTexto: TRxRichEdit; BitBtn1: TBitBtn; CheckBox1: TCheckBox; procedure FormCreate(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure ToolButton2Click(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure ToolButton1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmEmail: TfrmEmail; implementation uses untDm; const ScreenWidth: LongInt = 800; ScreenHeight: LongInt = 600; {$R *.dfm} procedure TfrmEmail.FormCreate(Sender: TObject); begin scaled := true; if (screen.width <> ScreenWidth)then begin height := longInt(height)*longInt(screen.height) div screenHeight; width := longint(width)*longInt(screen.width) div screenWidth; scaleBy(screen.width, ScreenWidth); end; end; procedure TfrmEmail.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key = vk_down then begin Perform(CM_DialogKey, VK_Down, 0); end; end; procedure TfrmEmail.FormKeyPress(Sender: TObject; var Key: Char); begin if key = #13 then begin key := 0; perform(cm_dialogkey, vk_tab, 0); end; end; procedure TfrmEmail.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key = vk_up then begin perform(cm_dialogkey, vk_up, 0); end; end; procedure TfrmEmail.ToolButton2Click(Sender: TObject); begin Close; end; procedure TfrmEmail.BitBtn1Click(Sender: TObject); var a:string; begin with Dm.qCadastro do begin Close; Sql.Clear; Sql.Add(´Select * from cadastro´); Open; end; Dm.qCadastro.First; a:=trim(Dm.qCadastroEMAIL.Value); while not(Dm.qCadastro.Eof) do begin a:=trim(a)+´,´+trim(Dm.qCadastroEMAIL.Value); edPara.Text:=trim(a); Dm.qCadastro.Next; end; end; procedure TfrmEmail.ToolButton1Click(Sender: TObject); var arq:TextFile; sm,us,se,path,ass,em,img:string; begin //Carrego as informações de um arquivo texto AssignFile(arq,ExtractFilePath(ParamStr(0))+´Config.cfg´); Reset(arq); Readln(arq,sm); Readln(Arq,us); Readln(arq,se); Readln(arq,path); Readln(arq,ass); Readln(arq,em); Readln(arq,img);//Endereço da imagem CloseFile(arq); //Preenho meus componentes de email IdSMTP1.Host:=sm; IdSMTP1.Username:=us; IdSMTP1.Password:=se; IdMessage1.From.Name:=ass; IdMessage1.From.Address:=em; IdMessage1.Recipients.EMailAddresses:=edPara.Text; IdMessage1.Subject:=edAssunto.Text; IdMessage1.Body:=edTexto.Lines; if CheckBox1.Checked then IdMessage1.ReceiptRecipient.Text := IdMessage1.From.Text; // Auto Resposta //Conecto e envio o email IdSMTP1.Connect; try IdSMTP1.Send(IdMessage1); finally IdSMTP1.Disconnect; end; Application.MessageBox(´Email enviado com sucesso!´, ´Confirmação´, MB_ICONINFORMATION + MB_OK); end; end.

Abaixo a minha rotina de configuração



procedure TfrmConfig.BitBtn1Click(Sender: TObject); var arq:TextFile; begin try AssignFile(arq,ExtractFilePath(ParamStr(0))+´Config.cfg´); rewrite(arq); writeln(arq,edSmtp.Text); writeln(arq,edUsu.Text); writeln(arq,edSenha.Text); writeln(arq,edImagem.Text); writeln(arq,edAssinatura.Text); writeln(arq,edEmail.Text); writeln(arq,´<img ´´+edImagem.Text+´´width=´123´ heigth=´123´>´); closefile(arq); ShowMessage(´Arquivo gerado com sucesso´); except on Exc: Exception do begin ShowMessage(´Erro ao tentar gerar arquivo de configuração´+Exc.Message); end; end; end;

O que devo fazer?


GOSTEI 0
Paulo

Paulo

04/09/2005

Tentei fazer assim, mas não deu cerrto. Dá erro de access violation na seguinte linha:

lTextPart := TIdText.Create(lMessage.MessageParts);



procedure TfrmEmail.ToolButton1Click(Sender: TObject); var arq:TextFile; sm,us,se,path,ass,em,img:string; lMessage: TIdMessage; lTextPart: TIdText; lImagePart: TIdAttachment; begin with Dm.qCadastro do begin Close; Sql.Clear; Sql.Add(´Select * from cadastro´); Open; end; //Carrego as informações de um arquivo texto AssignFile(arq,ExtractFilePath(ParamStr(0))+´Config.cfg´); Reset(arq); Readln(arq,sm); Readln(Arq,us); Readln(arq,se); Readln(arq,path); Readln(arq,ass); Readln(arq,em); Readln(arq,img); CloseFile(arq); //Preenho meus componentes de email IdSMTP1.Host:=sm; IdSMTP1.Username:=us; IdSMTP1.Password:=se; IdMessage1.From.Name:=ass; IdMessage1.From.Address:=em; if CheckBox2.Checked then begin try IdSMTP1.Connect; except On Exc:Exception do begin ShowMessage(´Erro ao tentar conectar ao servidor SMTP´+Exc.Message); end; end; try Dm.qCadastro.First; while not(Dm.qCadastro.Eof) do begin IdMessage1.Recipients.EMailAddresses:=Dm.qCadastroEMAIL.Value; IdMessage1.Subject:=edAssunto.Text; IdMessage1.Body.Clear; lTextPart := TIdText.Create(lMessage.MessageParts); lTextPart.Body.Text := ´This is a plain text message´; lTextPart.ContentType := ´text/plain´; lTextPart := TIdText.Create(lMessage.MessageParts); lTextPart.Body.Text := ´<html><body><b>This is a HTML message with picture</b><img src=´htmlbodyIMG0000.JPG´ ></body></html>´; lTextPart.ContentType := ´text/html´; lImagePart := TIdAttachment.Create(lMessage.MessageParts, ´htmlbodyIMG0000.JPG´); lImagePart.ContentType := ´image/jpg´; lImagePart.Headers.Add(´Content-ID: <htmlbodyIMG0000.JPG>´); IdSMTP1.Send(IdMessage1); Dm.qCadastro.Next; end; IdSMTP1.Disconnect; Application.MessageBox(´Email enviado com sucesso!´, ´Confirmação´, MB_ICONINFORMATION + MB_OK); except On Exc:Exception do begin ShowMessage(´Erro ao tentar enviar email: ´+Exc.Message); end; end; if CheckBox1.Checked then IdMessage1.ReceiptRecipient.Text := IdMessage1.From.Text; // Auto Resposta end;



GOSTEI 0
Paulo

Paulo

04/09/2005

Ainda não consegui enviar uma imagem dentro do corpo do email. Tá brabo!!!


GOSTEI 0
POSTAR