Примерно так, я в скриптах беру запас пожёстче: множитель 1.4 и минус пара сотен килобайт на шапку.
Порядок, которым считаю перед отправкой пачки:
import os
potolok = 36700160 # SIZE из EHLO
fayl = "/tmp/maket.pdf"
syroy = os.path.getsize(fayl)
posle = (syroy + 2) // 3 * 4 # base64
posle += posle // 76 * 2 # переносы строк
shapka = 4096 # заголовки и границы MIME
print(syroy, "->", posle + shapka, "потолок", potolok)
print("влезет" if posle + shapka < potolok else "режем")
Числа сходятся с тем, что реально уходит по проводу, сверял на десятке файлов.
Теперь по вашей задаче. Один и тот же файл ведёт себя по-разному, потому что потолки у приёмников свои и часто разведены по направлениям: на приём одно число, на отдачу другое. Плюс у корпоративных ящиков сверху накручен потолок самого ящика, и он бывает ниже серверного.
разбираю чужие конфиги за печенье