Ir para conteúdo
  • Cadastre-se

dev botao

Envio de Email outlook


Ver Solução Respondido por guilhermekm,

Recommended Posts

Postado

Bom dia @Jhoni Conzatti

A maioria dos fontes que vi, é criando um servidor http local para receber os tokens, por enquanto está funcionando...

Só lembrando que os fontes que disponibilizei é baseado no https://github.com/geoffsmith82/GmailAuthSMTP

@Juliomar Marchetti esse repositório https://github.com/rvk01/google-oauth2 é feito lazarus e synapse feito para o Gmail, mas acho que dá para fazer para Outlook...

  • Curtir 2
Postado (editado)

Bom dia pessoal!

Eu fiz um implementação do OAuth2 no ACBrMail a unit1 do anexo é alteração do exemplo do ACBr.

Ainda falta o tratamento erros, mas já está funcional.

Referencias:
https://github.com/rvk01/google-oauth2/tree/master
https://www.emailarchitect.net/easendmail/ex/d/23.aspx

 

ACBrMail.pasFetching info... unit1.pasFetching info... unit1.dfmFetching info...

Editado por Patrick Alves
  • Curtir 1
Postado

Tarde @Patrick Alves

Cara já que vc tá mexendo, uma coisa que vc poderia ajustar para pegar o tempo de expiração do token e armazenar na propriedade "ExpiraEm" quando faz a autenticação...

var
  ...
  expires_in: Integer;
begin
...
  FRefreshToken := json.AsString['refresh_token'];
  FAccessToken := json.AsString['access_token'];
  expires_in := json.AsInteger['expires_in'];
  if expires_in > 0 then
    FExpiraEm := IncSecond(Now, expires_in)
   else
   	FExpiraEm := 0;
...
end;

Mas parabéns ficou muito bom....

Postado

Correções e melhorias:

* Adicionar tratamento de erros;
* Adicionar propriedade AuthServerTimeout para o tempo de espera do consentimento do usuário;
* Atualizar propriedade ExpiraEm na atualização do token;
* Adicionar pmsOAuth ao enum TMailStatus e propagar seu status;
* Refatorar procedure AutorizacaoInterativa;
    * Remover mensagem "Aguardando consentimento do usuário";
* Refatorar procedure AtualizarAccessToken;
    * Na requisição alterar o tipo do response de TMemoryStream para TStringStream;

Em anexo (Unit1.pas e Unit1.dfm são do exemplo)

ACBrMail.pasFetching info... unit1.pasFetching info... unit1.dfmFetching info...

Postado

Boa tarde!

Testes realizados com configurações para google e microsoft, emails enviados com sucesso.

Correções :

* Corrigir chamada do procedimento AutorizacaoInterativa. Executa mesmo depois do consentimento;
* Corrigir parametro refresh_token para obter access token. Microsoft não aceita para aplicativos desktop;

ACBrMail.pasFetching info...

  • Membros Pro
Postado
  Em 03/10/2024 at 20:09, Patrick Alves disse:

Boa tarde!

Testes realizados com configurações para google e microsoft, emails enviados com sucesso.

Correções :

* Corrigir chamada do procedimento AutorizacaoInterativa. Executa mesmo depois do consentimento;
* Corrigir parametro refresh_token para obter access token. Microsoft não aceita para aplicativos desktop;

ACBrMail.pas 44.27 kB · 0 downloads

Expandir  

Só precisa desta unit?

Valter Patrick

Gerente de Projetos na empresa CTEC

(33)98400-0936

GitHub: https://github.com/valterpatrick

Postado
  Em 04/10/2024 at 11:34, saulo.figueiredo disse:

Bom dia, no caso da Microsoft, como faço para conseguir as credenciais?

Expandir  

Bom dia!

Você precisa ter uma conta na Azure e criar um aplicativo lá. Depois é só configurar os parâmetros para autenticação no componente.

Vou deixar aqui alguns links de referencia:

https://learn.microsoft.com/pt-br/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by-using-oauth
https://learn.microsoft.com/pt-br/entra/identity-platform/quickstart-register-app?tabs=certificate

  • Curtir 1
  • Membros Pro
Postado
  Em 03/10/2024 at 20:09, Patrick Alves disse:

Boa tarde!

Testes realizados com configurações para google e microsoft, emails enviados com sucesso.

Correções :

* Corrigir chamada do procedimento AutorizacaoInterativa. Executa mesmo depois do consentimento;
* Corrigir parametro refresh_token para obter access token. Microsoft não aceita para aplicativos desktop;

ACBrMail.pas 44.27 kB · 4 downloads

Expandir  

Eu tentei e está dando este erro:

Acesso bloqueado: a solicitação desse app é inválida


Não foi possível fazer login, porque esse app enviou uma solicitação inválida. Tente novamente ou entre em contato com o desenvolvedor para falar sobre o problema. Saiba mais sobre o erro
Se você é um desenvolvedor desse app, consulte os detalhes do erro.
Erro 400: redirect_uri_mismatch

O app está como Produção, segui os passos que vi na internet para criar a chave e tudo mais.

ExemploCampos.png

ErroSite.png

Valter Patrick

Gerente de Projetos na empresa CTEC

(33)98400-0936

GitHub: https://github.com/valterpatrick

  • Membros Pro
Postado
  Em 04/10/2024 at 13:43, valterpatrick disse:

Eu tentei e está dando este erro:

Acesso bloqueado: a solicitação desse app é inválida


Não foi possível fazer login, porque esse app enviou uma solicitação inválida. Tente novamente ou entre em contato com o desenvolvedor para falar sobre o problema. Saiba mais sobre o erro
Se você é um desenvolvedor desse app, consulte os detalhes do erro.
Erro 400: redirect_uri_mismatch

O app está como Produção, segui os passos que vi na internet para criar a chave e tudo mais.

ExemploCampos.png

ErroSite.png

Expandir  

Eu fui testando e achei a solução para o meu problema.
No Google Console tenho de deixar a mesma URL que eu colocar no envio.
Estava colocando outra, por que tinha seguido um tutorial diferente.

Correcao.png

Valter Patrick

Gerente de Projetos na empresa CTEC

(33)98400-0936

GitHub: https://github.com/valterpatrick

Postado (editado)

@valterpatrick

Se atenta para o tipo de aplicativo que vc escolher, quando vc escolhe app para computador não é preciso informar o redirectURI no cadastro do app no google. No caso que apresentou ele validou o redirectURI porque vc informou app para web.

Da uma olhada: https://developers.google.com/identity/protocols/oauth2/native-app?hl=pt-br

Editado por Patrick Alves
incluir link
  • Membros Pro
Postado
  Em 04/10/2024 at 14:02, Patrick Alves disse:

@valterpatrick

Se atenta para o tipo de aplicativo que vc escolher, quando vc escolhe app para computador não é preciso informar o redirectURI no cadastro do app no google. No caso que apresentou ele validou o redirectURI porque vc informou app para web

Expandir  

Eu segui o tutorial abaixo para fazer o cadastro:
O que me indica para criar o cadastro correto no Google?

 

 

Valter Patrick

Gerente de Projetos na empresa CTEC

(33)98400-0936

GitHub: https://github.com/valterpatrick

  • Membros Pro
Postado
  Em 04/10/2024 at 14:10, Patrick Alves disse:

o tipo de integração que vc está fazendo...

image.png.c34b6ef04d9965811621110f60e33938.png

 

Expandir  

Quando eu coloco por exemplo "http://127.0.0.1:1500" no campo ID da Loja, eu tenho de fazer alguma outra alteração no meu programa?
Tipo criar alguma coisa para receber conexão na porta 1500 por exemplo, sei lá.

Na documentação referente a UWP, explica que é para colocar a porta que meu aplicativo detecta, como eu faço?

image.png.569904de1698b385546b93c71a7df248.png

 

Valter Patrick

Gerente de Projetos na empresa CTEC

(33)98400-0936

GitHub: https://github.com/valterpatrick

  • Membros Pro
Postado
  Em 04/10/2024 at 16:10, Patrick Alves disse:

@valterpatrick

UWP é para aplicativos publicados na Microsoft Store, acho que não é o seu caso! Tenta escolher app para computador.

Expandir  

Estou tendo problema agora este erro:

Erro: SMTP Error: Unable to send MailFrom.
535 5.7.8 https://support.google.com/mail/?p=BadCredentials d9443c01a7336-20c13934817sm1435145ad.158 - gsmtp
530 5.7.0 https://support.google.com/mail/?p=WantAuthError d9443c01a7336-20c13934817sm1435145ad.158 - gsmtp

Valter Patrick

Gerente de Projetos na empresa CTEC

(33)98400-0936

GitHub: https://github.com/valterpatrick

  • Membros Pro
Postado
  Em 04/10/2024 at 19:32, Patrick Alves disse:

Vc conseguiu autenticar o usuário pelo componente? Capturou o AccessToken?

Expandir  

Sim capturei AccessToken e ele é informado no password:

if fAutenticador.AccessToken <> '' then
    fSMTP.Password := fAutenticador.AccessToken;

Contudo, quando chega na parte abaixo do código dá os erros que citei:

for vAttempts := 1 to fAttempts do
  begin
    if fSMTP.MailFrom(fFrom, Length(fFrom)) then
      Break;

    AddErrorMsg(fSMTP.ResultString);
    if vAttempts >= fAttempts then
      SmtpError('SMTP Error: Unable to send MailFrom.' + sLineBreak + ErrorMsgs);
  end;

Erros:

Erro: SMTP Error: Unable to send MailFrom.
535 5.7.8 https://support.google.com/mail/?p=BadCredentials d9443c01a7336-20c13934817sm1435145ad.158 - gsmtp
530 5.7.0 https://support.google.com/mail/?p=WantAuthError d9443c01a7336-20c13934817sm1435145ad.158 - gsmtp

Na minha conta do Google está mostrando como autorizado.

Valter Patrick

Gerente de Projetos na empresa CTEC

(33)98400-0936

GitHub: https://github.com/valterpatrick

Postado (editado)

@valterpatrick Verifica se suas configurações estão parecidas com essa:

[Email]
From=email@gmail.com
FromName=Patrick
Host=smtp.gmail.com
Port=587
User=email@gmail.com
Pass=strongpassword
TLS=Sim

[OAuth2]
AccessTokenUrl=https://oauth2.googleapis.com/token
AuthorizationTokenUrl=https://accounts.google.com/o/oauth2/v2/auth
ClientId=seuclientid
ClientSecret=seuclientsecret
RedirectURI=http://127.0.0.1:1500
Scope=https://mail.google.com/
 

* Lembrando que o scope deve estar definido também na configuração do aplicativo lá no Cloud Api Console do google

 

Editado por Patrick Alves
  • Membros Pro
Postado

Eu selecionei o escopo, mas está pedindo para fazer uma verificação, é assim mesmo?

Eu coloquei em anexo o arquivo "Configuração OAUTH Gmail.pdf", que é o passo a passo que eu segui para criar as credenciais.
Poderia verificar se eu fiz certo?

 

image.thumb.png.ebd28af22f9c07e002f52a9de4cf6683.png

image.png.4f09c145efe77f0dc597be15145ea61b.png

Configuração OAUTH Gmail.pdfFetching info...

Valter Patrick

Gerente de Projetos na empresa CTEC

(33)98400-0936

GitHub: https://github.com/valterpatrick

Postado
  Em 04/10/2024 at 20:19, valterpatrick disse:

mas está pedindo para fazer uma verificação, é assim mesmo?

Expandir  

Acho que pode ser porque vc colocou o app para produção... acredito que a verificação é o processo que eles fazem pra certificar que é vc mesmo... Ainda não coloquei um app em produção... kkkk

Se voltar o app para teste acho que não vai ter mais a verificação...

Pra não ter erro nos testes que fiz eu coloquei o scopo global https://mail.google.com/

Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.