mirror of
https://github.com/Mailu/Mailu.git
synced 2025-01-20 03:29:50 +02:00
f43c8c652e
2483: Introduce FETCHMAIL_ENABLED r=mergify[bot] a=DjVinnii ## What type of PR? Enhancement ## What does this PR do? Add `FETCHMAIL_ENABLED` to enable/disable the Fetchmail functionality in the Admin UI. ### Related issue(s) - closes #2127 ## Prerequisites Before we can consider review and merge, please make sure the following list is done and checked. If an entry in not applicable, you can check it or remove it from the list. - [x] In case of feature or enhancement: documentation updated accordingly - [x] Unless it's docs or a minor change: add [changelog](https://mailu.io/master/contributors/workflow.html#changelog) entry file. 2535: fix the linux/arm/v7 build r=mergify[bot] a=nextgens ## What type of PR? bug-fix ## What does this PR do? The arm builder is running aarch64 ... and there is no package for arm/v7 Co-authored-by: Vincent Kling <v.kling@vinniict.nl> Co-authored-by: Dimitri Huisman <diman@huisman.xyz> Co-authored-by: Florent Daigniere <nextgens@freenetproject.org>
108 lines
3.5 KiB
Python
Executable File
108 lines
3.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import time
|
|
import os
|
|
import tempfile
|
|
import shlex
|
|
import subprocess
|
|
import re
|
|
import requests
|
|
import sys
|
|
import traceback
|
|
|
|
|
|
FETCHMAIL = """
|
|
fetchmail -N \
|
|
--idfile /data/fetchids --uidl \
|
|
--sslcertck --sslcertpath /etc/ssl/certs \
|
|
-f {}
|
|
"""
|
|
|
|
|
|
RC_LINE = """
|
|
poll "{host}" proto {protocol} port {port}
|
|
user "{username}" password "{password}"
|
|
is "{user_email}"
|
|
smtphost "{smtphost}"
|
|
{options}
|
|
"""
|
|
|
|
|
|
def extract_host_port(host_and_port, default_port):
|
|
host, _, port = re.match('^(.*?)(:([0-9]*))?$', host_and_port).groups()
|
|
return host, int(port) if port else default_port
|
|
|
|
|
|
def escape_rc_string(arg):
|
|
return "".join("\\x%2x" % ord(char) for char in arg)
|
|
|
|
|
|
def fetchmail(fetchmailrc):
|
|
with tempfile.NamedTemporaryFile() as handler:
|
|
handler.write(fetchmailrc.encode("utf8"))
|
|
handler.flush()
|
|
command = FETCHMAIL.format(shlex.quote(handler.name))
|
|
output = subprocess.check_output(command, shell=True)
|
|
return output
|
|
|
|
|
|
def run(debug):
|
|
try:
|
|
fetches = requests.get("http://" + os.environ.get("HOST_ADMIN", "admin") + "/internal/fetch").json()
|
|
smtphost, smtpport = extract_host_port(os.environ.get("HOST_SMTP", "smtp"), None)
|
|
if smtpport is None:
|
|
smtphostport = smtphost
|
|
else:
|
|
smtphostport = "%s/%d" % (smtphost, smtpport)
|
|
for fetch in fetches:
|
|
fetchmailrc = ""
|
|
options = "options antispam 501, 504, 550, 553, 554"
|
|
options += " ssl" if fetch["tls"] else ""
|
|
options += " keep" if fetch["keep"] else " fetchall"
|
|
fetchmailrc += RC_LINE.format(
|
|
user_email=escape_rc_string(fetch["user_email"]),
|
|
protocol=fetch["protocol"],
|
|
host=escape_rc_string(fetch["host"]),
|
|
port=fetch["port"],
|
|
smtphost=smtphostport,
|
|
username=escape_rc_string(fetch["username"]),
|
|
password=escape_rc_string(fetch["password"]),
|
|
options=options
|
|
)
|
|
if debug:
|
|
print(fetchmailrc)
|
|
try:
|
|
print(fetchmail(fetchmailrc))
|
|
error_message = ""
|
|
except subprocess.CalledProcessError as error:
|
|
error_message = error.output.decode("utf8")
|
|
# No mail is not an error
|
|
if not error_message.startswith("fetchmail: No mail"):
|
|
print(error_message)
|
|
user_info = "for %s at %s" % (fetch["user_email"], fetch["host"])
|
|
# Number of messages seen is not a error as well
|
|
if ("messages" in error_message and
|
|
"(seen " in error_message and
|
|
user_info in error_message):
|
|
print(error_message)
|
|
finally:
|
|
requests.post("http://" + os.environ.get("HOST_ADMIN", "admin") + "/internal/fetch/{}".format(fetch["id"]),
|
|
json=error_message.split("\n")[0]
|
|
)
|
|
except Exception:
|
|
traceback.print_exc()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
while True:
|
|
delay = int(os.environ.get("FETCHMAIL_DELAY", 60))
|
|
print("Sleeping for {} seconds".format(delay))
|
|
time.sleep(delay)
|
|
|
|
if not os.environ.get("FETCHMAIL_ENABLED", 'True') in ('True', 'true'):
|
|
print("Fetchmail disabled, skipping...")
|
|
continue
|
|
|
|
run(os.environ.get("DEBUG", None) == "True")
|
|
sys.stdout.flush()
|