С ценной помощью от @tarleb (который указал мне правильное направление) мне удалось прийти к такому решению:
reject_sender_login_mismatch
в конец секции smtpd_sender_restrictions
; virtual_mailbox_domains
и virtual_alias_maps
, основанные на запросах MySQL, добавить smtpd_sender_login_maps = mysql: /etc/postfix/mysql-virtual_sender-login-maps. cf
. Это карты, используемые postfix для того, чтобы убедиться, что email логина отправителя и поле from
совпадают;Создайте /etc/postfix/mysql-virtual_sender-login-maps.cf
со следующим содержанием:
user = emailserveruser
пароль = sdfjn1234ns
hosts = 127.0.0.1
dbname = mailstack
query = SELECT * FROM (SELECT email FROM `virtual_users` WHERE email = '%s' UNION SELECT destination FROM `virtual_alias` WHERE source = '%s' ) a
Как это работает?
Postfix выдаст вам письмо From
как %s
и исключает получение в результате запроса адреса, совпадающего с адресом, используемым при SMTP-аутентификации.
В этом случае мы сначала делаем запрос к таблице virtual_users
, и если оттуда ничего не приходит (то есть нет реального пользователя с таким email), мы делаем запрос к virtual_alias
, чтобы получить destination
адрес (почтовый ящик реального пользователя), который соответствует потенциальному email псевдониму (наше поле source
).
Если совпадений нет, запрос ничего не возвращает, это означает, что: 1) нет такого пользователя с таким email 2) нет такого псевдонима для любого пользователя с таким email -- тогда Postfix выдает почтовому клиенту ошибку Sender address rejected: not owned by user
.
#!/bin/bash
get_attr() {
# pass '%f' to $2 to get file name(s) or '%s' to get file size(s)
find "$1" -maxdepth 1 -type f -printf "$2\n"
}
while read -r file
do
(( $(get_attr "dir2/$file" '%s') > $(get_attr "dir1/$file" '%s') )) \
&& realpath -e "dir2/$file"
done < <(get_attr dir2 '%f')
Это предполагает, что все файлы в dir2
имеют те же имена, что и файлы в dir1
, как вы описали выше.
realpath
печатает абсолютный путь к файлу.
Этот скрипт также сравнивает скрытые файлы (файлы, начинающиеся с.
).
#!/usr/bin/env zsh
zmodload -F zsh/stat b:zstat
for file2 in dir2/*(.); do
file1="dir1/${file2##*/}"
if [ -f "$file1" ] &&
[ "$( zstat +size "$file2" )" -gt "$( zstat +size "$file1" )" ]
then
printf '%s is bigger than %s\n' "$file2" "$file1"
fi
done
Это сценарий оболочки zsh
, который использует встроенный -в команде zstat
для переносимого получения размеров файлов.
Сценарий будет перебирать все обычные файлы с не -скрытыми именами в каталоге dir2
. Для каждого файла в dir2
будет создан соответствующий путь к файлу в dir1
. Если файл в dir1
существует и является обычным файлом (или символической ссылкой на обычный файл ), сравниваются размеры двух файлов. Если файл в dir2
строго больше, выводится короткое сообщение.
Шаблон dir2/*(.)
будет соответствовать только не -скрытым именам обычных файлов в каталоге dir2
. (.)
— это специфический модификаторzsh
-для *
, который позволяет ему соответствовать только обычным файлам.
Выражение "dir1/${file2##*/}"
будет расширено до имени пути, начинающегося с dir1/
и затем содержащего значение $file2
с удалением всего до и включая последнее /
. Это можно изменить на "dir1/$( basename "$file2" )"
.