Tengo un sitio que crea dinámicamente una URL de correo que luego abre en una nueva pestaña/ventana, usando window.open().
window.open("mailto:" + encodeURIComponent(r["to"]));Estoy probando en Chrome en esta etapa, por lo que otros navegadores pueden actuar de manera diferente.
Si Chrome tiene configurado un controlador de protocolo mailto (por ejemplo, GMail), entonces funciona como se esperaba.
Si Chrome no tiene configurado un controlador de protocolo mailto, simplemente abre una pestaña con la url mailto y nada más.
Ese no es el peor resultado, pero sería bueno si hubiera una forma de saberlo de antemano, de modo que el usuario pudiera ser guiado de alguna manera para configurar su navegador para que la url de mailto funcione bien.
Anteriormente, solo abría en la misma página configurando window.location.href en la url:
windows.location.href = "mailto:" + encodeURIComponent(r["to"]);Esto no fue genial porque si no había un controlador de protocolo establecido, no pasaba nada . También consideraría esto como una opción, SI al menos puedo detectar la situación, pero tampoco pude encontrar ninguna indicación de eso. Supongo que una opción sería establecer un temporizador que, si llegara a la ejecución, podría alertar al usuario.
¿Alguien más ya resolvió esto? Parece un requisito bastante común.
Gracias
Esto es con lo que terminé trabajando. No funciona en todos los casos, pero proporciona al menos alguna ayuda para reconocer protocolos no controlados.
Intenta abrir la URL en una nueva ventana y luego, después de 2 segundos, echa un vistazo para ver si puede leer la ubicación. Si ha abierto un sitio de un tercero (p. ej., GMail), esto generará una excepción, por lo que tratamos esto como un éxito .
Si no ocurre ninguna excepción, esto devuelve "about:blank", lo que significa que (probablemente) fallamos.
function openWin(url) { return new Promise((resolve, reject) => { const w = window.open(url); if (!w) { reject(); } setTimeout(function() { try { const working = w.document.location.href; } catch (e) { resolve(); return; } w.close(); reject(); }, 2000); }); }Llamado con algo como esto:
openWin('mailto:' + encodeURIComponent(to)).then(() => { // handle success }).catch(() => { // handle failure });Advertencia: esto solo funciona para los controladores de protocolos basados en la web. Si, por ejemplo, su mailto es manejado por una aplicación de correo electrónico, esto fallará.
En mi caso, la mayoría de la gente usaría el correo electrónico basado en la web, por lo que funciona en la mayoría de los casos. En caso de falla , muestro un mensaje que dice "Si su correo electrónico no se abrió, copie la dirección de correo electrónico aquí..."