From 9e525a44c3684b0bc92f04e56b45f3e736dac6c2 Mon Sep 17 00:00:00 2001 From: Ruslan Date: Fri, 2 Oct 2026 06:01:00 +0000 Subject: [PATCH] Light-theme access emails + inline cid logo instead of broken data-URI Outlook desktop (Word rendering engine) does not support data: URI images at all - the logo in approval/rejection emails was silently dropped there. Fix: - app/static/logo-email.png: logo asset, attached as an inline MIME part with Content-ID instead of base64-embedded in - app/main.py _send_email(): builds a multipart/related message and attaches the logo as cid:mont_logo whenever html_body references it - all 6 client-facing access emails (approve/reject x 3 call sites): switched from dark gradient theme to a light theme (solid white card, dark text) - Outlook does not support CSS gradients either, so the old dark card + light text would have rendered as invisible light text on a default white background on top of the missing logo - footer contact address: mont@mont.ru -> RGalyaviev@mont.ru Co-Authored-By: Claude Sonnet 5 --- app/main.py | 209 +++++++++++++++++++++----------------- app/static/logo-email.png | Bin 0 -> 32423 bytes 2 files changed, 118 insertions(+), 91 deletions(-) create mode 100644 app/static/logo-email.png diff --git a/app/main.py b/app/main.py index bf82947..4ebd404 100644 --- a/app/main.py +++ b/app/main.py @@ -1,5 +1,6 @@ import datetime as dt import logging +import os import re import secrets import threading @@ -104,9 +105,22 @@ import ssl as _ssl import json as _json2 from email.mime.multipart import MIMEMultipart as _MIMEMultipart from email.mime.text import MIMEText as _MIMEText +from email.mime.image import MIMEImage as _MIMEImage from email.header import Header as _Header from email.utils import formataddr as _formataddr +# MONT logo for HTML emails, attached inline (Content-ID) rather than +# embedded as a base64 data: URI in . Outlook's desktop/Word +# renderer does not support data: URIs for images at all (silently +# drops them), so a cid: reference to an attached image is the only +# way to get the logo to show up there. +_LOGO_EMAIL_PATH = os.path.join(os.path.dirname(__file__), "static", "logo-email.png") +try: + with open(_LOGO_EMAIL_PATH, "rb") as _f: + _LOGO_EMAIL_BYTES = _f.read() +except OSError: + _LOGO_EMAIL_BYTES = b"" + def _generate_password(length: int = 10) -> str: alphabet = _string.ascii_letters + _string.digits while True: @@ -128,11 +142,24 @@ def _send_email(to: str, subject: str, html_body: str) -> None: # connection just to have the SMTP server reject the recipient a few # seconds later with a cryptic 501. raise ValueError(f"'{to}' не похож на email-адрес - уведомление не отправлено") - msg = _MIMEMultipart("alternative") + # "related" wrapper so the inline logo (Content-ID) sits alongside the + # alternative/html part rather than being just another attachment - + # needed for cid: references in html_body to resolve in mail clients. + has_logo = _LOGO_EMAIL_BYTES and "cid:mont_logo" in html_body + msg = _MIMEMultipart("related") if has_logo else _MIMEMultipart("alternative") msg["Subject"] = subject msg["From"] = _formataddr((str(_Header(SMTP_FROM_NAME, "utf-8")), SMTP_FROM_EMAIL)) msg["To"] = to - msg.attach(_MIMEText(html_body, "html", "utf-8")) + if has_logo: + alt = _MIMEMultipart("alternative") + alt.attach(_MIMEText(html_body, "html", "utf-8")) + msg.attach(alt) + logo = _MIMEImage(_LOGO_EMAIL_BYTES, "png") + logo.add_header("Content-ID", "") + logo.add_header("Content-Disposition", "inline", filename="logo.png") + msg.attach(logo) + else: + msg.attach(_MIMEText(html_body, "html", "utf-8")) ctx = _ssl.create_default_context() with _smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT, context=ctx) as srv: srv.login(SMTP_USERNAME, SMTP_PASSWORD) @@ -264,8 +291,8 @@ def _apply_access_decision(db, pending, days): if products: items = "".join(f"
  • {escape(p)}
  • " for p in products) products_html = ( - '

    Предоставлен доступ к продуктам:

    ' - f'
      {items}
    ' + '

    Предоставлен доступ к продуктам:

    ' + f'
      {items}
    ' ) day_word = "день" if days == 1 else ("дня" if days < 5 else "дней") @@ -275,40 +302,40 @@ def _apply_access_decision(db, pending, days): "Доступ к Инфраструктурному полигону MONT") email_subhead = "Ваш доступ продлён" if is_renewal else "Ваш запрос одобрен" cred_row = ( - f'Пароль' - f'{password}' + f'Пароль' + f'{password}' ) if not is_renewal else "" access_text = f"Вам {email_action} доступ к полигону на {days} {day_word}." html_email = f""" - +
    - +
    -
    - MONT
    -

    {email_subject}

    -

    {email_subhead}

    -
    + MONT +

    {email_subject}

    +

    {email_subhead}

    +
    -

    Здравствуйте, {escape(pending.name)}!
    +

    Здравствуйте, {escape(pending.name)}!
    {access_text}

    - - - - - +
    Адрес портала{portal_url}
    Логин{username}
    + + + + {cred_row} - - + +
    Адрес портала{portal_url}
    Логин{username}
    Доступ до{expires.strftime("%d.%m.%Y")}
    Доступ до{expires.strftime("%d.%m.%Y")}
    {products_html}
    - Если у вас возникли вопросы, свяжитесь с вашим менеджером MONT или напишите на mont@mont.ru +
    + Если у вас возникли вопросы, свяжитесь с вашим менеджером MONT или напишите на RGalyaviev@mont.ru
    """ @@ -329,22 +356,22 @@ def _apply_access_decision(db, pending, days): manager_contact = pending.manager if pending.manager else "менеджера MONT" html_email = f""" - +
    - +
    -
    - MONT
    -

    Запрос на доступ к полигону MONT

    -
    + MONT +

    Запрос на доступ к полигону MONT

    +
    -

    Здравствуйте, {escape(pending.name)}!

    +

    Здравствуйте, {escape(pending.name)}!

    К сожалению, на данный момент мы не можем предоставить доступ к полигону.

    -

    +

    Для уточнения деталей свяжитесь с {escape(manager_contact)}.
    - Если не знаете кто ваш менеджер — напишите на mont@mont.ru.

    + Если не знаете кто ваш менеджер — напишите на RGalyaviev@mont.ru.

    +
    С уважением, команда MONT
    @@ -619,8 +646,8 @@ async def _process_callback_query(cq: dict): if products: items = "".join(f"
  • {escape(p)}
  • " for p in products) products_html = ( - '

    Предоставлен доступ к продуктам:

    ' - f'
      {items}
    ' + '

    Предоставлен доступ к продуктам:

    ' + f'
      {items}
    ' ) day_word = "день" if days == 1 else ("дня" if days < 5 else "дней") @@ -630,40 +657,40 @@ async def _process_callback_query(cq: dict): "Доступ к Инфраструктурному полигону MONT") email_subhead = "Ваш доступ продлён" if is_renewal else "Ваш запрос одобрен" cred_row = ( - f'Пароль' - f'{password}' + f'Пароль' + f'{password}' ) if not is_renewal else "" access_text = f"Вам {email_action} доступ к полигону на {days} {day_word}." html_email = f""" - +
    - +
    -
    - MONT
    -

    {email_subject}

    -

    {email_subhead}

    -
    + MONT +

    {email_subject}

    +

    {email_subhead}

    +
    -

    Здравствуйте, {escape(pending.name)}!
    +

    Здравствуйте, {escape(pending.name)}!
    {access_text}

    - - - - - +
    Адрес портала{portal_url}
    Логин{username}
    + + + + {cred_row} - - + +
    Адрес портала{portal_url}
    Логин{username}
    Доступ до{expires.strftime("%d.%m.%Y")}
    Доступ до{expires.strftime("%d.%m.%Y")}
    {products_html}
    - Если у вас возникли вопросы, свяжитесь с вашим менеджером MONT или напишите на mont@mont.ru +
    + Если у вас возникли вопросы, свяжитесь с вашим менеджером MONT или напишите на RGalyaviev@mont.ru
    """ @@ -693,22 +720,22 @@ async def _process_callback_query(cq: dict): manager_contact = pending.manager if pending.manager else "менеджера MONT" html_email = f""" - +
    - +
    -
    - MONT
    -

    Запрос на доступ к полигону MONT

    -
    + MONT +

    Запрос на доступ к полигону MONT

    +
    -

    Здравствуйте, {escape(pending.name)}!

    +

    Здравствуйте, {escape(pending.name)}!

    К сожалению, на данный момент мы не можем предоставить доступ к полигону.

    -

    +

    Для уточнения деталей свяжитесь с {escape(manager_contact)}.
    - Если не знаете кто ваш менеджер — напишите на mont@mont.ru.

    + Если не знаете кто ваш менеджер — напишите на RGalyaviev@mont.ru.

    +
    С уважением, команда MONT
    @@ -1364,39 +1391,39 @@ async def telegram_webhook(request: Request, db: Session = Depends(get_db)): products_html = "" if products: items = "".join(f"
  • {escape(p)}
  • " for p in products) - products_html = f"

    Предоставлен доступ к продуктам:

      {items}
    " + products_html = f"

    Предоставлен доступ к продуктам:

      {items}
    " html_email = f""" - +
    - +
    -
    - MONT
    -

    Доступ к Инфраструктурному полигону MONT

    -

    Ваш запрос одобрен

    -
    + MONT +

    Доступ к Инфраструктурному полигону MONT

    +

    Ваш запрос одобрен

    +
    -

    Здравствуйте, {escape(pending.name)}!
    +

    Здравствуйте, {escape(pending.name)}!
    Вам предоставлен доступ к полигону на {days} {'день' if days==1 else 'дня' if days<5 else 'дней'}.

    - - - - - - - - - +
    Адрес портала{portal_url}
    Логин{username}
    Пароль{password}
    Доступ до{expires.strftime('%d.%m.%Y')}
    + + + + + + + +
    Адрес портала{portal_url}
    Логин{username}
    Пароль{password}
    Доступ до{expires.strftime('%d.%m.%Y')}
    {products_html}
    - Если у вас возникли вопросы, свяжитесь с вашим менеджером MONT или напишите на mont@mont.ru +
    + Если у вас возникли вопросы, свяжитесь с вашим менеджером MONT или напишите на RGalyaviev@mont.ru
    """ @@ -1429,22 +1456,22 @@ async def telegram_webhook(request: Request, db: Session = Depends(get_db)): manager_contact = pending.manager if pending.manager else "менеджера MONT" html_email = f""" - +
    - +
    -
    - MONT
    -

    Запрос на доступ к полигону MONT

    -
    + MONT +

    Запрос на доступ к полигону MONT

    +
    -

    Здравствуйте, {escape(pending.name)}!

    +

    Здравствуйте, {escape(pending.name)}!

    К сожалению, на данный момент мы не можем предоставить доступ к полигону.

    -

    +

    Для уточнения деталей, пожалуйста, свяжитесь с {escape(manager_contact)}.
    - Если вы не знаете, кто ваш менеджер, напишите нам на mont@mont.ru — мы поможем.

    + Если вы не знаете, кто ваш менеджер, напишите нам на RGalyaviev@mont.ru — мы поможем.

    +
    С уважением, команда MONT
    diff --git a/app/static/logo-email.png b/app/static/logo-email.png new file mode 100644 index 0000000000000000000000000000000000000000..49805c4f6ec460b26e4b21a0225aedaff5cbf051 GIT binary patch literal 32423 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�VtPCOY#dNO3@&hcN`f)sZb+f zzPp=Ad}Y5`!fVZ(i?o(!%t|jol>xb%v%Vg`U6B)PchS&yvJeg9_ea>3LCtDCf!9+o zOT5&2!Ph~8;nfCXUVp1l*P99IU609(XCkH>)ZQIk2`M3e zvQ}AC#<-jPNfZvSA$|{Qw*AmC;!^*I>P|B-WJh5{$4aM)#g_%B1dL3p>OCe)+v>w({jhnrE$IPy+s2#+0tniKWSsn1Rs;RKFsgW8TdS zV4UehQ(|bmmB>*^P1);*TYx*cE8&muUJYlZwJT@pL-o=}C4qGhfO7epv0DzwVN zAiN(mf2quECK1dTkRdIEf`|6Wot2!KSO>`X+BVkAQxbR+}Ui3-(aOu(9gt_Hh=&Ah6&`KbbyQFe|cL1 z@Nn^>{!l4=cjhGibE-PHXKelch2~q_+RyY;X}2Cl$Cq5N^47OpfQTZ1IWbh{MxcGI56A~o0@M?5j&4r6q4n)Gb_k@hGWHPY3>Uc_0}Srz zO|H#lo|lcSprCVYXC;oo?~UR12vFSY4?ymy&WKgEo6N=r_l14jQnP-T-HUJypZF|& z;2)*Mo>ZfD;~xoi$oMNG)9W{tYi}q{m-5c8S;k2rU3YAx(rXD*9spQoG_o zTd);B`$M>G+ux_3mYf_i>8Vjr9i*A#O1oGwt8+3bg!*p<8r!NZZ?t1<jp%k~GL{FlLkA)uB5HK0caaC-rKQpZ-<)}0FFScg4Q2~Qs@#QXur-muuU3fCUq=Mj@B#OT|`Z+x^AI&!vo0z*AcYlIlog8GbCDG;=lBQVb3 zv}`|OIApgLIkiHncN^~YUaIMkG9B`zDX`OGA60?A)Z58bT(&AlhTV!bXVJLUof>I8w-2@8(Dzqm1 zkkSdo;FuCte;+IOlV2sDS`BK0^0gpSi+}CW_gXRTi8{Qc7PU8NoZ4PRv1P$)z`>HP!*T7MDiZ_$lHXjBNBCD5W9` zL>su$IB+F^hm_?MM0}8RdN-mCPMIQjW@?@NnSkat2FIM=Z%vH~L3{f1n@-=s&xaro zG%pqDLXQG7$qXB(U4-M*RC2JuwsL>U2}n(3WimyYBkhi>(yt= zwNa&J;k-|IG;Kcv+U7wP4ukbF8><8)IFwz{<5wNM6`XG|O_~rhYA03GOu0J06EpEqGTw{Lyw*4)J2<%tZbOucg;& z1YQDc9v)#@Z)*)U&)oP!NWk|Xp$}P{OauX!2d#RkIWmUY5^p(w0n{~+))HvP1R@NupzD9Mb3Z;)sX{G-)|qf4VgZ2-vy`iAu`Huj2)85Z>5wwWb%gMJf)2dFWwVFGzXTYp zss(}!z3$>jGr3NbzK2V?eyta1?*v@;=>`od!WMzq5>@HpYTGSB33{ zrcZ}wwag7w!5?<=`Yz?P<<+^|c1~Ji#b41xzD1)7c7mt?X7-B9)RP_PU#@~HLkZkR zrz^k@pZJR(2z8J&cLHj32b&7Q@gcvV5%tvlz!j6uFEx@{H5 zwm$Xl3o2l(m@o!bM;}aC#HT zH>P}~(K@6yf)qYmlWi<=_@{Sn1w&?p$2C+=@aQNEoFH7m-8eA6iz0}vsmnT~6!S7a z1?%t6@bLRSAocTihnV=~48!0oTHbDRetL4C)Cqq=O`)NZAOkPfmcz-R6KXZ&ub~s? zw}W7AYbeo~Wvkt4u>TCMVao;3pDwS)>3wa|!nkA*g7 zTN@2kkugA~vS_qmo|+0A7>Ymo2~8kLAkbn>Hhlg7k`(&IY8~0Gs6Uhq-zaYgZN zdqHpr)gO8>K~!-dXE+Y{PE6phBq3s=(Xxq%L+f|N)T{VM2tjD_A}(8J*+IwYCFm9P z_nJ}zZq|^Aa;rF7g zdJa~VM58IvvsEw)RmAo7A3Fj$(C#&zHBc0k%nn-&p~=F7D&z zW3pOGB)?aqo28dG%?j!Z>T2M9)XS_^f+c2ElkN6>wO`(PWuU16x}%wWhEzW7^Z=hV zA(-^?hUq~6PLT~W!6kHEF5D{7Rdn;& z(Ew<2i$Q*Mec_HaFCp?afh1ul3xlT{kz2ZB(Nr&zujnCIKh92rnGf8ynQ4^q2e8 zY*c^qge*P5^Bx@hq*9ZG)$wU2us*J6{Sl2$H6<0QUGP7+x{TRh4o(eSx2Yiw0dppe zPJuSfzS8kdMuj%Z$EGH(;**SEM%(p`mYT}dSmSs6sD(>DNWx><<(<>TJ2WA|NL%Im z=#<5YkKBU!(Bg2()|P$vB_ms_Z9AXEpK=(Vx3ipq6=*lpTEsm6-T4JPC>N<$P(dcN zti;oA3-t?m0jS6e#Y&9b)gw3XXCHluozAOoWHe!cm&Rm=!2O-L1c+n3)KIPf7*zc_7K5i^9h$n_@e79GdBn=xo+FpJ@KYp9SM zAGc+3d`wd3#cTmy4�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 NbhQjMtJNJI|38Qrob>