Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Anexar arquivos


Eder

Pergunta

Ola..

Pessoal...já tou algum tempo pra resolver este problema e não to conseguindo...

seguinte.

tem varios arquivos na pasta chamado JPG e caso estes arquivos estejam lá, gostaria de anexa-los ao email usando a função Mapi

codigo que estou encrencado é este:

If FileExists (ExtractFilePath(Application.ExeName)+ '\jpg\' + edit5.text + 'S1.jpg') then
BEGIN
mail.values['attachment0'] := (ExtractFilePath(Application.ExeName))+'\jpg\'+ EDIT5.TEXT + 'S1.JPG';
END;
If FileExists (ExtractFilePath(Application.ExeName)+ '\jpg\' + edit5.text + 'S2.jpg') then
BEGIN
mail.values['attachment1'] := (ExtractFilePath(Application.ExeName))+'\jpg\'+ EDIT5.TEXT + 'S2.JPG';
END;
If FileExists (ExtractFilePath(Application.ExeName)+ '\jpg\' + edit5.text + 'E1.jpg') then
BEGIN
mail.values['attachment2'] := (ExtractFilePath(Application.ExeName))+'\jpg\'+ EDIT5.TEXT + 'E1.JPG';
END;
If FileExists (ExtractFilePath(Application.ExeName)+ '\jpg\' + edit5.text + 'E2.jpg') then
BEGIN
mail.values['attachment3'] := (ExtractFilePath(Application.ExeName))+'\jpg\'+ EDIT5.TEXT + 'E2.JPG';
END;
If FileExists (ExtractFilePath(Application.ExeName)+ '\jpg\' + edit5.text + 'SE1.jpg') then
BEGIN
mail.values['attachment4'] := (ExtractFilePath(Application.ExeName))+'\jpg\'+ EDIT5.TEXT + 'SE1.JPG';
END;
If FileExists (ExtractFilePath(Application.ExeName)+ '\jpg\' + edit5.text + 'SE2.jpg') then
BEGIN
mail.values['attachment5'] := (ExtractFilePath(Application.ExeName))+'\jpg\'+ EDIT5.TEXT + 'SE2.JPG';
END;
mail.values['attachment6'] := (ExtractFilePath(Application.ExeName))+'\jpg\genera.jpg';
mail.values['attachment7'] := (ExtractFilePath(Application.ExeName))+'\pdf\'+ComboRp.TEXT + '.PDF';
Notem que ele verifica se o arquivo existe e depois anexa ao email....ele funciona certinho se tiver todos este arquivos nas pastas, porem se algum deles falta ele para de anexar só anexando um antes do arquivo faltando... Eu precisaria que independente dos arquivos solicitantes existirem ou não ....ele anexaria os existentes........ é possivel arrumar este codigo??? também coloquei assim...mas ele acontece a mesma coisa:
mail.values['attachment0'] := (ExtractFilePath(Application.ExeName))+'\jpg\'+ EDIT5.TEXT + 'S1.JPG';
mail.values['attachment1'] := (ExtractFilePath(Application.ExeName))+'\jpg\'+ EDIT5.TEXT + 'S2.JPG';
mail.values['attachment2'] := (ExtractFilePath(Application.ExeName))+'\jpg\'+ EDIT5.TEXT + 'E1.JPG';
mail.values['attachment3'] := (ExtractFilePath(Application.ExeName))+'\jpg\'+ EDIT5.TEXT + 'E2.JPG';
mail.values['attachment4'] := (ExtractFilePath(Application.ExeName))+'\jpg\'+ EDIT5.TEXT + 'SE1.JPG';
mail.values['attachment5'] := (ExtractFilePath(Application.ExeName))+'\jpg\'+ EDIT5.TEXT + 'SE2.JPG';
mail.values['attachment6'] := (ExtractFilePath(Application.ExeName))+'\jpg\genera.jpg';
mail.values['attachment7'] := (ExtractFilePath(Application.ExeName))+'\pdf\'+ComboRp.TEXT

Grato

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Oi Eder.... o problema ao meu ver não esta no 'If FileExists'

mas sim no 'mail.values['attachment0'] := '

se voce percorrer o codigo usando o breakpoint, vai perceber que o codigo morre neste comando quando ele não acha o arquivo .... o erro parece estar dentro do array... de uma verificada

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Oi Eder.... o problema ao meu ver não esta no 'If FileExists'

mas sim no 'mail.values['attachment0']:= '

se voce percorrer o codigo usando o breakpoint, vai perceber que o codigo morre neste comando quando ele não acha o arquivo .... o erro parece estar dentro do array... de uma verificada

R.: sim é nesta linha mesmo..já havia reparado...

ai é que ta não to conseguindo lidar com a função abaixo:

{..Função pra Enviar email usando Outlook Express..}
function SendEMail(Handle: THandle; Mail: TStrings): Cardinal;
type
  TAttachAccessArray = array [0..0] of TMapiFileDesc;
  PAttachAccessArray = ^TAttachAccessArray;
var
  MapiMessage: TMapiMessage;
  Receip: TMapiRecipDesc;
  Attachments: PAttachAccessArray;
  AttachCount: Integer;
  i1: integer;
  FileName: string;
  dwRet: Cardinal;
  MAPI_Session: Cardinal;
  WndList: Pointer;
begin
  dwRet := MapiLogon(Handle,
                     PChar(''),
                     PChar(''),
                     MAPI_LOGON_UI or MAPI_NEW_SESSION,
                     0, @MAPI_Session);
  if (dwRet <> SUCCESS_SUCCESS) then
  begin
    MessageBox(Handle,
    PChar('Error while trying to send email'),
    PChar('Error'),
    MB_ICONERROR or MB_OK);
  end
  else
  begin
    FillChar(MapiMessage, SizeOf(MapiMessage), #0);
    Attachments := nil;
    FillChar(Receip, SizeOf(Receip), #0);
    if Mail.Values['to'] <> '' then
    begin
      Receip.ulReserved := 0;
      Receip.ulRecipClass := MAPI_TO;
      Receip.lpszName := StrNew(PChar(Mail.Values['to']));
      Receip.lpszAddress := StrNew(PChar('SMTP:' +Mail.Values['to']));
      Receip.ulEIDSize := 0;
      MapiMessage.nRecipCount := 1;
      MapiMessage.lpRecips := @Receip;
    end;
    AttachCount := 0;
    for i1 := 0 to MaxInt do
    begin
      If Mail.Values['attachment' + IntToStr(i1)] = '' then
        break;
      Inc(AttachCount);
    end;
    if AttachCount > 0 then
    begin
      GetMem(Attachments, SizeOf(TMapiFileDesc) *AttachCount);
      for i1 := 0 to AttachCount - 1 do
      begin
        FileName := Mail.Values['attachment' +IntToStr(i1)];
        Attachments[i1].ulReserved := 0;
        Attachments[i1].flFlags := 0;
        Attachments[i1].nPosition := ULONG($FFFFFFFF);
        Attachments[i1].lpszPathName := StrNew(PChar(FileName));
        Attachments[i1].lpszFileName := StrNew(PChar(ExtractFileName(FileName)));
        Attachments[i1].lpFileType := nil;
      end;
      MapiMessage.nFileCount := AttachCount;
      MapiMessage.lpFiles := @Attachments^;
    end;
    if Mail.Values['subject'] <> '' then
      MapiMessage.lpszSubject := StrNew(PChar(Mail.Values['subject']));
    if Mail.Values['body'] <> '' then
      MapiMessage.lpszNoteText := StrNew(PChar(Mail.Values['body']));
    WndList := DisableTaskWindows(0);
    try
      Result := MapiSendMail(MAPI_Session, Handle, MapiMessage, MAPI_DIALOG, 0);
    finally
      EnableTaskWindows( WndList );
    end;
    for i1 := 0 to AttachCount - 1 do
    begin
      StrDispose(Attachments[i1].lpszPathName);
      StrDispose(Attachments[i1].lpszFileName);
    end;
    if Assigned(MapiMessage.lpszSubject) then
      StrDispose(MapiMessage.lpszSubject);
    if Assigned(MapiMessage.lpszNoteText) then
      StrDispose(MapiMessage.lpszNoteText);
    if Assigned(Receip.lpszAddress) then
      StrDispose(Receip.lpszAddress);
    if Assigned(Receip.lpszName) then
      StrDispose(Receip.lpszName);
    MapiLogOff(MAPI_Session, Handle, 0, 0);
  end;
end;

De momento até achar uma solução fiz uma tremenda gambiarra com if FileExists para fazer funcionar...mas o codigo ficou horrivel mas funciona... :blush:

Se tiver alguma ideia pra simplificar o codigo por favor

Grato

Editado por Micheus
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)
Link para o comentário
Compartilhar em outros sites

  • 0

Eder, a título de explicação a propriedade Values é apenas uma forma (muito boa) de ler o par campo=valor existentes na propriedade Items (TString). Ou seja, toda a linha adicionada à items que esteja no formato nome=valor pode ser acessado através de Values. Quando buscando um campo que não exista, é retornado nulo.

O seu problema reside justamente nesta última característica. Observe esta parte do código em SendMail em que é contabilizado a quantidade de anexo:

...
    AttachCount := 0;
    for i1 := 0 to MaxInt do
    begin
      If Mail.Values['attachment' + IntToStr(i1)] = '' then
        break;
      Inc(AttachCount);
    end;
...
percebeu agora? Supondo que o 3º arquivo não existisse, você não teria criado o "campo" attachment2, logo, sendo nulo o resultado, a contagem parou em 2 e será esta a quantidade de anexos a enviar. Para contornar a situação, teremos que agregar o indexador à palavra attachment na medida em que o arquivo exista.
procedure <inicialização do e-mail>
var
  ...
  AttchIdx :byte; // o máximo será 255
  PrgPath :string;

  procedure AttachFile(FileName :String);
  begin
    If FileExists (PrgPath +FileName) then
    begin
      mail.values[Format('attachment%d', [AttchIdx])] := PrgPath +FileName;
      Inc(AttchIdx);  // índice do próximo anexo
    end;
  end;  

begin
  ...
  AttchIdx := 0;
  PrgPath := ExtractFilePath(Application.ExeName);
  AttachFile('\jpg\' + edit5.text + 'S1.jpg');
  AttachFile('\jpg\' + edit5.text + 'S2.jpg');
  AttachFile('\jpg\' + edit5.text + 'E1.jpg');
  AttachFile('\jpg\' + edit5.text + 'E2.jpg');
  AttachFile('\jpg\' + edit5.text + 'SE1.jpg');
  AttachFile('\jpg\' + edit5.text + 'SE2.jpg');
  AttachFile('\jpg\genera.jpg');
  AttachFile('\pdf\'+ComboRp.TEXT + '.PDF');
  ...
  SendMail(.....)
end;

Acredito que isto resolva seu problema.

OBS:

1) quando se fizer necessário utilizar o retorno de uma função tantas vezes, como no caso de ExtractFilePath, fica, como dica de otimização, atribuí-lo a uma variável e fazer uso desta;

2) criar pequenas procedures locais(como AttachFile) podem trazer alguns benefícios, melhorar a compreensão do código, bem com, dar uma boa enxugada nele;

3) observe a posição da declaração da procedure AttachFile. Ela vem depois da cláusula VAR, porque ela "exerga" e manipula a variável AttchIdx que já deve ter sido declarada antes de seu uso.

Abraços

p.s. Desculpe editar o código da sua função SendMail no outro post, mas tentar entender a lógica de qualquer código sem identação é quase insano.

Editado por Micheus
Link para o comentário
Compartilhar em outros sites

  • 0

Oba....Micheus..Bdia!

Carinha..

Deu certinho..

:)

muito Grato pela ajuda...não iria conseguir resolver...

alias...eu nem sabia que dava pra colocar uma procedore dentro de outro....a programação....é muito show...

valeu

Abraço e Ótima Semana de Trabalho

;)

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...