Предлагаю перевод интересной (на мой взгляд) статьи по фильтрации адресов электронной почты в gmail.
Основные принципы соответствия
Простым критерием проверки соответствия является Гугл поиск.
Вы должны вводить полные слова, т.к. не существует производных слов (например, joh не будет соответствовать john.smith@gmail.com). Тоже справедливо и для множественного числа (например, app не будет соответствовать apps@example.com).
Порядок слов не имеет значения, если они не заключены в кавычки (например, «smith john» не будет соответствовать john.smith@gmail.com). Как правило, символы игнорируются (см. ниже).
Слова разбиваются, кроме букв, цифр и символов подчеркивания. Самыми распространенными символами для разбивки слов являются +.@. Это означает, что foo не будет соответствовать foo_bar@example.com, но будет соответствовать foo+bar@example.com. Знак @ не считается за слово и может быть пропущен (например, «smith gmail» будет соответствовать john.smith@gmail.com).
Вы можете использовать оператор OR в дополнение к группировке() для некоторых сложных условий.
Поведение символов
Когда вы вводите символы в окне фильтра, то они как правило ведут себя по разному:
- Символы, которые действуют как x y: ~#$%^*+;",<>? и знак ударения*. Например, smith~john становится smith john, который соответствует john.smith@gmail.com.
- Символы, которые действуют как «x y»: -=:'./. Например, john-smith становится «john smith», который соответствует john.smith@gmail.com.
- Символы, которые трактуются буквально: &_. Например, john_smith будет соответствовать john_smith@gmail.com, но не john.smith@gmail.com.
- Специальные символы: !@()[]{}|:
- !: john!smith становится john -smith, что соответствует john.foo@gmail.com, но не john.smith@gmail.com;
- @:
- @ удаляется в конце слова. Например, john@ становится john, что соответствует john.smith@gmail.com;
- @ удаляется в начале слова. Например, @ foo.com** станет foo.com, что соответствует john+foo.com@gmail.com;
- @ используемый в середине слова, как правило требует полного адреса для успешного поиска. Например, john.smith@gmail не будет соответствовать john.smith@gmail.com. Кроме того, символы будут восприниматься буквально. Например, для поиска john.smith@gmail.com необходимо использовать john.smith@gmail.com, john-smith@gmail.com и john~smith@gmail.com не будут работать;
- @ используемый в разных местах в середине слова, имеет странное поведение. Например, когда мы пытаемся найти john.smith@gmail.com, то при:
- john@smith@gmail@com — не найдется;
- gmail@com — не найдется;
- @ gmail@com — не найдется**;
- smith@gmail@com — найдется;
- smith@gmail.com — не найдется;
- «john smith@gmail.com» — не найдется;
- «john.smith@gmail com» — не найдется;
- | действует как оператор OR.
- Скобки служат для группировки в операторах OR и AND.
Другие примеры поведения
Аккаунт, который вы используете по умолчанию (например, john.smith@gmail.com) будет соответствовать всем вариантам вашего адреса, если вы используете в нем точку, знак + или домен googlemail.com.
Вот краткое описание каждого способа:
- Использование точки: Вы можете вводить сколько угодно точек в вашем адресе электронной почты. Например, если ваш адрес — john.smith@gmail.com, то почта, отправленная на j.o.h.n.s.mith@gmail.com придет на ваш адрес;
- Использование знака +: После имени вашего аккаунта вы можете использовать знак "+" и любой текст. Например, почта, отправленная на адрес john.smith+foo@gmail.com придет на john.smith@gmail;
- Использование домена googlemail.com: Любая почта, отправленная на адрес вашего аккаунта типа <your-gmail-account>@googlemail.com придет на ваш адрес с доменом @ gmail.com**. Например, почта, отправленная на john.smith@googlemail.com придет на john.smith@gmail.com.
Способы представления адреса можно комбинировать друг с другом, например, j.o.h.n.s.m.i.t.h+foo.bar@googlemail.com = john.smith@gmail.com.
Интересные последствия
1. Невозможно сравнить все ваши гугл адреса, в которых используется точка.
Если у вас вошло в привычку использовать точку в вашем адресе электронной почты для предотвращения спама (например, j.ohn.smith@gmail.com), то вы не сможете легко создать фильтр для всех версий вашего адреса с точкой, т.к. они разделяются в этом случае на отдельные слова (j ohn smith).
Когда вы используете только один вариант, то фильтр, например для спама, создать легко. Тем не менее, когда вы начинаете использовать разные варианты использования точки (например, jo.h.n.smi.th@gmail.com), то это станет причиной появления разных слов в адресе (например, jo h n smi th), что заставит вас создать различные условия для каждого используемого варианта.
2. Символ + хуже чем оператор "" при сравнении адресов со знаком "+".
Если вы пытаетесь создать фильтр для адреса, в котором используется +, то лучше всего использовать полный адрес в фильтре (например, john.smith+foo@gmail.com).
Если, по какой-нибудь причине, вы не используете полный адрес, то следует иметь ввиду, что оператор + на самом деле хуже, чем оператор "". Например, использование john+foo хуже, чем «john foo», поскольку первый вариант будет соответствовать foo@john.com.
Имейте ввиду, что последний вариант не является панацеей, т.к. будет найден foo@john.foo.com. Он просто гарантирует правильный порядок слов. Для ясности, вы могли бы использовать «john+foo», но в действительности это тоже самое, что и «john foo».
3. Вы должны использовать отрицание, чтобы найти все адреса с "+", на которые была отправлена почта.
Чтобы отфильтровать все адреса, в которых используется + (например, чтобы отправить их в спам), вам следует использовать запрос вида john.smith@gmail.com -«john smith gmail com». Первая часть запроса найдет все адреса, в которых есть знак +. Вторая часть удалит все адреса, в которых нет слов в том же порядке. Например, john.smith+foo@gmail.com не будет найден, поскольку имеет слово foo между другими словами.
Обратите внимание, что есть один странный и маловероятный случай, когда это не будет работать: john.smith+john.smith.gmail.com@gmail.com, поскольку имеет слова в строго заданном порядке.
Примечания
* — имеется виду символ `, но к сожалению применения его нет у автора;
** — использовать без пробела, т.к. хабр форматирует в хабрапользователя.
Автор: andrvm