Ir para conteúdo
  • Cadastre-se

dev botao

Envio de Email outlook


Ver Solução Respondido por guilhermekm,

Recommended Posts

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
Link para o comentário
Compartilhar em outros sites

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.pas unit1.pas unit1.dfm

Editado por Patrick Alves
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

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....

Link para o comentário
Compartilhar em outros sites

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.pas unit1.pas unit1.dfm

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
14 minutos atrás, 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

Só precisa desta unit?

Valter Patrick

Gerente de Projetos na empresa CTEC

(33)98400-0936

GitHub: https://github.com/valterpatrick

Link para o comentário
Compartilhar em outros sites

7 minutos atrás, saulo.figueiredo disse:

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

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
Link para o comentário
Compartilhar em outros sites

  • Membros Pro
17 horas atrás, 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

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

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
5 minutos atrás, 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

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

Link para o comentário
Compartilhar em outros sites

@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
Link para o comentário
Compartilhar em outros sites

  • Membros Pro
Agora, 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

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

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
16 minutos atrás, Patrick Alves disse:

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

image.png.c34b6ef04d9965811621110f60e33938.png

 

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

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
Agora, Patrick Alves disse:

@valterpatrick

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

Blz, vou testar.
Valeu.

Valter Patrick

Gerente de Projetos na empresa CTEC

(33)98400-0936

GitHub: https://github.com/valterpatrick

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
3 horas atrás, Patrick Alves disse:

@valterpatrick

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

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

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
3 minutos atrás, Patrick Alves disse:

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

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

Link para o comentário
Compartilhar em outros sites

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

[Email]
[email protected]
FromName=Patrick
Host=smtp.gmail.com
Port=587
[email protected]
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
Link para o comentário
Compartilhar em outros sites

  • Membros Pro

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.pdf

Valter Patrick

Gerente de Projetos na empresa CTEC

(33)98400-0936

GitHub: https://github.com/valterpatrick

Link para o comentário
Compartilhar em outros sites

14 minutos atrás, valterpatrick disse:

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

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/

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.

The popup will be closed in 10 segundos...