Quickly identify the sender of email messages in Gmail without opening the message. Now marks emails in red if the domain is not allowed.
// ==UserScript==
// @name Gmail Sender Icons
// @name:es Gmail Iconos de Remitente
// @namespace http://tampermonkey.net/
// @version 1.4
// @description Quickly identify the sender of email messages in Gmail without opening the message. Now marks emails in red if the domain is not allowed.
// @description:es Identifica rápidamente al remitente de los mensajes de correo en Gmail sin abrir el mensaje. Ahora marca los correos en rojo si el dominio no está permitido.
// @author IgnaV
// @match https://mail.google.com/*
// @icon https://ssl.gstatic.com/ui/v1/icons/mail/rfr/gmail.ico
// @license MIT
// @grant GM_setValue
// @grant GM_getValue
// ==/UserScript==
(function() {
'use strict';
if (window.self !== window.top) return;
const userId = window.location.href.match(/\/u\/(\d+)\//)[1];
const addIcon = GM_getValue('addIcon', true);
const addDomain = GM_getValue('addDomain', true);
const allowedCommonDomains = GM_getValue('allowedDomains', []);
const allowedUserDomains = GM_getValue('allowedUserDomains', {});
const userDomains = allowedUserDomains[userId] || [];
allowedUserDomains[userId] = userDomains;
GM_setValue('addIcon', addIcon);
GM_setValue('addDomain', addDomain);
GM_setValue('allowedUserDomains', allowedUserDomains);
const allowedDomains = allowedCommonDomains.concat(userDomains);
const hasDomains = allowedDomains.length !== 0;
if (!addIcon && !addDomain && !hasDomains) return;
const processedElements = new Set();
function addDomainContainer(element, domain) {
const domainContainer = document.createElement('div');
domainContainer.className = 'domain-container';
addIconToContainer(domainContainer, domain);
addDomainToContainer(domainContainer, domain);
element.appendChild(domainContainer);
return domainContainer;
}
function addIconToContainer(domainContainer, domain) {
const icon = document.createElement('img');
icon.src = `https://www.google.com/s2/favicons?domain=${domain}`;
icon.className = 'domain-icon';
domainContainer.appendChild(icon);
}
function addDomainToContainer(domainContainer, domain) {
const domainSpan = document.createElement('span');
domainSpan.className = 'domain-text';
domainSpan.textContent = domain;
domainContainer.appendChild(domainSpan);
}
function markUnknownDomain(domainElement, domain) {
if (!allowedDomains.includes(domain)) {
domainElement.classList.add('not-allowed-domain');
}
}
function markUnknownEmail(emailElement, email) {
const domain = extractDomain(email);
if (!allowedDomains.includes(domain)) {
emailElement.classList.add('not-allowed-domain');
}
}
function extractDomain(email) {
const domainParts = email.split('@')[1].split('.');
if (domainParts[domainParts.length - 2] === 'com') {
return domainParts.slice(-3).join('.');
}
return domainParts.slice(-2).join('.');
}
if (!addIcon && !addDomain) {
addDomainContainer = function() {};
}
if (!addIcon) {
addIconToContainer = function() {};
}
if (!addDomain) {
addDomainToContainer = function() {};
}
if (!hasDomains) {
markUnknownDomain = function() {};
markUnknownEmail = function() {};
}
function addStyles(addIcon, addDomain, hasDomains) {
const style = document.createElement('style');
style.type = 'text/css';
let css = ``;
if (addIcon || addDomain) {
css += `
.bA4 {
padding-top: 9px;
}
.domain-container {
display: flex;
align-items: center;
margin-top: -4px;
font-size: 10px;
color: #888;
width: fit-content;
height: 11px;
padding: 1px 2px;
}
`;
}
if (addIcon) {
css += `
.domain-icon {
width: 10px;
height: 10px;
margin-right: 3px;
}
`;
}
if (addDomain) {
css += `
.domain-text {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-size: 10px;
color: #888;
}
`;
}
if (hasDomains) {
css += `
.not-allowed-domain {
background-color: #f8d7da;
color: #721c24;
border-radius: 3px;
}
`;
}
style.appendChild(document.createTextNode(css));
document.head.appendChild(style);
}
function addDomainBelowName() {
const nameElements = document.querySelectorAll('.bA4');
nameElements.forEach((element) => {
if (processedElements.has(element)) return;
const emailElement = element.querySelector('[email]');
if (!emailElement) return;
const email = emailElement.getAttribute('email');
const domain = extractDomain(email);
const domainElement = addDomainContainer(element, domain);
markUnknownDomain(domainElement, domain);
processedElements.add(element);
});
}
function markEmailInOpenedMessage() {
const containerElement = document.querySelector('h3:has(> span > .gD[email])');
const emailElement = containerElement ? containerElement.querySelector('.gD[email]') : null;
if (emailElement) {
const email = emailElement.getAttribute('email');
markUnknownEmail(containerElement, email);
}
}
addStyles(addIcon, addDomain, hasDomains);
const observer = new MutationObserver((mutations) => {
mutations.forEach(() => {
addDomainBelowName();
markEmailInOpenedMessage();
});
});
observer.observe(document.body, {
childList: true,
subtree: true
});
window.addEventListener('load', () => {
addDomainBelowName();
markEmailInOpenedMessage();
});
})();