Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[enhancement]: Spam filter OCR and QR-code reading #1034

Open
1 task done
TaaviE opened this issue Dec 30, 2024 · 5 comments
Open
1 task done

[enhancement]: Spam filter OCR and QR-code reading #1034

TaaviE opened this issue Dec 30, 2024 · 5 comments
Labels
enhancement New feature or request

Comments

@TaaviE
Copy link

TaaviE commented Dec 30, 2024

Which feature or improvement would you like to request?

I'd love to see really simple/barebones OCR and QR link/text extraction built into Stalwart. This would make it somewhat harder to bypass the spam filter by just using images.

Is your feature request related to a problem?

Recent phishing waves have started using images to bypass the spam filter. While some other approaches might be able to mark letters like that suspicious, being able to actually see the content linked would be a great improvement.

Code of Conduct

  • I agree to follow this project's Code of Conduct
@TaaviE TaaviE added the enhancement New feature or request label Dec 30, 2024
@mdecimus
Copy link
Member

mdecimus commented Jan 3, 2025

Although implementing these enhancements shouldn't be too much work, my only concern is the latency these checks will add to message intake. But I'll check if there is a lightweight Rust library for OCR.

Regarding the QR spam, can you attach a few examples to this issue? I haven't seen this in the real world. Also, what is usually encoded in the QR, is it a link or something else?

@TaaviE
Copy link
Author

TaaviE commented Jan 3, 2025

Although implementing these enhancements shouldn't be too much work, my only concern is the latency these checks will add to message intake. But I'll check if there is a lightweight Rust library for OCR.

That's a fair point, though the trade-off is likely okay for some (especially smaller operators).

I suspect it might be a bit complex to implement some kind of lookup table and sampling system for more compute-intensive scans?

Regarding the QR spam, can you attach a few examples to this issue? I haven't seen this in the real world. Also, what is usually encoded in the QR, is it a link or something else?

Here's a recent example (fake tax return notice):
Scam letter example

@mdecimus
Copy link
Member

mdecimus commented Jan 6, 2025

Could you post here the raw email source or send it to [email protected]? You can remove any sensitive headers, only the body and Content-Type headers are needed. Thanks!

@TaaviE
Copy link
Author

TaaviE commented Jan 7, 2025

@mdecimus here's the source with a few recipient-identifying bits removed.

Return-Path: <msprvs1=20093q9WqCE1K=[email protected]>
Message-ID: <7B.BF.06102.C85C1776@i-0591e7b8f3bf01038.mta1vrest.sd.prd.sparkpost>
Date: Sun, 29 Dec 2024 21:56:26 +0000
Content-Type: multipart/alternative; boundary="_----U40z8OlcyTcCt/h/Fj5rWg===_7F/7F-06102-A85C1776"
MIME-Version: 1.0
Reply-To: [email protected]
From: "Maksu- ja Tolliame e-MTAsse" <[email protected]>
Subject: Maksu- ja Tolliame Klienditugi
X-EventbriteMailer: missive_service
x-campaignid: consumer-lifecycle:campaign:invite
X-Eventbrite: missive_service:2555540807611:44249943
X-VirtualServerGroup: mail17
List-Unsubscribe: <mailto:[email protected]?subject=unsubscribe:xhsBXwN-OZukRbI~|eyAicQiIH0~>,<https://unsubscribe.spmta.com/u/j5lkW_Zw~~/AAQxAQA~/RgRpVEqKAAQ~>
List-Unsubscribe-Post: List-Unsubscribe=One-Click
List-Id: <spc.274689.4.sparkpostmail.com>


--_----U40z8OlcyTcCt/h/Fj5rWg===_7F/7F-06102-A85C1776
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="UTF-8"

Maksu- ja Tolliame Klienditugi







Unsubscribe: https://www.eventbrite.com/organizations/missive/activity/unsubscribe/?p=---cwXjSnfXAUmfkl3Fvn8g&c=44249943&co=3817677163
--_----U40z8OlcyTcCt/h/Fj5rWg===_7F/7F-06102-A85C1776
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset="UTF-8"

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.=
w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns=3D"http://www.w3.=
org/1999/xhtml" xmlns:v=3D"urn:schemas-microsoft-com:vml" xmlns:o=3D"urn:sc=
hemas-microsoft-com:office:office"><head><title></title> <!--[if !mso]><!--=
 --><meta http-equiv=3D"X-UA-Compatible" content=3D"IE=3Dedge"> <!--<![endi=
f]--><meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3DUTF-=
8"><meta name=3D"viewport" content=3D"width=3Ddevice-width, initial-scale=
=3D1"><style type=3D"text/css">/*<![CDATA[*/#outlook a{padding:0}.ReadMsgBo=
dy{width:100%}.ExternalClass{width:100%}.ExternalClass, .ExternalClass p, .=
ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass =
div{line-height:100%}body,table,td,p,a,li,blockquote{-webkit-text-size-adju=
st:100%;-ms-text-size-adjust:100%}table,td{mso-table-lspace:0pt;mso-table-r=
space:0pt}img{-ms-interpolation-mode:bicubic}body{margin:0;padding:0}img{bo=
rder:0;height:auto;line-height:100%;outline:none;text-decoration:none}table=
,td{border-collapse:collapse !important}body,#bodyTable,#bodyCell{height:10=
0% !important;margin:0;padding:0;width:100% !important}p{display:block}body=
,#bodyTable,#bodyCell{font-family:'Neue Plak',-apple-system,BlinkMacSystemF=
ont,Roboto,'Helvetica Neue',Helvetica,Tahoma,Arial,sans-serif}#templateCont=
ainer{width:90%}#bodyCell{padding:56px 0}#templateContainer{border-radius:2=
px;background-color:#FFFFFF}#templateBody{background-color:#FFFFFF;border-r=
adius:2px}#templateBodyContent{padding:0}#bodyContent{padding:0}.bodyConten=
t{color:#444444;font-size:15px;line-height:1.4}.bodyContent a:link, .bodyCo=
ntent a:visited, .bodyContent a .yshortcuts{color:#3659e3;font-weight:norma=
l;text-decoration:none}.bodyContent img{display:inline;max-width:560px}.img=
-hide-download-icon img+div{display:none}#body-message a, #body-message a:v=
isited, #body-message a:enabled{color:#3659e3!important}#body-message ol, #=
body-message ul{list-style-position:inside}#organizer_address a, #organizer=
_address a:visited, #organizer_address a:enabled{text-decoration:none !impo=
rtant;color:#444444!important}h1{font-size:35px;letter-spacing:0.36px;line-=
height:47px;text-align:center}.events--default-row{display:flex}@media only=
 screen and (max-width: 600px){body,table,td,p,a,li,blockquote{-webkit-text=
-size-adjust:none !important}body{width:100% !important;min-width:100% !imp=
ortant}#bodyCell{padding:0 !important}#templateBodyContent{padding:0 !impor=
tant}#templateContainer{max-width:600px !important;width:100% !important}h1=
{font-size:24px !important;line-height:100% !important}h2{font-size:20px !i=
mportant;line-height:100% !important}h3{font-size:18px !important;line-heig=
ht:100% !important}h4{font-size:16px !important;line-height:100% !important=
}.bodyContent{font-size:18px !important;line-height:125% !important}.event-=
-default-wrapper{width:560px}.events--default-column{display:flex;width:100=
%}.events--default-row{display:block}.featured-events-mobile{text-align:lef=
t !important;margin:0 !important}.rsvp-button-featured{display:table-cell;t=
ext-align:end;float:right}.event-name-featured{display:table-cell;padding-r=
ight:0.5em}}@media only screen and (min-width: 792px){.events--default-colu=
mn{display:flex;width:100%;max-width:260px}}@media only screen and (min-wid=
th: 601px){.body{padding:20px 0}#bodyContent{background-color:#FFF;}.event-=
-default-wrapper{max-width:50%}.events--default-column{width:100%}.events--=
default-column.event--left{margin-right:20px}.events--default-column.event-=
-right{margin-left:20px}.featured-events-mobile{text-align:left !important;=
margin:0 !important}.rsvp-button-featured{display:table-cell;float:right}.e=
vent-name-featured{display:table-cell;padding-right:0.5em}}@media only scre=
en and (min-width:481px){.mj-column-per-100{width:100% !important}.mj-colum=
n-per-33{width:33% !important}.mj-column-per-62{width:62% !important}.mj-co=
lumn-per-30{width:30% !important}.mj-column-px-30{width:30px !important}.mj=
-column-per-43{width:43% !important}.mj-column-per-57{width:57% !important;=
margin-top:0 !important}.featured-events-mobile{text-align:left !important;=
margin:0 !important}.name-button-featured{width:100%;display:inline-table}.=
event-name-featured{float:left;width:70%;padding-right:0.5em}}@media all an=
d (min-width:0px) and (max-width:480px){.mj-image-px-164{width:auto !import=
ant;height:auto !important}.featured-events-mobile{text-align:center !impor=
tant;margin:0 auto !important}.featured-events-image{padding:0 !important;w=
idth:100% !important}.name-button-featured{display:inline-block;text-align:=
start}.rsvp-button-featured{margin-bottom:12px;margin-top:12px;display:bloc=
k;float:left}}/*]]>*/</style> <!--[if mso]><style type=3D"text/css">@media =
only screen and (max-width:480px){@-ms-viewport{width:320px}@viewport{width=
:320px}}</style><![endif]--> <!--[if gte mso 9]><xml> <o:OfficeDocumentSett=
ings> <o:AllowPNG/> <o:PixelsPerInch>96</o:PixelsPerInch> </o:OfficeDocumen=
tSettings> </xml><![endif]--><!--[if lte mso 11]><style type=3D"text/css">.=
outlook-group-fix{width:100% !important}</style><![endif]--></head><body le=
ftmargin=3D"0" marginwidth=3D"0" topmargin=3D"0" marginheight=3D"0" offset=
=3D"0" style=3D"background-color: #FFFFFF;">=0D=0A<div style=3D"color:trans=
parent;visibility:hidden;opacity:0;font-size:0px;border:0;max-height:1px;wi=
dth:1px;margin:0px;padding:0px;border-width:0px!important;display:none!impo=
rtant;line-height:0px!important;"><img border=3D"0" width=3D"1" height=3D"1=
" src=3D"https://clicks.eventbrite.com/q/Kjth5nyhSHjZOdSXi8l4vg~~/AAQxAQA~/=
RgRpVEqKPVcDc3BjQgpnZYzFcWe10Xu3Ug9hcmRpQGp5cmdlbnMuZXVYBAAAAAQ~" alt=3D""/=
></div>=0D=0A<div style=3D"display: none; max-height: 0px; overflow: hidden=
;"> Maksu- ja Tolliame Klienditugi</div><div style=3D"display: none; max-he=
ight: 0px; overflow: hidden;"> &nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&z=
wnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj=
;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;</div><center><table align=3D"ce=
nter" border=3D"0" cellpadding=3D"0" cellspacing=3D"0" height=3D"100%" widt=
h=3D"100%" id=3D"bodyTable" style=3D"font-family:'Neue Plak',-apple-system,=
BlinkMacSystemFont,Roboto,'Helvetica Neue',Helvetica,Tahoma,Arial,sans-seri=
f;"><tr><td align=3D"center" valign=3D"top" id=3D"bodyCell" style=3D"width:=
560px;"><table border=3D"0" cellpadding=3D"0" cellspacing=3D"0" id=3D"templ=
ateContainer" width=3D"100%" style=3D"background-color:#FFFFFF;max-width:80=
0px;"> <tr><td align=3D"center" valign=3D"top" style=3D"width:560px;"><tabl=
e class=3D"img-hide-download-icon" border=3D"0" role=3D"presentation" style=
=3D"width:100%;" cellpadding=3D"0" cellspacing=3D"0" align=3D"center" width=
=3D"100%" id=3D"templateHeader"><tr><td align=3D"center" bgcolor=3D"#FFFFFF=
" style=3D"width:560px;">  <img src=3D"https://img.evbuc.com/https%3A%2F%2F=
cdn.evbuc.com%2Fimages%2F923962953%2F2555540737121%2F1%2Foriginal.20241227-=
223410=3Fw=3D1200&amp;auto=3Dformat%2Ccompress&amp;q=3D75&amp;sharp=3D10&am=
p;s=3D4acfcb45e59a5e590ac1f48e2cbab474" width=3D"100%" style=3D"vertical-al=
ign: top;border-radius: 2px 2px 0 0;width: 100%;object-fit: cover;"/> </td>=
</tr></table></td></tr> <tr><td align=3D"center" valign=3D"top" style=3D"wi=
dth:560px;"><table id=3D"templateBody" border=3D"0" cellpadding=3D"0" cells=
pacing=3D"0" width=3D"100%" max-width=3D"560px" style=3D"margin:0 auto; max=
-width:560px;"><tr><td valign=3D"top" class=3D"bodyContent" id=3D"bodyConte=
nt" style=3D"max-width:560px;" width=3D"100%" max-width=3D"560px" margin-le=
ft=3D"auto"><div class=3D"body" style=3D"background-color:#FFFFFF;" id=3D"t=
emplateBodyContent"><!-- [if mso | IE]><table align=3D"center" border=3D"0"=
 cellpadding=3D"0" cellspacing=3D"0" style=3D"max-width:560px;;margin:0 aut=
o;" width=3D"100%" max-width=3D"560px"><tr><td style=3D"line-height:0px;fon=
t-size:0px;mso-line-height-rule:exactly;max-width:560px;" width=3D"100%" ma=
x-width=3D"560px"><![endif]--><div style=3D"background:#FFFFFF;background-c=
olor:#FFFFFF;display:block; margin:0px auto; max-width:600px;"><table align=
=3D"center" border=3D"0" cellpadding=3D"0" cellspacing=3D"0" role=3D"presen=
tation" style=3D"background:#FFFFFF;background-color:#FFFFFF; margin:0 auto=
;" max-width=3D"560px" margin-left=3D"auto"><tbody><tr><td style=3D"directi=
on:ltr;font-size:14px;padding:36px 18px;text-align:center;vertical-align:to=
p;max-width:560px;" align=3D"center" width=3D"100%" max-width=3D"560px" mar=
gin-left=3D"auto"> <!-- [if mso | IE]><table role=3D"presentation" border=
=3D"0" cellpadding=3D"0" cellspacing=3D"0" width=3D"100%" style=3D"margin:0=
 auto"> <![endif]--> <!-- [if mso | IE]><tr><td class=3D"body-message-outlo=
ok" width=3D"600px"><table align=3D"center" border=3D"0" cellpadding=3D"0" =
cellspacing=3D"0" class=3D"body-message-outlook" style=3D"width:600px;margi=
n:0 auto;" width=3D"600px"><tr><td style=3D"line-height:0px;font-size:0px;m=
so-line-height-rule:exactly;"><![endif]--><div class=3D"body-message" style=
=3D"margin:0px auto;max-width:600px;"><table align=3D"center" border=3D"0" =
cellpadding=3D"0" cellspacing=3D"0" role=3D"presentation" style=3D"margin: =
0 auto; width: 100%;" width=3D"100%"><tbody style=3D"margin: 0;"><tr style=
=3D"margin: 0;"><td style=3D"margin: 0; direction: ltr; font-size: 0px; pad=
ding: 0; text-align: center; vertical-align: top;max-width:560px;" align=3D=
"center" valign=3D"top" max-width=3D"560px" margin-left=3D"auto"> <!-- [if =
mso | IE]><table role=3D"presentation" border=3D"0" cellpadding=3D"0" cells=
pacing=3D"0" style=3D"margin:0 auto"><tr><td style=3D"vertical-align:top;wi=
dth:560px;"><![endif]--><div class=3D"mj-column-per-100 outlook-group-fix" =
style=3D"margin: 0; font-size: 13px; direction: ltr; display: inline-block;=
 vertical-align: top; width: 100%;"><table border=3D"0" cellpadding=3D"0" c=
ellspacing=3D"0" role=3D"presentation" width=3D"100%" style=3D"margin: 0 au=
to;"><tbody style=3D"margin: 0;"><tr style=3D"margin: 0;"><td style=3D"marg=
in: 0; vertical-align: top; padding: 0;width:560px;" valign=3D"top"><table =
border=3D"0" cellpadding=3D"0" cellspacing=3D"0" role=3D"presentation" widt=
h=3D"100%" style=3D"margin: 0 auto;"><tr style=3D"margin: 0;"><td class=3D"=
body-message-text" style=3D"margin: 0; font-size: 0px; padding: 0x; word-br=
eak: break-word;width:560px;"><div id=3D"body-message" style=3D"margin: 0; =
font-size: 15px; line-height: 1.4; color: #444444;"><p><div style=3D"text-a=
lign:center"><h1>Maksu- ja Tolliame Klienditugi</h1></div></p></div></td></=
tr></table></td></tr></tbody></table></div> <!-- [if mso | IE]></td></tr></=
table><![endif]--></td></tr></tbody></table></div> <!-- [if mso | IE]></td>=
</tr></table></td></tr><![endif]--><div class=3D"component spacer" style=3D=
"Margin: 0px auto; max-width: 560px;"><table align=3D"center" border=3D"0" =
cellpadding=3D"0" cellspacing=3D"0" role=3D"presentation" style=3D"width:10=
0%; margin:0 auto;" width=3D"100%"><td align=3D"left" valign=3D"top" width=
=3D"100%" height=3D"40" style=3D"border-collapse:collapse; mso-table-lspace=
: 0pt; mso-table-rspace: 0pt; mso-line-height-rule: exactly; line-height: 4=
0px;"><!--[if gte mso 15]>&nbsp;<![endif]--></td></table></div> <!-- [if ms=
o | IE]><tr><td class=3D"component-outlook spacer-outlook" width=3D"560px">=
<table align=3D"center" border=3D"0" cellpadding=3D"0" cellspacing=3D"0" cl=
ass=3D"component-outlook spacer-outlook" style=3D"width:560px;margin: 0 aut=
o" width=3D"560px"><tr><td style=3D"line-height:0px;font-size:0px;mso-line-=
height-rule:exactly;width:560px;"><![endif]--><div class=3D"component space=
r" style=3D"Margin: 0px auto; max-width: 560px;"><table align=3D"center" bo=
rder=3D"0" cellpadding=3D"0" cellspacing=3D"0" role=3D"presentation" style=
=3D"width:100%;margin: 0 auto"><tbody><tr><td style=3D"direction:ltr;font-s=
ize:14px;padding:0;text-align:center;vertical-align:top;width:560px;"> <!--=
 [if mso | IE]><table role=3D"presentation" border=3D"0" cellpadding=3D"0" =
cellspacing=3D"0" width=3D"100%" style=3D"margin:0 auto"><tr><td style=3D"v=
ertical-align:top;width:560px;"><![endif]--><div class=3D"mj-column-per-100=
 outlook-group-fix" style=3D"font-size:13px;text-align:left;direction:ltr;d=
isplay:inline-block;vertical-align:top;width:100%;"><table border=3D"0" cel=
lpadding=3D"0" cellspacing=3D"0" role=3D"presentation" width=3D"100%" style=
=3D"margin:0 auto"><tbody><tr><td style=3D"vertical-align:top;padding:0;wid=
th:560px;"><table border=3D"0" cellpadding=3D"0" cellspacing=3D"0" role=3D"=
presentation" width=3D"100%" style=3D"margin:0 auto"><tr><td style=3D"font-=
size:0px;padding:0;word-break:break-word;width:560px;"> <!-- [if mso | IE]>=
<table role=3D"presentation" border=3D"0" cellpadding=3D"0" cellspacing=3D"=
0" width=3D"100%" style=3D"margin:0 auto"><tr><td height=3D"40" style=3D"ve=
rtical-align:top;height:40px;width:560px;"><![endif]--><div style=3D"height=
:40px;"> &nbsp;</div> <!-- [if mso | IE]></td></tr></table><![endif]--></td=
></tr></table></td></tr></tbody></table></div> <!-- [if mso | IE]></td></tr=
></table><![endif]--></td></tr></tbody></table></div> <!-- [if mso | IE]></=
td></tr></table></td></tr><![endif]--><!-- [if mso | IE]></table><![endif]-=
-></td></tr></tbody></table></div> <!-- [if mso | IE]></td></tr></table><![=
endif]--></div></td></tr></table><!-- - - - - - - - - -->=0A<!-- BEGIN FOOT=
ER // -->=0A<!-- - - - - - - - - -->=0A<!-- - - - - - - - - -->=0A=0A<div c=
lass=3D"footer" style=3D"margin: 0px auto; width: 100%;">=0A<table align=3D=
"center" border=3D"0" cellpadding=3D"0" cellspacing=3D"0" role=3D"presentat=
ion" style=3D"width:100%;">=0A    =0A    =0A=0A    <!-- COMPANY METADATA --=
>=0A    <tr>=0A        <td class=3D"row_section" style=3D"padding: 0;margin=
-left: auto;margin-right: auto;">=0A            <table style=3D"padding: 0;=
background-color: #F8F8FA;border:0;border-collapse:collapse;border-spacing:=
0;padding:0;width:100%;color:#222!important;" class=3D"footer-content botto=
m-section" cellspacing=3D"0" cellpadding=3D"0" width=3D"100%" bgcolor=3D"#F=
8F8FA">=0A            <tr class=3D"footer__info align-center">=0A          =
      <td class=3D"grid__col" style=3D"padding: 0;font-family:Benton Sans,-=
apple-system,BlinkMacSystemFont,Roboto,Helvetica Neue,Helvetica,Tahoma,Aria=
l,sans-serif;text-align: center;font-size: 12px;font-weight: 200;line-heigh=
t: 18px;padding: 12px 32px 8px;" align=3D"center">=0A                <!--[i=
f (mso)|(ie)]>=0A                <table align=3D"center" border=3D"0" cells=
pacing=3D"0" cellpadding=3D"0" width=3D"100%" style=3D"text-align:center; w=
idth:100%;">=0A                <![endif]-->=0A                =0A          =
      <!--[if (mso)|(ie)]>=0A                    <tr>=0A                   =
     <td style=3D"text-align:center; padding:16px 6px; border:0px;font-size=
: 12px;line-height: 18px;font-weight: 200;">=0A                <![endif]-->=
=0A                <div class=3D"footer-row__text" style=3D"font-family:Ben=
ton Sans,-apple-system,BlinkMacSystemFont,Roboto,Helvetica Neue,Helvetica,T=
ahoma,Arial,sans-serif;padding:0;padding-bottom: 8px; font-size: 11px">=0A =
                   <span>Maksu- ja Tolliame 2024</span>=0A                <=
/div>=0A                <!--[if (mso)|(ie)]>=0A                        </td=
>=0A                    </tr>=0A                <![endif]-->=0A            =
    =0A                =0A                <!--[if (mso)|(ie)]>=0A          =
          <tr>=0A                        <td style=3D"text-align:center; pa=
dding-bottom:6px; border: 0px;font-size: 12px;line-height: 18px;font-weight=
: 200;">=0A                <![endif]-->=0A                <div class=3D"foo=
ter-row__text" style=3D"font-family:Benton Sans,-apple-system,BlinkMacSyste=
mFont,Roboto,Helvetica Neue,Helvetica,Tahoma,Arial,sans-serif;padding:0;pad=
ding-bottom: 8px;">=0A                     Hans-Prei=C3=9Finger-Stra=C3=9Fe=
 8,, M=C3=BCnchen, M=C3=BCnchen 81379 DE=0A                </div>=0A       =
         <!--[if (mso)|(ie)]>=0A                        </td>=0A           =
         </tr>=0A                <![endif]-->=0A                =0A        =
        <!--[if (mso)|(ie)]>=0A                    <tr>=0A                 =
       <td style=3D"text-align:center; padding-bottom:6px; border:0px;font-=
size: 12px;line-height:18px;font-weight: 200;">=0A                <![endif]=
-->=0A                <div class=3D"footer-row__text" style=3D"font-family:=
Benton Sans,-apple-system,BlinkMacSystemFont,Roboto,Helvetica Neue,Helvetic=
a,Tahoma,Arial,sans-serif;font-size:11px;padding:0;padding-bottom: 18px;">=
=0A                    <span><a class=3D"footer-unsubscribe-link" href=3D"h=
ttps://www.eventbrite.com/organizations/missive/activity/unsubscribe/=3Fp=
" style=3D"color: #222222;text-decoration:none !important;" target=3D"_blan=
k" rel=3D"noreferrer noopener">Unsubscribe</a></span>=0A                   =
 &nbsp;|&nbsp;=0A                    <span><a class=3D"footer-privacy-link"=
 href=3D"https://www.eventbrite.com/privacypolicy=3Flocale=3Den_US" style=
=3D"color: #222222;text-decoration:none !important;" target=3D"_blank" rel=
=3D"noreferrer noopener">Privacy Policy</a></span>=0A                </div>=
=0A                <!--[if (mso)|(ie)]>=0A                        </td>=0A =
                   </tr>=0A                </table>=0A                <![en=
dif]-->=0A                </td>=0A            </tr>=0A        </table>=0A  =
      </td>=0A    </tr>=0A</table>=0A</div>=0A<!-- - - - - - - - - -->=0A<!=
-- - - - - - - - - -->=0A<!-- // END FOOTER -->=0A<!-- - - - - - - - - -->=
=0A<!-- - - - - - - - - -->=0A</td></tr><tr><td align=3D"center" valign=3D"=
top" style=3D"width:560px; padding:0px; margin:0px;"> <img src=3D"https://w=
ww.eventbrite.com/organizations/missive/activity/pixel.gif=3Fp=3DABIdvVuctA=
TljI3ftYEttALvJWmcW98W3rQWqSUkRQ9aUzFTRSAHzN2r-pq5SF2CQm7CSyjaMfED2nanUgQMt=
6SQycsInUTg6ZndMuSV5Fy31pMvUwmZOTqumlWZ2NCYlAHvP9sgBLUUa9I4Lq-CtBCniY_pc0Mx=
1HChQ96103FFGhLoP0-bMYk&c=3D44249943&co=3D3817677163" alt=3D"" width=3D"1" =
height=3D"1" border=3D"0" style=3D"border: 0;"></td></tr> </table> <script =
type=3D"text/plain">darkThemeSupport=3Dtrue backgroundImageSupport=3Dtrue h=
eaderImageLinkSupport=3Dtrue</script> </td></tr></table></center>=0D=0A<img=
 border=3D"0" width=3D"1" height=3D"1" alt=3D"" src=3D"https://clicks.event=
brite.com/q/r8vMXHLYAabzI5eIXK648w~~/AAQxAQA~/RgRpVEqKPlcDc3BjQgpnZYzFcWe10=
Xu3Ug9hcmRpQGp5cmdlbnMuZXVYBAAAAAQ~">=0D=0A</body></html>
--_----U40z8OlcyTcCt/h/Fj5rWg===_7F/7F-06102-A85C1776--

@mdecimus
Copy link
Member

mdecimus commented Jan 8, 2025

Thanks! I'll look into it. Also Stalwart will have to be able to fetch external images, it's extra latency but I agree that small setups will benefit from this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants