one of the last commit

This commit is contained in:
2025-09-05 19:24:09 +02:00
parent 0181b7d855
commit b4d2f3181d
3 changed files with 87 additions and 400 deletions

52
mail.py
View File

@@ -0,0 +1,52 @@
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def construct_html(bills: list[tuple[str, str]]) -> str:
rows = []
for bill_id, date in bills:
rows.append(
f"<li><b style='color:#2c3e50;'>Facture n°{bill_id}</b> — "
f"<span style='color:#16a085;'>émise le {date}</span></li>"
)
template = f"""<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Nouvelle(s) facture(s) reçue(s)</title>
</head>
<body style="font-family:Arial, sans-serif; background:#f9f9f9; color:#333;">
<div style="max-width:600px; margin:auto; padding:20px; background:#fff; border:1px solid #ddd; border-radius:8px;">
<h2 style="color:#e74c3c; text-align:center;">
Vous avez reçu <b>{len(bills)}</b> nouvelle(s) facture(s)
</h2>
<ul style="line-height:1.6; font-size:14px;">
{"".join(rows)}
</ul>
</div>
</body>
</html>"""
return template
def send_email(
subject,
content,
email_from,
email_password,
smtp_mail_address,
smpt_port,
email_to,
):
msg = MIMEMultipart()
msg["From"] = email_from
msg["To"] = email_to
msg["Subject"] = subject
msg.attach(MIMEText(content, "html"))
with smtplib.SMTP(smtp_mail_address, smpt_port) as server:
server.starttls()
server.login(email_from, email_password)
server.sendmail(email_from, email_to, msg.as_string())

33
main.py
View File

@@ -1,5 +1,6 @@
import os import os
from datetime import datetime import mail as ml
from datetime import date, datetime, time
import dotenv import dotenv
import ovh import ovh
import fetcher as ft import fetcher as ft
@@ -39,6 +40,11 @@ APP_SECRET = os.environ["APP_SECRET"]
CONSUMER_KEY = os.environ["CONSUMER_KEY"] CONSUMER_KEY = os.environ["CONSUMER_KEY"]
PATH_OVH = os.environ["OVH_PATH"] PATH_OVH = os.environ["OVH_PATH"]
DB_PATH = os.environ["DB_PATH"] DB_PATH = os.environ["DB_PATH"]
EMAIL = os.environ["EMAIL"]
EMAIL_PASSWORD = os.environ["EMAIL_PASSWORD"]
SMTP_MAIL_ADDRESS = os.environ["SMTP_MAIL_ADDRESS"]
SMTP_PORT = os.environ["SMTP_PORT"]
EMAIL_TO = os.environ["EMAIL_TO"]
YEAR = datetime.now().year # Année courante (int) YEAR = datetime.now().year # Année courante (int)
@@ -213,8 +219,29 @@ if __name__ == "__main__":
os.makedirs(f"{PATH_OVH}{YEAR}", exist_ok=True) os.makedirs(f"{PATH_OVH}{YEAR}", exist_ok=True)
ids_candidats = indexer(get_ids()) ids_candidats = indexer(get_ids())
bills_json = []
bills_str = []
for bill_id in ids_candidats: for bill_id in ids_candidats:
save_pdf(get_bill(bill_id)) bills_json.append((bill_id, get_bill(bill_id)))
# pdf enregistrement.
for bill_json in bills_json:
save_pdf(bill_json[1])
date = datetime.fromisoformat(bill_json[1]["date"]).date()
bills_str.append(
(
bill_json[0],
f"{date}",
)
)
content = ml.construct_html(bills_str)
ml.send_email(
"Reçu de facture(s)",
content,
email_from=EMAIL,
email_password=EMAIL_PASSWORD,
smpt_port=SMTP_PORT,
smtp_mail_address=SMTP_MAIL_ADDRESS,
email_to=EMAIL_TO,
)
logger.info("Traitement terminé : %d factures téléchargées", len(ids_candidats)) logger.info("Traitement terminé : %d factures téléchargées", len(ids_candidats))

View File

@@ -1,403 +1,11 @@
about-time==4.2.1 certifi==2025.8.3
aiodns==3.3.0 charset-normalizer==3.4.3
aiohappyeyeballs==2.4.4 dkimpy==1.1.8
aiohttp==3.10.11
aiosignal==1.4.0
alive-progress==3.3.0
altgraph==0.17.4
amulet-core==1.9.29
amulet-leveldb==1.0.2
amulet-map-editor==0.10.42
amulet-nbt==2.1.5
annotated-types==0.7.0
anvil-parser==0.9.0
anyio==4.9.0
appdirs==1.4.4
argcomplete==3.6.2
argon2-cffi==25.1.0
argon2-cffi-bindings==21.2.0
arrow==1.3.0
asttokens==3.0.0
async-lru==2.0.5
asyncio-dgram==2.2.0
attrs==25.1.0
autocommand==2.2.2
Automat==24.8.1
autoslot==2022.12.1
babel==2.17.0
backoff==2.2.1
bcc==0.33.0
bcrypt==4.2.1
Beaker==1.12.1
beautifulsoup4==4.13.5
beautifultable==1.1.0
bidict==0.23.1
black==25.1.0
bleach==6.2.0
blinker==1.9.0
blivet==3.12.1
blivet-gui==2.6.0
boilerpy3==1.0.7
Brlapi==0.8.6
Brotli==1.1.0
cattrs==25.1.1
certifi==2022.12.7
cffi==1.17.1
chardet==5.2.0
charset-normalizer==2.0.12
cheroot==10.0.1
CherryPy==18.10.0
chess==1.11.2
click==8.1.8
cloudscraper==1.2.71
colorama==0.4.6
colorlog==6.9.0
comm==0.2.2
constantly==23.10.4
construct==2.5.3
contourpy==1.3.1
crypt_r==3.13.1
cryptography==44.0.0
cson==0.8
cssselect==1.2.0
cupshelpers==1.0
cycler==0.12.1
dasbus==1.7
dbus-fast==2.44.1
dbus-python==1.3.2
dbus_next==0.2.3
debugpy==1.8.14
decorator==5.2.1
defusedxml==0.7.1
deluge==2.2.0
distro==1.9.0
dnf==4.23.0
dnspython==2.7.0 dnspython==2.7.0
docopt==0.6.2
docstring_parser==0.17.0
email_validator==2.2.0
et_xmlfile==2.0.0
evdev==1.9.1
Events==0.5
executing==2.2.0
fastjsonschema==2.21.1
fedora-third-party==0.10
file-magic==0.4.0
filelock==3.18.0
filetype==1.2.0
Flask==3.1.0
Flask-Bcrypt==1.0.1
Flask-Login==0.6.3
Flask-SocketIO==5.5.1
Flask-SQLAlchemy==3.1.1
Flask-WTF==1.2.2
fonttools==4.55.8
fqdn==1.5.1
fros==1.1
frozendict==2.4.6
frozenlist==1.5.0
fsspec==2025.7.0
future==1.0.0
geographiclib==2.1
GeoIP==1.3.2
geopy==2.4.1
ghunt==2.3.3
git-filter-repo==2.47.0
graphemeu==0.7.2
greenlet==3.1.1
gunicorn==23.0.0
h11==0.16.0
h2==4.3.0
haystack-ai==2.16.1
haystack-experimental==0.12.0
hf-xet==1.1.5
hpack==4.1.0
httpcore==1.0.9
httpx==0.27.2
huggingface-hub==0.34.3
humanize==4.12.0
hyperframe==6.1.0
hyperlink==21.0.0
icmplib==3.0.4
idna==3.10 idna==3.10
ImageHash==4.3.2
impacket==0.10.0
importlib_metadata==8.6.1
incremental==24.7.2
inflect==7.5.0
inflection==0.5.1
inkex==1.4.0
instaloader==4.14.2
ipykernel==6.29.5
ipython==9.3.0
ipython_pygments_lexers==1.1.1
iso639==0.1.4
isoduration==20.11.0
itsdangerous==2.2.0
jaraco.classes==3.4.0
jaraco.collections==5.2.1
jaraco.context==6.0.1
jaraco.functools==4.1.0
jaraco.text==4.0.0
jedi==0.19.2
jeepney==0.8.0
Jinja2==3.1.6
jiter==0.10.0
joblib==1.5.1
json5==0.12.0
jsonpickle==3.4.2
jsonpointer==3.0.0
jsonschema==4.23.0
jsonschema-specifications==2024.10.1
jupyter-events==0.12.0
jupyter-lsp==2.2.5
jupyter_client==8.6.3
jupyter_core==5.8.1
jupyter_server==2.16.0
jupyter_server_terminals==0.5.3
jupyterlab==4.4.3
jupyterlab_pygments==0.3.0
jupyterlab_server==2.27.3
keyring==25.6.0
kiwisolver==1.4.8
langtable==0.0.69
lazy-imports==0.3.1
ldap3==2.9.1
ldapdomaindump==0.10.0
libcomps==0.1.22
libdnf==0.74.0
libtorrent==2.0.11
libvirt-python==11.0.0
logging==0.4.9.6
louis==3.33.0
lutris==0.5.19
lxml==5.3.2
lz4==4.4.4
Mako==1.2.3
markdown-it-py==4.0.0
MarkupSafe==3.0.2
matplotlib==3.10.0
matplotlib-inline==0.1.7
maxminddb==2.8.2
mcstatus==11.1.1
mdurl==0.1.2
meson==1.7.2
minecraft-resource-pack==1.4.6
minecraft_ping==0.0.4
mistune==3.1.3
moddb==0.12.0
mopidy==4.0.0a4
Mopidy-Iris==3.69.3
more-itertools==10.5.0
mpmath==1.3.0
msgpack==1.1.0
multidict==6.1.0
mutagen==1.47.0
mutf8==1.0.6
mypy_extensions==1.1.0
nbclient==0.10.2
nbconvert==7.16.6
nbformat==5.10.4
NBT==1.5.1
nest-asyncio==1.6.0
netaddr==1.3.0
networkx==3.4.2
nftables==0.1
notebook==7.4.3
notebook_shim==0.2.4
num2words==0.5.14
numpy==1.26.4
oauthlib==3.3.1 oauthlib==3.3.1
olefile==0.47
openai==1.98.0
openpyxl==3.1.5
outcome==1.3.0.post0
overrides==7.7.0
ovh==1.2.0 ovh==1.2.0
packaging==24.2 python-dotenv==1.1.1
pandas==2.3.1
pandocfilters==1.5.1
parso==0.8.4
Paste==3.10.1
pathspec==0.12.1
pefile==2024.8.26
perf==0.1
pexpect==4.9.0
phonenumbers==9.0.13
pid==2.2.3
pillow==10.4.0
pipx==1.7.1
platformdirs==3.11.0
ply==3.11
portalocker==2.10.1
portend==3.2.1
posthog==6.3.1
productmd==1.45
prometheus_client==0.22.1
prompt_toolkit==3.0.51
prompthub-py==4.0.0
protobuf==5.29.5
proton-core==0.6.0
proton-keyring-linux==0.2.0
proton-vpn-api-core==0.45.6
proton-vpn-daemon==0.12.0
proton-vpn-gtk-app==4.10.0b0
proton-vpn-lib==0.1.1
proton-vpn-network-manager==0.12.15
protonvpn_cli==2.2.12
psutil==7.0.0
ptyprocess==0.7.0
publicsuffixlist==1.0.2.20250830
pure_eval==0.2.3
pwquality==1.4.5
pyasn1==0.4.8
pyasn1_modules==0.4.1
PyAudio==0.2.13
pycairo==1.25.1
pycares==4.10.0
pycparser==2.20
pycrypto==2.6.1
pycryptodomex==3.23.0
pycups==2.0.4
pydantic==1.10.22
pydantic_core==2.33.2
pyenchant==3.2.2
pygame==2.6.1
Pygments==2.19.0
PyGObject==3.50.0
pyinotify==0.9.6
pyinstaller==6.11.1
pyinstaller-hooks-contrib==2025.1
pykickstart==3.62
pykka==4.2.0
PyMCTranslate==1.2.33
pymunk==6.11.1
PyMuPDF==1.26.4
PyNaCl==1.5.0
pynvim==0.5.2
PyOpenGL==3.1.9
pyOpenSSL==25.0.0
pyparsing==3.2.1
pyparted==3.13.0
pypresence==4.3.0
PyQt5==5.15.11
PyQt5_sip==12.16.1
PyRoxy @ git+https://github.com/MatrixTM/PyRoxy.git@ea0f88dbc0573292ba5672124f69e4e7a31b544d
pyserial==3.5
PySocks==1.7.1
python-augeas==1.2.0
python-dateutil==2.9.0.post0
python-dotenv==1.0.1
python-engineio==4.11.2
python-gnupg==0.5.4
python-json-logger==3.3.0
python-linux-procfs==0.7.3
python-meh==0.52
python-pam==2.0.2
python-pptx==1.0.2
python-ptrace==0.9.9
python-socketio==5.12.1
pythondialog==3.5.3
pytz==2025.2
pyudev==0.24.3
PyWavelets==1.9.0
pyxdg==0.27
PyYAML==6.0.2
pyynl @ file:///builddir/build/BUILD/kernel-6.16.3-build/kernel-6.16.3/linux-6.16.3-200.fc42.x86_64/tools/net/ynl
pyzmq==27.0.0
quantulum3==0.9.2
rank-bm25==0.2.2
RapidFuzz==3.11.0
referencing==0.36.2
regex==2024.11.6
rencode==1.0.6
reportlab==4.4.3
requests==2.32.5 requests==2.32.5
requests-cache==0.9.8
requests-file==2.0.0
requests-ftp==0.3.1
requests-futures==1.0.2
requests-oauthlib==2.0.0 requests-oauthlib==2.0.0
requests-toolbelt==1.0.0 urllib3==2.5.0
rfc3339-validator==0.1.4
rfc3986-validator==0.1.1
rich==13.9.4
rich-argparse==1.7.1
rpds-py==0.25.0
rpm==4.20.1
safetensors==0.5.3
scikit-learn==1.7.1
scipy==1.16.0
scour==0.38.2
SecretStorage==3.3.3
secure==1.0.1
selenium==4.34.0
selinux @ file:///builddir/build/BUILD/libselinux-3.8-build/libselinux-3.8/src
Send2Trash==1.8.3
sentry-sdk==2.21.0
sepolicy @ file:///builddir/build/BUILD/policycoreutils-3.8-build/selinux-3.8/python/sepolicy
service-identity==24.2.0
setools==4.5.1
setuptools==80.9.0
sherlock==0.4.1
sherlock-project==0.15.0
shtab==1.7.1
simple-websocket==1.1.0
simpleaudio==1.0.4
simpleline==1.9.0
six==1.17.0
Slowloris==0.2.6
sniffio==1.3.1
sortedcontainers==2.4.0
sos==4.10.0
soupsieve==2.7
speg==0.3
SQLAlchemy==2.0.38
sseclient-py==1.8.0
stack-data==0.6.3
stem==1.8.2
sympy==1.13.3
systemd-python==235
tempora==5.8.1
tenacity==9.1.2
terminado==0.18.1
threadpoolctl==3.6.0
tiktoken==0.9.0
tinycss2==1.4.0
tokenizers==0.21.4
torch==2.7.1+cpu
torchaudio==2.7.1+cpu
torchvision==0.22.1+cpu
tornado==6.4.1
tqdm==4.67.1
traitlets==5.14.3
transformers==4.54.1
trio==0.30.0
trio-websocket==0.12.2
Twisted==24.11.0
typeguard==4.4.4
types-python-dateutil==2.9.0.20250516
typing-inspection==0.4.1
typing_extensions==4.14.1
tzdata==2025.2
uri-template==1.3.0
url-normalize==2.2.1
urllib3==1.26.20
userpath==1.9.2
wcwidth==0.2.13
webcolors==24.11.1
webencodings==0.5.1
websocket-client==1.8.0
websockets==14.2
Werkzeug==3.1.3
wheel==0.45.1
wsproto==1.2.0
WTForms==3.2.1
wxPython==4.2.3
xkbregistry==0.3
XlsxWriter==3.2.3
yarl==1.13.1
yt-dlp==2025.8.27
zc.lockfile==3.0.post1
zipp==3.21.0
zope.interface==7.2