Anexando Automático no Outlook Express

Delphi

09/04/2009

Procurei em diversos fórums, mas ainda não concegui resolver meu problema.

Um cliente quer que eu anexe automaticamente um arquivo no Outlook Express usando o Delphi.
Alguem já fez algo parecido? Isso é possivel?

Agradeço demais a quem puder ajudar, to quebrando a cabeça a nada.


Bruno6652

Bruno6652

Curtidas 0

Respostas

Lehapan

Lehapan

09/04/2009

Caro bruno6652,

utilizo esta rotina para enviar e-mail pelo programa padrão de e-mail.

function  EnviarEmail(Endereco: string; Assunto: string = ´´; Texto: string = ´´;
  stlAnexo: TStringList = nil): Boolean;
type
  TAttachAccessArray = array [0..0] of TMapiFileDesc;
  PAttachAccessArray = ^TAttachAccessArray;
var
  MapiMessage: TMapiMessage;
  MError: Cardinal;
  Sender: TMapiRecipDesc;
  PRecip, Recipients: PMapiRecipDesc;
  Attachments: PAttachAccessArray;
  x: integer;
begin
  Result := False;

  if  Trim( Endereco ) = ´´ then
    begin
      ShowMessage(´Endereço de e-mail inválido.´);
      Exit;
    end
  ;

  MapiMessage.nRecipCount := 1;
  GetMem( Recipients, MapiMessage.nRecipCount * Sizeof(TMapiRecipDesc) );

  try
    with MapiMessage do
    begin
      { Assunto e Texto }
      ulReserved := 0;
      lpszSubject := PChar( Assunto );
      lpszNoteText := PChar( Texto );
      lpszMessageType := nil;
      lpszDateReceived := nil;
      lpszConversationID := nil;
      flFlags := 0;
      Sender.ulReserved := 0;
      Sender.ulRecipClass := MAPI_ORIG;
      Sender.lpszName := PChar( ´´ );
      Sender.lpszAddress := PChar( ´´ );
      Sender.ulEIDSize := 0;
      Sender.lpEntryID := nil;
      lpOriginator := @Sender;

      { Endereço }
      PRecip := Recipients;
      PRecip^.ulReserved := 0;
      PRecip^.ulRecipClass := MAPI_TO;
      PRecip^.lpszName := PChar( Endereco );
      PRecip^.lpszAddress := StrNew( PChar(´SMTP:´ + Endereco ) );
      PRecip^.ulEIDSize := 0;
      PRecip^.lpEntryID := nil;
      Inc( PRecip );
      lpRecips := Recipients;

      { Anexa os arquivos }
      { Cria o StringList vazio se for nil }
      if  stlAnexo = nil then
        begin
          stlAnexo := TStringList.Create;
          stlAnexo.Clear;
        end
      ;

      { Deleta do stlAnexo os arquivos que não existem }
      x := 0;
      while x <= (stlAnexo.Count - 1) do
      begin
        if  not FileExists( stlAnexo.Strings[x] ) then
            stlAnexo.Delete(x)
        else
            inc(x)
        ;
      end;

      { Anexa os arquivos }
      Attachments := nil;
      if  stlAnexo.Count > 0 then
        begin
          GetMem(Attachments, SizeOf(TMapiFileDesc) * stlAnexo.Count);
          for x := 0 to stlAnexo.Count - 1 do
          begin
            Attachments[x].ulReserved := 0;
            Attachments[x].flFlags := 0;
            Attachments[x].nPosition := ULONG($FFFFFFFF);
            Attachments[x].lpszPathName := StrNew( PChar(stlAnexo.Strings[x]) );
            Attachments[x].lpszFileName :=
            StrNew( PChar( ExtractFileName(stlAnexo.Strings[x]) ) );
            Attachments[x].lpFileType := nil;
          end;
        end
      ;
      nFileCount := stlAnexo.Count;
      lpFiles := @Attachments^;

    end;

    { Enviando o e-mail }
    MError :=
      MapiSendMail( 0, Application.Handle, MapiMessage,
                    MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0 );

    case MError of
      MAPI_E_USER_ABORT: ;
        { Mostra mensagem que o envio do e-mail foi abortado pelo usuário.
          Portanto, não será mostrado nada }
      SUCCESS_SUCCESS:
          Result := True;
      else
          MessageDlg( ´Ocorreu um erro inesperado!´#13´Código: ´ +
                      IntToStr(MError), mtError, [mbOk], 0);
    end;
  finally
    PRecip := Recipients;
    StrDispose( PRecip^.lpszAddress );
    Inc( PRecip );
    FreeMem( Recipients, MapiMessage.nRecipCount * Sizeof(TMapiRecipDesc) );

    for x := 0 to stlAnexo.Count - 1 do
    begin
      StrDispose( Attachments[x].lpszPathName );
      StrDispose( Attachments[x].lpszFileName );
    end;
  end;
end;


espero ter ajudado.


GOSTEI 0
Bruno6652

Bruno6652

09/04/2009

lehapan
Obrigado pela ajuda, mas não deu certo. Essa função funciona apenas com o Microsoft Outlook e não o Outllok Express.

Quando rodo a função ele dá a mensagem de que não tem nenhum perfil criado.


GOSTEI 0
Bruno6652

Bruno6652

09/04/2009

Deu certo agora amigo.
Eu estava com o Thunderbird como aplicativo padrao, achei que quando usasse a função nao iria ter problema, que ele fosse abrir o programa da Microsoft.

Valeu mesmo.


GOSTEI 0
Lehapan

Lehapan

09/04/2009

Caro bruno6652,

para fazer funcionar o Outllok Express, você deve ter um perfil criado, caso contrário ele não funciona. Este é o padrão do Outllok Express e não da rotina.

Outra coisa, esta rotina sempre vai abrir o aplicativo definido copmo padrão.

qualquer coisa é só perguntar.


GOSTEI 0
Mcleod

Mcleod

09/04/2009

lehapan,

Agradeço pelo código, está funcionando bem. Mas, estou tendo um pequeno problema. Tenho configurados, no Microsoft Outlook, assinatura e tema para as minhas mensagens. Quando crio uma nova mensagem a partir do próprio Outlook, ele os carrega automaticamente. Porém, quando meu sistema utiliza essa função para chamar o Outlook, a mensagem vem em branco, sem a formatação. Existe algum meio de contornar esse problema?

Obrigado!


GOSTEI 0
Lehapan

Lehapan

09/04/2009

McLeod,

Não olhei como fazer, pois nunca precisei, e também não sei se tem como carregar estes dados, pois como já disse anteriormente, esta rotina serve para enviar e-mails pelo programa padrão de e-mails, e estas características que você citou são específicas de um programa.

Estou meio sem tempo agora, mas quando eu tiver um tempo dou uma pesquisada.

Desculpa não poder te ajudar.


GOSTEI 0
Charlesjacome

Charlesjacome

09/04/2009

McLeod,

uma dica é nao colocar texto no e-mail:
[b:0803bfc95f]lpszNoteText := nil;[/b:0803bfc95f]
E anexar (tem de ser o primeiro anexo) um arquivo HTML como sendo o corpo do seu e-mail, onde voce pode colocar tudo que for necessario.


GOSTEI 0
POSTAR