Outlook ya no envía mis correos desde Access, no reconoce la contraseña
Desde access envío un correo electrónico al cliente con el PDF de una factura a través de outlook, pero recientemente con la seguridad actual (oAuth) ya no me deja, utilizo outlook 2016 ¿alguien sabe como resolverlo?
1 Respuesta
El problema que describe se debe a que Microsoft ha actualizado sus políticas de seguridad para aplicaciones que utilizan autenticación básica (usuario y contraseña). Outlook 2016 utiliza este método por defecto, y con la adopción de OAuth (un sistema de autenticación más seguro), las aplicaciones que no lo soportan pueden enfrentar problemas de acceso.
Opciones para resolver el problema
1. Actualizar Office a una versión compatible con OAuth
Outlook 2016 no soporta OAuth de forma nativa, pero puede actualizar a una versión más reciente de Microsoft Office (como Microsoft 365 o Office 2019) que soporte OAuth. Esto permitirá integrar el flujo de autenticación moderno con su cuenta.
2. Habilitar la autenticación de aplicaciones no seguras
Si está utilizando una cuenta de correo personal (como Outlook.com), esta opción ha sido deshabilitada por Microsoft en la mayoría de los casos y no es recomendable debido a los riesgos de seguridad.
Para cuentas de Microsoft 365, podría habilitar contraseñas de aplicación desde el portal de administración (si tu cuenta lo permite), aunque este método también está siendo eliminado.
3. Usar la biblioteca Microsoft Graph API
Este método es más moderno y seguro. Requiere implementar autenticación OAuth 2.0 en su proyecto de Access VBA y enviar correos mediante Microsoft Graph.
Pasos básicos:
Registrar una aplicación en el portal de Azure para tu cuenta.
Configurar permisos de acceso al correo (Mail. Send).
Modificarsu código para usar una biblioteca HTTP que gestione OAuth y realice las solicitudes a la API de Microsoft Graph.
4. Configurar SMTP con OAuth
Configure su aplicación VBA para enviar correos directamente a través de SMTP usando OAuth.
Outlook.com y Microsoft 365 usan el servidor SMTP smtp. Office365.com con el puerto 587.
Para no lidiar con Microsfot yo utilizo CDO y Gmail. Debe configurar su cuenta de Gmail creando una contraseña de apliicación, es decir, NO es su contraseña de Gmail, esto cambió hace un tiempo.
Hay un ejemplo de JJJT donde utiliiza una clase y un modulo para seleccionar el archivo adjunto el cual he editado para adaptarlo a Access de 64 bits. Hoy lo hago con Python.
Si quiere el ejemplo lo puede solcitar a [email protected]. Aunque no es de este foro le dejo como lo hago en Python con Gmail.
From email. Message import EmailMessage Import smtplib from tkinter import * From tkinter import messagebox, filedialog From PIL import ImageTk, Image class EmailSender: """Clase para manejar el envío de correos electrónicos.""" def __init__(self, remitente, password): self.remitente = remitente self.password = password self.archivos_adjuntos = [] def agregar_archivo_adjunto(self, archivo): """Agrega un archivo adjunto a la lista de adjuntos.""" self.archivos_adjuntos.append(archivo) def limpiar_adjuntos(self): """Limpia la lista de archivos adjuntos.""" self.archivos_adjuntos.clear() def enviar_email(self, destinatarios, asunto, mensaje): """Envia un correo electrónico a los destinatarios especificados.""" email = EmailMessage() email["From"] = self.remitente email["To"] = ", ".join(destinatarios) # Convertir lista en cadena separada por comas email["Subject"] = asunto email.set_content(mensaje) # Adjuntar archivos si hay seleccionados if self.archivos_adjuntos: for archivo in self.archivos_adjuntos: try: with open(archivo, "rb") as file: nombre_archivo = archivo.split("/")[-1] email.add_attachment(file.read(), maintype="application", subtype="octet-stream", filename=nombre_archivo) except Exception as e: raise Exception(f"No se pudo adjuntar el archivo {nombre_archivo}: {e}") # Envío de email try: smtp = smtplib.SMTP_SSL("smtp.gmail.com",465) smtp.login(self.remitente, self.password) smtp.sendmail(self.remitente, destinatarios, email.as_string()) smtp.quit() except Exception as e: raise Exception(f"No se pudo enviar el correo: {e}") class EmailApp: """Clase para la interfaz gráfica del envío de correos electrónicos usando Tkinter.""" def __init__(self, root): self.root = root self.root.title("APLICACIÓN DE MENSAJERÍA") self.root.geometry("400x670") self.root.resizable(0, 0) self.root.config(bd=10) # Centrando la ventana en la pantalla ancho_pantalla = root.winfo_screenwidth() alto_pantalla = root.winfo_screenheight() pos_x = int((ancho_pantalla - 400) / 2) pos_y = int((alto_pantalla - 670) / 2) self.root.geometry(f"400x670+{pos_x}+{pos_y}") # Inicializar la clase EmailSender self.email_sender = EmailSender("[email protected]", "mipass_gmail) # Variables self.asunto = StringVar() self.archivos_adjuntos = [] # Crear la interfaz self.crear_interfaz() def crear_interfaz(self): """Crea la interfaz gráfica con los widgets de Tkinter.""" Label(self.root, text="ENVIAR CORREO VIA GMAIL", fg="black", font=("Arial", 15, "bold"), padx=5, pady=5).grid(row=0, column=0, columnspan=2) # Imagen GMAIL imagen_gmail = Image.open("D:/EnviarEmailPython/logo_gmail.png") nueva_imagen = imagen_gmail.resize((125, 84)) render = ImageTk.PhotoImage(nueva_imagen) label_imagen = Label(self.root, image=render) label_imagen.image = render label_imagen.grid(row=1, column=0, columnspan=2) Label(self.root, text="Mi correo: [email protected]", fg="white", bg="blue", font=("Arial", 10, "bold"), padx=5, pady=5).grid(row=2, column=0, columnspan=2, pady=5) # Textbox para ingresar múltiples destinatarios Label(self.root, text="Destinatarios (uno por línea):", fg="black", font=("Arial", 10, "bold"), padx=5, pady=5).grid(row=3, column=0, columnspan=2) self.destinatarios_text = Text(self.root, height=5, width=42) self.destinatarios_text.grid(row=4, column=0, columnspan=2) Label(self.root, text="Asunto:", fg="black", font=("Arial", 10, "bold"), padx=5, pady=5).grid(row=5, column=0) Entry(self.root, textvariable=self.asunto, width=34).grid(row=5, column=1) Label(self.root, text="Mensaje:", fg="black", font=("Arial", 10, "bold"), padx=5, pady=5).grid(row=6, column=0) self.mensaje = Text(self.root, height=5, width=28, padx=5, pady=5) self.mensaje.grid(row=6, column=1) self.mensaje.config(font=("Arial", 9), padx=5, pady=5) # Listbox para mostrar archivos adjuntos Label(self.root, text="Archivos adjuntos:", fg="black", font=("Arial", 10, "bold"), padx=5, pady=5).grid(row=7, column=0, sticky="w") self.lista_adjuntos = Listbox(self.root, width=34, height=5) self.lista_adjuntos.grid(row=7, column=1) # Botones Button(self.root, text="Adjuntar archivos", command=self.adjuntar_archivos, height=2, width=15, bg="gray", fg="white", font=("Arial", 10, "bold")).grid(row=8, column=0, columnspan=2, padx=(50, 5), pady=20) Button(self.root, text="Enviar", command=self.enviar_email, height=2, width=10, bg="black", fg="white", font=("Arial", 10, "bold")).grid(row=9, column=0, columnspan=2, padx=(50, 5), pady=10) def adjuntar_archivos(self): """Función para seleccionar múltiples archivos adjuntos.""" archivos = filedialog.askopenfilenames(title="Seleccione archivos para adjuntar") if archivos: self.email_sender.archivos_adjuntos.extend(archivos) # Limpiar la lista antes de mostrar los nuevos archivos seleccionados self.lista_adjuntos.delete(0, END) # Mostrar archivos seleccionados en el Listbox for archivo in self.email_sender.archivos_adjuntos: self.lista_adjuntos.insert(END, archivo.split("/")[-1]) def enviar_email(self): """Función para enviar el correo electrónico usando la clase EmailSender.""" # Obtener los destinatarios como una lista destinatarios = self.destinatarios_text.get(1.0, 'end').strip().split("\n") destinatarios = [email.strip() for email in destinatarios if email.strip()] # Validar que los campos no estén vacíos if not destinatarios: messagebox.showwarning("Advertencia", "El campo 'Destinatarios' no puede estar vacío.") return if not self.asunto.get().strip(): messagebox.showwarning("Advertencia", "El campo 'Asunto' no puede estar vacío.") return if not self.mensaje.get(1.0, 'end').strip(): messagebox.showwarning("Advertencia", "El campo 'Mensaje' no puede estar vacío.") return try: self.email_sender.enviar_email(destinatarios, self.asunto.get(), self.mensaje.get(1.0, 'end')) messagebox.showinfo("MENSAJERIA", "Mensaje enviado correctamente") except Exception as e: messagebox.showerror("Error", str(e)) if __name__ == "__main__": root = Tk() app = EmailApp(root) Root. Mainloop()
Este pequeño aplicativo le permite enviar varios correos y múltiples archivos adjuntos.
Cambie [email protected] por su correo y mipass_gmail por la contraseña de aplicación que le da Google.
- Compartir respuesta