Envío y Recepción de Emails con OAuth desde GeneXus (Gmail / Office 365)

Con el aumento de las medidas de seguridad en servicios como Gmail y Office 365, el uso de usuario/contraseña para enviar correos electrónicos dejó de ser una opción viable. Actualmente, OAuth 2.0 es el estándar para autorizar el acceso a estos servicios. En este post, te muestro cómo integrarlo con GeneXus para enviar y recibir correos de forma segura.

Por un tiempo funciono correctamente el generar "application specific passwords" generando y registrando dichas contraseñas, pero estan dejando de funcionar y ya no es tan facil llegar a generar nuevas contraseñas. Por eso, es importante actualizar las aplicationes que necesiten enviar o recibir mail con estos proveedores para que usen OAuth 2.0. 

Para esto, se necesita usar el OAuth Module,  y programar algo asi:

&Success = OAuth.v2.RefreshToken(&OAuthAuthorizationConfig, &RefreshToken, &OAuthAccessToken, &DateTimeTokenExpire, &Messages) if (NOT &Success) Log.Error(&Messages) return endif

&AccessTokenString = &OAuthAccessToken.access_token &SMTPSession.Host = 'smtp.gmail.com'   &SMTPSession.Port = 465   &SMTPSession.Timeout = 20   &SMTPSession.Secure = 1   &SMTPSession.Authentication = 1   &SMTPSession.UserName = 'Info@gmail.com'   &SMTPSession.Password = &AccessTokenString   &SMTPSession.AuthenticationMethod = "XOAUTH2" &SMTPSession.Login()   &MailMessage.Subject="Email Subject" &MailMessage.Text="Message body"  &MailRecipient.Address = "xxx@gmail.com"   &MailRecipient.Name = "xxx"    

&MailMessage.To.Add(&MailRecipient)   &SMTPSession.Send(&MailMessage)

Para recibir mails, seria algo parecido (sin manejo de errores)

/* Antes de usar esto, hay que obtener el &ClientId &ClientSecret &MailHostToken */ &OAuthAuthorizationConfig.AccessTokenUrl = OAuth.v2.AccessTokenProvider.Google &OAuthAuthorizationConfig.ClientId = &ClientID &OAuthAuthorizationConfig.ClientSecret = &ClientSecret &Success = OAuth.v2.RefreshToken(&OAuthAuthorizationConfig, &MailHostToken, &OAuthAccessToken, &DateTimeTokenExpire, &OutMessages) if Not &Success Log.Error(&OutMessages.ToJson()) ... return else &POP3Session.newMessages = 0 &POP3Session.Host = 'pop.gmail.com' &POP3Session.Port = 995 &POP3Session.Secure=1 &POP3Session.UserName = &MailUserName &POP3Session.Password = &OAuthAccessToken.access_token &POP3Session.AuthenticationMethod = "XOAUTH2" if &POP3Session.ErrCode <> 0 .... endif endif Una cosa que es importante si están con .net, es AGREGAR EL ARCHIVO config.gx  en la raíz de la KB y poner las líneas:

  SMTPSession=MailKit OpenPOP=MailKit


De esta forma se va modificar para que use esa biblioteca para el envio y recepcion de mails.

Comentarios

Entradas más populares de este blog

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Aplicación monolítica o distribuida?

Migrando de GeneXus 9.0 a GeneXus X.