Продолжение поста «Добавил иконки в Gmail почту! Красота =)»1
Напомню. Я сделал расширение, которое добавляет иконки в Gmail почту. И в комментариях попросили сделать не расширением, а скриптом для Tampermonkey. Мне было лень, но потом я подумал почему бы и нет. Скинул код в chatGPT и он подогнал его под формат Tampermonkey. Ниже расскажу как поставить чтоб работало.
Выглядит вот так:
Как поставить?
Установить Tampermonkey если у вас его ещё нет https://chromewebstore.google.com/detail/tampermonkey/dhdgff...
Правой кнопкой по иконке расширения и Параметры
В верхнем меню панели Tampermonkey жмём на плюсик и открывается страница создания нового скрипта
Вставляем код скприта сюда и сохраняем
Готово.
Вот сам код скрипта:
// ==UserScript==
// @name Gmail Sender Favicon (base + S2, fallback letter)
// @namespace https://tampermonkey.net/
// @VERSION 2026-01-02
// @Description Gmail: show sender base-domain favicon; fallback to Google S2; then fallback to letter.
// @match https://mail.google.com/*
// @run-at document-idle
// ==/UserScript==
(() => {
'use strict';
const STYLE_ID = 'gm-sender-favicon-style-final';
const BADGE_CLASS = 'gm-sender-badge-final';
function injectStyles() {
if (document.getElementById(STYLE_ID)) return;
const style = document.createElement('style');
style.id = STYLE_ID;
style.textContent = `
.${BADGE_CLASS}{
display:inline-flex;
align-items:center;
margin-right:6px;
vertical-align:middle;
flex: 0 0 auto;
transform: translateY(-0.5px);
}
.${BADGE_CLASS} img{
width:14px;height:14px;border-radius:3px;display:block;
}
.${BADGE_CLASS} .gm-letter{
font-weight:700;
font-size:12px;
line-height:1;
display:inline-block;
}
`;
document.documentElement.appendChild(style);
}
// ---------- domain/email helpers ----------
function extractEmailLike(str) {
if (!str) return '';
const s = String(str);
// <mail@domain>
const m1 = s.match(/<\s*([a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,})\s*>/i);
if (m1) return m1[1];
// mail@domain
const m2 = s.match(/([a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,})/i);
if (m2) return m2[1];
return '';
}
function getDomainFromEmail(email) {
const at = (email || '').indexOf('@');
if (at === -1) return '';
return email.slice(at + 1).trim().toLowerCase();
}
// Простая нормализация к base-domain: example.com
function baseDomain(domain) {
const parts = (domain || '').split('.').filter(Boolean);
if (parts.length < 2) return domain || '';
return parts.slice(-2).join('.');
}
// стабильный цвет по seed (чтобы буква была “привычного” цвета)
function stableColor(seed) {
let h = 0;
for (let i = 0; i < seed.length; i++) h = (h * 31 + seed.charCodeAt(i)) | 0;
const hue = Math.abs(h) % 360;
return `hsl(${hue}, 70%, 40%)`;
}
function pickLetter(senderText, base) {
const m = (senderText || '').match(/[a-z0-9а-яё]/i);
if (m) return m[0].toUpperCase();
if (base) return base[0].toUpperCase();
return '?';
}
// ---------- locating sender in a row ----------
function findSenderInfo(row) {
// 1) самый надежный: span[email]
const emailSpan = row.querySelector('span[email]');
if (emailSpan) {
const email = emailSpan.getAttribute('email') || '';
const senderText =
(emailSpan.getAttribute('name') || '').trim() ||
(emailSpan.getAttribute('aria-label') || '').trim() ||
(emailSpan.textContent || '').trim();
return { email, senderText, senderNode: emailSpan };
}
// 2) data-hovercard-id часто содержит email
const hcSpan = row.querySelector('span[data-hovercard-id]');
if (hcSpan) {
const hc = hcSpan.getAttribute('data-hovercard-id') || '';
const email = extractEmailLike(hc) || extractEmailLike(hcSpan.getAttribute('aria-label')) || '';
const senderText =
(hcSpan.getAttribute('name') || '').trim() ||
(hcSpan.getAttribute('aria-label') || '').trim() ||
(hcSpan.textContent || '').trim();
return { email, senderText, senderNode: hcSpan };
}
// 3) иногда sender виден как yP/zF
const nameSpan = row.querySelector('span.yP, span.zF');
if (nameSpan) {
const email =
extractEmailLike(nameSpan.getAttribute('aria-label')) ||
extractEmailLike(nameSpan.getAttribute('title')) ||
'';
const senderText =
(nameSpan.getAttribute('aria-label') || '').trim() ||
(nameSpan.getAttribute('title') || '').trim() ||
(nameSpan.textContent || '').trim();
return { email, senderText, senderNode: nameSpan };
}
return null;
}
// ---------- badge creation ----------
function makeBadge(base, letter, fontSizePx) {
const badge = document.createElement('span');
badge.className = BADGE_CLASS;
badge.setAttribute('data-base', base || '');
const img = document.createElement('img');
img.alt = '';
img.referrerPolicy = 'no-referrer';
const sources = base
? [
`https://${base}/favicon.ico`,
`https://www.google.com/s2/favicons?sz=64&domain=%24%7Ben...}`
]
: [];
let idx = 0;
const fallbackToLetter = () => {
img.remove();
const span = document.createElement('span');
span.className = 'gm-letter';
span.textContent = letter;
span.style.color = stableColor(base || letter || 'x');
if (fontSizePx) span.style.fontSize = fontSizePx;
badge.appendChild(span);
};
img.onerror = () => {
idx++;
if (idx < sources.length) {
img.src = sources[idx];
} else {
fallbackToLetter();
}
};
if (sources.length) {
img.src = sources[0];
badge.appendChild(img);
} else {
fallbackToLetter();
}
return badge;
}
// ---------- main enhancer ----------
function enhanceRow(row) {
const info = findSenderInfo(row);
if (!info) return;
const domain = getDomainFromEmail(info.email);
const base = baseDomain(domain);
// текст для буквы
const senderText = info.senderText || (info.senderNode?.textContent || '').trim();
const letter = pickLetter(senderText, base);
// куда вставлять:
// A) предпочитаем контейнер отправителя (как у тебя работало)
let target = row.querySelector('.yX.xY');
// B) если нет — рядом с узлом senderNode
let insertBeforeNode = null;
if (!target && info.senderNode && info.senderNode.parentElement) {
target = info.senderNode.parentElement;
insertBeforeNode = info.senderNode;
}
if (!target) return;
// уже вставлено?
const existing = target.querySelector(`:scope > .${BADGE_CLASS}`);
if (existing) {
const exBase = existing.getAttribute('data-base') || '';
if (exBase === (base || '')) return;
existing.remove();
}
const cs = window.getComputedStyle(target);
const fontSizePx = cs.fontSize ? `calc(${cs.fontSize} - 1px)` : '';
const badge = makeBadge(base, letter, fontSizePx);
if (insertBeforeNode) target.insertBefore(badge, insertBeforeNode);
else target.prepend(badge);
}
function enhanceAll() {
injectStyles();
document.querySelectorAll('.zA').forEach(enhanceRow);
}
// ---------- observer (throttled) ----------
let rafPending = false;
function schedule() {
if (rafPending) return;
rafPending = true;
requestAnimationFrame(() => {
rafPending = false;
enhanceAll();
});
}
const obs = new MutationObserver(schedule);
obs.observe(document.body, { childList: true, subtree: true });
enhanceAll();
})();
Про письма
Очень большая печаль у меня от того, что целая страна больше не будет письмами обмениваться. Этак, думаю я, так и до нас дойдет, чего доброго.
А у нас культура писем очень такая великая.
Все классики письма писали, и друг другу, и жене, и издателю своему. Пушкин, например, у жены про беременность спрашивал, а у издателя — про деньги. Горький планами делился.
В полном собрании сочинений (ПСС) обязательно будет целый том с письмами — если кто-то из современных писателей доживется до своего ПСС, даже не знаю, что там публиковать будут вместо писем, неужели же аськины логи?
В армию письма писали. Из армии письма писали. Письма потом в альбом вклеивали. Кто-то потом перечитывал.
Вот что точно читали и перечитывали — фронтовые «треугольники». Особенно в тех семьях, где кто-то с войны не вернулся. Пока есть письмо — голос слышно. Перечитывали, чтобы помнить.
Открытки почтовые — тоже целая история. Новогодние советские — вообще создают настроение и до сих пор тиражируются.
Письма писались дальним родственникам в разные города и села. По почерку можно было узнать, в каком настроении и здравии автор. Листочек можно было понюхать (хрестоматийно письма духами поливали или кто-то цветочек полевой вкладывал для настроения). В письме можно было денег прислать или фотографию. На листе можно было что-то накалякать. Или сердечко нарисовать — кривое, может, но от души.
Как-то печально, что все вот это вот сейчас особо не используется. Но это как с таксофонами и «Матрицей»: пока есть возможность, будет какая-то надежда.
Пишите письма, если есть кому.
Продолжение поста «30 декабря 2025 года - последний день, когда почта Дании будет доставлять бумажные письма»1
"Кризис не помешал руководителям почты получить премии". Типичная история, но есть нюанс
Мы в России нередко слышим истории, когда руководители государственных и окологосударственных структур и предприятий вопреки всем печальным результатам своей деятельности получают огромные премии. И считаем, что такое возможно только "у нас". Но, оказывается, совершенно зря так считаем.
Вот прекрасная история, которая наглядно иллюстрирует, что чиновники везде одинаковые. (история не новая, но сути это не меняет)
Несмотря на серьёзные экономические проблемы у шведско-датской государственной почтовой компании PostNord, её руководство повысило себе зарплаты и размер премий.
В настоящее время у девяти человек в PostNord годовой оклад превышает 3 миллиона крон, показывают данные ежегодного отчёта компании.
В 2016 году убытки государственной почты Дании и Швеции PostNord AB составили более 1,5 млрд крон. Но это не помешало руководству PostNord увеличить себе размер заработной платы и пенсионных расходов на 23%, с 60,7 млн до 74,4 млн крон.
Годовая зарплата генерального директора Хокана Эрикссона (Håkan Ericsson) выросла с 9,1 млн до 9,4 млн крон. 2,9 млн крон Эрикссон получил в виде премии.
Бывшему генеральному директору Postnord Danmark Хеннингу Кристиансену (Henning Christiansen) в июне 2016 года выплатили бонус в 8,2 миллиона крон.
Предыдущим директорам компания PostNord при увольнении тоже давала крупные бонусы:
Бывший финансовый директор Хенрик Раттзен (Henrik Rättzen) в 2014 году получил пенсионный бонус в размере 6,8 млн крон.
В мае 2013 года бывшему административному директору PostNord Ларсу Идермарку (Lars Idermark) дали 5,3 миллиона крон, когда он ушёл из компании. Стоит заметить, что этот бонус был ему выплачен несмотря на то, что он отработал на этой должности всего четыре с половиной месяца.
В течение двух-трёх лет PostNord уволит 3 500 – 4 000 работников в Дании и 700 человек в Швеции.
30 декабря 2025 года - последний день, когда почта Дании будет доставлять бумажные письма1
После 400 лет традиции почтовая служба Дании PostNord, которая отвечает за доставку письменной корреспонденции с 1624 года, доставит последнее письмо 30 декабря и больше не будет оказывать эту услугу.
Приём последних деловых писем, прямые почтовые и журнальные рассылки закончились 18 декабря 2025 года, последние срочные и заказные письма, письма с уведомлением о вручении приняты вчера.
Ещё в начале этого года компания заявила, что сократит 1500 рабочих мест и демонтирует 1500 красных почтовых ящиков на фоне все большей цифровизации общества и роста онлайн-торговли, в связи с чем PostNord теперь будет сосредоточена только на доставке посылок.
1000 демонтированных почтовых ящиков были сразу выкуплены, ещё 200 в январе выставят на аукционе.
Массовая цифровизация убивает почтовые службы по всей Европе: немецкий Deutsche Post сокращает 8 тысяч рабочих мест ради уменьшения расходов, британская Royal Mail планирует доставлять письма только в будние дни, чтобы сэкономить.
Решение о прекращении доставки писем – не спонтанное, а результат многолетней цифровизации, в которой Дания давно стала мировым лидером.
Резкое падение объёмов: С начала 2000-х количество отправляемых писем сократилось более чем на 90%. Государственные цифровые платформы, такие как e-Boks и MitID, полностью вытеснили бумажные уведомления.
Экономическая нецелесообразность: Поддержка обширной сети почтальонов ради доставки единичных конвертов стала убыточной.
Бум электронной коммерции: В то время как письма уходят в прошлое, рынок посылок демонстрирует стремительный рост. PostNord перераспределяет ресурсы, чтобы стать логистической компанией нового поколения.
Почта Mail.ru злит
Пользуюсь продуктами Mail.ru уже десятилетия и вынужден искать более порядочный и ответственный почтовый сервис.
Уже не получается просто зайти на сайт для проверки почты. Большая часть экрана занята рекламными баннерами и совершенно ненужными сервисами, вроде гороскопа и новостей.
Владельцам этого показалось мало. На главной странице додумались включать трансляцию Первого канала! Зачем? Я хоть раз в жизни об этом просил? Получается, заходишь просто проверить письма, а мобильный трафик просто улетает на совершенно ненужную трансляцию телепередач.
Но и этого владельцам показалось недостаточно. При попытке входа в почту, на весь экран выскакивает какое-то совершенно ненужное объявление. Я никогда в жизни не искал текстильные стропы!
Это просто возмутительно!
Почту пока не удаляю, буду использовать в качестве основной почту от другой компании, уважающей своих пользователей. В будущем просто откажусь от таких услуг.
На очереди также сервисы от Яндекса
Ответ на пост «Реклама в уведомлениях»1
Хочется ещё и ещё раз спросить рекламщиков. Ведь заходите же на Пикабу, читаете?
- Вот неужели вы, все вы свято верите, что вот эта ваша, изо всех утюгов без толка и спроса капающая, сочащаяся и воняющая реклама, от которой народ плюётся и стремится убежать, хоть бы и за деньги - принесёт какую-то пользу?
- Неужели вам неизвестно, что из-за отвращения к этому назойливому втюхиванию у любого человека сработает принцип переноса и отождествления и он станет ненавидеть не только рекламу, но и сам продукт?
Или вам где-то в выкинутых на помойку запаных брошюрках по "маркетингу и пысихологии" пытались навязать другое?
Таки вас обманули.





