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

Enviando email com MAPI - Delphi+Thunderbird


geovanepc

Pergunta

Estou usando este código para enviar emails pelo Thunderbird:

 

 

//-------------- Função para invocar o Thunderbird -----------------------------//

Declarar Uses: MAPI

 

function TForm2.SendMailMAPI(const Subject, Body, FileName, SenderName,
  SenderEMail, RecepientName, RecepientEMail: String): Integer;
var
  Message: TMapiMessage;
  lpSender, lpRecepient: TMapiRecipDesc;
  FileAttach: TMapiFileDesc;
  SM: TFNMapiSendMail;
  MAPIModule: HModule;
begin
  FillChar(message, SizeOf(message), 0);
  with message do
  begin
    if (Subject <> '') then
    begin
      lpszSubject := PAnsiChar(AnsiString(Subject)); // PAnsiChar(Subject);
    end;

    if (Body <> '') then
    begin
      lpszNoteText := PAnsiChar(AnsiString(Body));
    end;

    if (SenderEMail <> '') then
    begin
      lpSender.ulRecipClass := MAPI_ORIG;
      if (SenderName = '') then
      begin
        lpSender.lpszName := PAnsiChar(AnsiString(SenderEMail))
      end
      else
      begin
        lpSender.lpszName := PAnsiChar(AnsiString(SenderName))
      end;
      lpSender.lpszAddress := PAnsiChar(AnsiString('SMTP:' + SenderEMail));
      lpSender.ulReserved := 0;
      lpSender.ulEIDSize := 0;
      lpSender.lpEntryID := nil;
      lpOriginator := @lpSender;
    end;
    if (RecepientEMail <> '') then
    begin
      lpRecepient.ulRecipClass := MAPI_TO;
      if (RecepientName = '') then
      begin
        lpRecepient.lpszName := PAnsiChar(AnsiString(RecepientEMail))
      end
      else
      begin
        lpRecepient.lpszName := PAnsiChar(AnsiString(RecepientName))
      end;
      lpRecepient.lpszAddress :=
        PAnsiChar(AnsiString('SMTP:' + RecepientEMail));
      lpRecepient.ulReserved := 0;
      lpRecepient.ulEIDSize := 0;
      lpRecepient.lpEntryID := nil;
      nRecipCount := 1;
      lpRecips := @lpRecepient;
    end
    else
    begin
      lpRecips := nil
    end;
    if (FileName = '') then
    begin
      nFileCount := 0;
      lpFiles := nil;
    end
    else
    begin
      FillChar(FileAttach, SizeOf(FileAttach), 0);
      FileAttach.nPosition := Cardinal($FFFFFFFF);
      FileAttach.lpszPathName := PAnsiChar(AnsiString(FileName));
      nFileCount := 1;
      lpFiles := @FileAttach;
    end;
  end;

  MAPIModule := LoadLibrary(PChar(MAPIDLL));

  if MAPIModule = 0 then
  begin
    Result := -1
  end
  else
  begin
    try
      @SM := GetProcAddress(MAPIModule, 'MAPISendMail');
      if @SM <> nil then
      begin
        Result := SM(0, Application.Handle, message, MAPI_DIALOG or
          MAPI_LOGON_UI, 0);
      end
      else
      begin
        Result := 1
      end;

    finally
      FreeLibrary(MAPIModule);
    end;
  end;

  if Result <> 0 then
  begin
    MessageDlg('Error sending mail (' + IntToStr(Result) + ').', mtError,
      [mbOK], 0)
  end;
end;

//---------------------------------------------------------------------------------//

Para enviar:

procedure TForm2.Button2Click(Sender: TObject);
begin
  SendMailMAPI(Subject, Body, FileName, SenderName, SenderEMail, RecepientName, RecepientEMail);

end;
 

//---------------------------------------------------------------------------------//

Ele funciona perfeitamente, só tem um detalhe, como preciso enviar vários emails, um por vez, não quero ficar clicando no botão <ENVIAR EMAIL>.

Também não quero enviar com cópia.

Preciso que ele envie automaticamente.

Existe algum comando na API do Thunderbird que posso usar para fazer esse envio automaticamente, depois de invocar e preencher o formulário?

 

Desde já agradeço.

Um forte abraço à todos.

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

8 respostass a esta questão

Posts Recomendados

  • 0

Para enviar:

procedure TForm2.Button2Click(Sender: TObject);
begin
  SendMailMAPI(Subject, Body, FileName, SenderName, SenderEMail, RecepientName, RecepientEMail);

end;

------------------------------------------------------------------------------------

voce tem um arquivo com a lista de nomes e emails ?

para o envio, voce passa valores por parametros ?

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas, obrigado pelo retorno.

Sim já tenho a lista de emails, quase tudo funciona perfeito, só estou querendo saber se existe algum command line, ou configuração, que possa utilizar, para evitar que o formulário de envio fique aparecendo, preciso que o Thunderbird envie direto, sem ter que estar clicando no botão <Enviar Agora>.

Se existe um modo Silent, sei lá, mas que não seja preciso pressionar o botão de enviar.

Obrigado.

Um forte abraço à todos.

Link para o comentário
Compartilhar em outros sites

  • 0

geovanepc, fiz alguns testes aqui .... parece que o thunderbird funciona como o outlook

mesmo que voce crie uma stringlist ou array de strings, a cada envio vai aparecer a janela para voce clicar no botão <Enviar Agora>.

veja nesses links algumas possibilidades:

https://recalll.co/app/?q=delphi - how SendMailMAPI is adjusted to support multiple file attachments#

http://stackoverflow.com/questions/2683079/how-sendmailmapi-is-adjusted-to-support-multiple-file-attachments

https://www.experts-exchange.com/questions/22868654/Automaticly-open-Email-message-with-HTML-in-the-body.html

talvez voce tenha que mudar o foco e usar componentes indy para isso

http://www.devmedia.com.br/envio-de-e-mails-no-delphi-win32/1195

abraço

 

 

Link para o comentário
Compartilhar em outros sites

  • 0

Eu estava usando com Indy, mas de uns dias pra cá, não consigo mais enviar para fora pelo meu servidor. Já retirei todas as proteções, mas não vai. Dentro do mesmo domínio ele consegue enviar, mas para fora, nada.

Daí utilizo com o Thynderbird, ele conecta direitinho e envia meus emails sem problemas.

Só que existe esse inconveniente, tenho que clicar no botão <Enviar>.

Achava que o Thunderbird tinha mais command lines.

Sei não, acho que meu Indy tá com algum cano entupido.

Vou olhar os links.

Obrigado Jhonas.

Um forte abraço à todos.

Link para o comentário
Compartilhar em outros sites

  • 0

fazendo uma pesquisa, achei essa possibilidade .... voce pode usar o comando shellexecute

thunderbird.exe -compose "to='email@domain.com',subject='Some Subject',preselectid='id1',body='Message Body',attachment='File.txt'"

 

acho que esse pode resolver o seu problema

http://custombuttons.sourceforge.net/forum/viewtopic.php?f=2&t=839

 

Command line arguments - Thunderbird

http://kb.mozillazine.org/Command_line_arguments_(Thunderbird)

 

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas, a opção com shellexecute também abre o formulário de conferência do email, antes de enviar.

Depois fica esperando clicar no dito botão <Enviar agora>.

A segunda referência:

Send Without Saving Button Code

CODE: SELECT ALL
this.SendNoSave= function(event) {
    var prefs = Components.classes['@mozilla.org/preferences-service;1']
                .getService(Components.interfaces.nsIPrefBranch);
    var prefstring = "mail.identity." + gCurrentIdentity.key + ".fcc";
    try {
        var send = prefs.getBoolPref(prefstring);
    } catch (e) {
        var send = prefs.getBoolPref("mail.identity.default.fcc");
    }
    if (send == false) {
        goDoCommand("cmd_sendButton");
    } else {
        prefs.setBoolPref(prefstring, false);
        if (gIOService && gIOService.offline) {
            SendMessageLater();
        } else {
            SendMessage();
        }
        prefs.setBoolPref(prefstring, true);
    }
};

Não entendi onde vai esse código. É tipo criar uma Hot Key. Procurei dentro do Thunderbird, mas não encontrei.

Mas a pergunta que não quer calar, "Onde vai esse código mesmo?" kkkk.

O terceiro link, faz referência ao 1º exemplo.

Obrigado.

Um forte abraço à todos os colegas.

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,5k
×
×
  • Criar Novo...