Add sum Items, clean UP
parent
5b236148c2
commit
ce1c9fb6b6
|
|
@ -0,0 +1,6 @@
|
||||||
|
SMTP_SERVER=mail.itdata-gera.de
|
||||||
|
SMTP_PORT=587
|
||||||
|
SMTP_USER=serfling@itdata-gera.de
|
||||||
|
SMTP_PASSWORD="xPElLoyD,94,#"
|
||||||
|
FROM_EMAIL=serfling@itdata-gera.de
|
||||||
|
TO_EMAIL=serfling@itdata-gera.de
|
||||||
|
|
@ -1,86 +0,0 @@
|
||||||
Here is imapsync 2.229 on host imapsync, a linux system with 0.1/1.9 free GiB of RAM, 98.08% used by processes.
|
|
||||||
with Perl 5.36.0 and Mail::IMAPClient 3.43
|
|
||||||
Transfer started at Donnerstag 29 August 2024-08-29 11:09:24 +0200 CEST
|
|
||||||
PID is 169155 my PPID is 169154
|
|
||||||
Log file is LOG_imapsync/2024_08_29_11_09_24_721_serfling@itdata-gera.de_archiv@archiv.trendsetzer.eu.txt ( to change it, use --logfile path ; or use --nolog to turn off logging )
|
|
||||||
Load is 0.55 0.44 0.58 2/511 on 1 cores
|
|
||||||
Current directory is /root/IMAP-Sync
|
|
||||||
Real user id is root (uid 0)
|
|
||||||
Effective user id is root (euid 0)
|
|
||||||
$RCSfile: imapsync,v $ $Revision: 2.229 $ $Date: 2022/09/14 18:08:24 $
|
|
||||||
Command line used, run by /usr/bin/perl:
|
|
||||||
/usr/bin/imapsync --host1 mail.itdata-gera.de --user1 serfling@itdata-gera.de --password1 MASKED --host2 imap-sync-front-1 --user2 archiv@archiv.trendsetzer.eu --port2 143 --password2 MASKED
|
|
||||||
Temp directory is /tmp ( to change it use --tmpdir dirpath )
|
|
||||||
kill -QUIT 169155 # special behavior: call to sub catch_exit
|
|
||||||
kill -TERM 169155 # special behavior: call to sub catch_exit
|
|
||||||
kill -INT 169155 # special behavior: call to sub catch_reconnect
|
|
||||||
kill -HUP 169155 # special behavior: call to sub catch_print
|
|
||||||
kill -USR1 169155 # special behavior: call to sub toggle_sleep
|
|
||||||
File /tmp/imapsync.pid does not exist
|
|
||||||
PID file is /tmp/imapsync.pid ( to change it, use --pidfile filepath ; to avoid it use --pidfile "" )
|
|
||||||
Writing my PID 169155 in /tmp/imapsync.pid
|
|
||||||
Writing also my logfile name in /tmp/imapsync.pid : LOG_imapsync/2024_08_29_11_09_24_721_serfling@itdata-gera.de_archiv@archiv.trendsetzer.eu.txt
|
|
||||||
Modules version list ( use --no-modulesversion to turn off printing this Perl modules list ):
|
|
||||||
Authen::NTLM 1.09
|
|
||||||
CGI 4.66
|
|
||||||
Compress::Zlib 2.213
|
|
||||||
Crypt::OpenSSL::RSA 0.33
|
|
||||||
Data::Uniqid 0.12
|
|
||||||
Digest::HMAC_MD5 1.04
|
|
||||||
Digest::HMAC_SHA1 1.04
|
|
||||||
Digest::MD5 2.58
|
|
||||||
Encode 3.21
|
|
||||||
Encode::IMAPUTF7 1.05
|
|
||||||
File::Copy::Recursive 0.45
|
|
||||||
File::Spec 3.84
|
|
||||||
Getopt::Long 2.52
|
|
||||||
HTML::Entities 3.81
|
|
||||||
IO::Socket 1.55
|
|
||||||
IO::Socket::INET 1.55
|
|
||||||
IO::Socket::INET6 2.73
|
|
||||||
IO::Socket::IP 0.41
|
|
||||||
IO::Socket::SSL 2.088
|
|
||||||
IO::Tee 0.65
|
|
||||||
JSON 4.10
|
|
||||||
JSON::WebToken 0.10
|
|
||||||
LWP 6.77
|
|
||||||
MIME::Base64 3.16
|
|
||||||
Mail::IMAPClient 3.43
|
|
||||||
Net::Ping 2.74
|
|
||||||
Net::SSLeay 1.92
|
|
||||||
Term::ReadKey 2.38
|
|
||||||
Test::MockObject 1.20200122
|
|
||||||
Time::HiRes 1.977
|
|
||||||
URI::Escape 5.17
|
|
||||||
Unicode::String 2.10
|
|
||||||
|
|
||||||
Info: will resync flags for already transferred messages. Use --noresyncflags to not resync flags.
|
|
||||||
Host1: probing ssl on port 993 ( use --nosslcheck to avoid this ssl probe )
|
|
||||||
Host1: sslcheck detected open ssl port 993 so turning ssl on (use --nossl1 --notls1 to turn off SSL and TLS wizardry)
|
|
||||||
SSL debug mode level is --debugssl 1 (can be set from 0 meaning no debug to 4 meaning max debug)
|
|
||||||
Host1: SSL default mode is like --sslargs1 "SSL_verify_mode=0", meaning for host1 SSL_VERIFY_NONE, ie, do not check the server certificate.
|
|
||||||
Host1: Use --sslargs1 SSL_verify_mode=1 to have SSL_VERIFY_PEER, ie, check the server certificate. of host1
|
|
||||||
Info: turned ON syncinternaldates, will set the internal dates (arrival dates) on host2 same as host1.
|
|
||||||
Host1: will try to use LOGIN authentication on host1
|
|
||||||
Host2: will try to use LOGIN authentication on host2
|
|
||||||
Host1: imap connection timeout is 120 seconds
|
|
||||||
Host2: imap connection timeout is 120 seconds
|
|
||||||
Host1: imap connection keepalive is on on host1. Use --nokeepalive1 to disable it.
|
|
||||||
Host2: imap connection keepalive is on on host2. Use --nokeepalive2 to disable it.
|
|
||||||
Host1: IMAP server [mail.itdata-gera.de] port [993] user [serfling@itdata-gera.de]
|
|
||||||
Host2: IMAP server [imap-sync-front-1] port [143] user [archiv@archiv.trendsetzer.eu]
|
|
||||||
Host1: connecting and login on host1 [mail.itdata-gera.de] port [993] with user [serfling@itdata-gera.de]
|
|
||||||
Host1 IP address: 49.13.56.197 Local IP address: 180.1.1.164
|
|
||||||
Host1 banner: * OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
|
|
||||||
Host1 capability before authentication: IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ AUTH=PLAIN AUTH=LOGIN AUTH
|
|
||||||
Host1: mail.itdata-gera.de says it has CAPABILITY for AUTHENTICATE LOGIN
|
|
||||||
Host1: success login on [mail.itdata-gera.de] with user [serfling@itdata-gera.de] auth [LOGIN] or [LOGIN]
|
|
||||||
Host2: connecting and login on host2 [imap-sync-front-1] port [143] with user [archiv@archiv.trendsetzer.eu]
|
|
||||||
Host2 failure: can not open imap connection on host2 [imap-sync-front-1] with user [archiv@archiv.trendsetzer.eu]: Unable to connect to imap-sync-front-1: Invalid argument
|
|
||||||
++++ Listing 1 errors encountered during the sync ( avoid this listing with --noerrorsdump ).
|
|
||||||
Err 1/1: Host2 failure: can not open imap connection on host2 [imap-sync-front-1] with user [archiv@archiv.trendsetzer.eu]: Unable to connect to imap-sync-front-1: Invalid argument
|
|
||||||
The most frequent error is ERR_CONNECTION_FAILURE_HOST2. Check that host1 imap-sync-front-1 on port 143 is the right IMAP server to be contacted for your mailbox.
|
|
||||||
Exiting with return value 102 (EXIT_CONNECTION_FAILURE_HOST2) 1/50 nb_errors/max_errors PID 169155
|
|
||||||
Removing pidfile /tmp/imapsync.pid
|
|
||||||
Disconnecting from host1 mail.itdata-gera.de user1 serfling@itdata-gera.de
|
|
||||||
Log file is LOG_imapsync/2024_08_29_11_09_24_721_serfling@itdata-gera.de_archiv@archiv.trendsetzer.eu.txt ( to change it, use --logfile filepath ; or use --nolog to turn off logging )
|
|
||||||
Binary file not shown.
|
|
@ -1,160 +1,36 @@
|
||||||
services:
|
services:
|
||||||
|
dovecot:
|
||||||
redis:
|
image: dovecot/dovecot
|
||||||
image: redis:alpine
|
|
||||||
restart: always
|
restart: always
|
||||||
volumes:
|
networks:
|
||||||
- "/mailu/redis:/data"
|
- default
|
||||||
depends_on:
|
|
||||||
- resolver
|
|
||||||
dns:
|
|
||||||
- 192.168.203.254
|
|
||||||
|
|
||||||
# Core services
|
|
||||||
front:
|
|
||||||
image: ${DOCKER_ORG:-ghcr.io/mailu}/${DOCKER_PREFIX:-}nginx:${MAILU_VERSION:-2024.06}
|
|
||||||
restart: always
|
|
||||||
env_file: mailu.env
|
|
||||||
logging:
|
|
||||||
driver: journald
|
|
||||||
options:
|
|
||||||
tag: mailu-front
|
|
||||||
ports:
|
ports:
|
||||||
- "80:80"
|
- 143:143
|
||||||
- "443:443"
|
- 993:993
|
||||||
- "25:25"
|
volumes:
|
||||||
- "465:465"
|
- vmail:/srv/mail
|
||||||
- "587:587"
|
- /opt/dovecot/config:/etc/dovecot
|
||||||
- "110:110"
|
- /opt/dovecot/passwd:/etc/dovecot/passwd
|
||||||
- "995:995"
|
|
||||||
- "143:143"
|
roundcube:
|
||||||
- "993:993"
|
image: roundcube/roundcubemail
|
||||||
- "4190:4190"
|
|
||||||
networks:
|
networks:
|
||||||
- default
|
- default
|
||||||
- webmail
|
ports:
|
||||||
volumes:
|
- 80:80
|
||||||
- "/mailu/certs:/certs"
|
environment:
|
||||||
- "/mailu/overrides/nginx:/overrides:ro"
|
- ROUNDCUBEMAIL_DEFAULT_HOST=180.1.1.164
|
||||||
|
- ROUNDCUBEMAIL_DEFAULT_PORT=143
|
||||||
depends_on:
|
depends_on:
|
||||||
- resolver
|
- dovecot
|
||||||
dns:
|
|
||||||
- 192.168.203.254
|
|
||||||
|
|
||||||
resolver:
|
|
||||||
image: ${DOCKER_ORG:-ghcr.io/mailu}/${DOCKER_PREFIX:-}unbound:${MAILU_VERSION:-2024.06}
|
|
||||||
env_file: mailu.env
|
|
||||||
logging:
|
|
||||||
driver: journald
|
|
||||||
options:
|
|
||||||
tag: mailu-resolver
|
|
||||||
restart: always
|
|
||||||
networks:
|
|
||||||
default:
|
|
||||||
ipv4_address: 192.168.203.254
|
|
||||||
|
|
||||||
admin:
|
|
||||||
image: ${DOCKER_ORG:-ghcr.io/mailu}/${DOCKER_PREFIX:-}admin:${MAILU_VERSION:-2024.06}
|
|
||||||
restart: always
|
|
||||||
env_file: mailu.env
|
|
||||||
logging:
|
|
||||||
driver: journald
|
|
||||||
options:
|
|
||||||
tag: mailu-admin
|
|
||||||
volumes:
|
|
||||||
- "/mailu/data:/data"
|
|
||||||
- "/mailu/dkim:/dkim"
|
|
||||||
depends_on:
|
|
||||||
- redis
|
|
||||||
- resolver
|
|
||||||
dns:
|
|
||||||
- 192.168.203.254
|
|
||||||
|
|
||||||
imap:
|
|
||||||
image: ${DOCKER_ORG:-ghcr.io/mailu}/${DOCKER_PREFIX:-}dovecot:${MAILU_VERSION:-2024.06}
|
|
||||||
restart: always
|
|
||||||
env_file: mailu.env
|
|
||||||
logging:
|
|
||||||
driver: journald
|
|
||||||
options:
|
|
||||||
tag: mailu-imap
|
|
||||||
volumes:
|
|
||||||
- "/mailu/mail:/mail"
|
|
||||||
- "/mailu/overrides/dovecot:/overrides:ro"
|
|
||||||
networks:
|
|
||||||
- default
|
|
||||||
depends_on:
|
|
||||||
- front
|
|
||||||
- resolver
|
|
||||||
dns:
|
|
||||||
- 192.168.203.254
|
|
||||||
|
|
||||||
smtp:
|
|
||||||
image: ${DOCKER_ORG:-ghcr.io/mailu}/${DOCKER_PREFIX:-}postfix:${MAILU_VERSION:-2024.06}
|
|
||||||
restart: always
|
|
||||||
env_file: mailu.env
|
|
||||||
logging:
|
|
||||||
driver: journald
|
|
||||||
options:
|
|
||||||
tag: mailu-smtp
|
|
||||||
volumes:
|
|
||||||
- "/mailu/mailqueue:/queue"
|
|
||||||
- "/mailu/overrides/postfix:/overrides:ro"
|
|
||||||
depends_on:
|
|
||||||
- front
|
|
||||||
- resolver
|
|
||||||
dns:
|
|
||||||
- 192.168.203.254
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
antispam:
|
|
||||||
image: ${DOCKER_ORG:-ghcr.io/mailu}/${DOCKER_PREFIX:-}rspamd:${MAILU_VERSION:-2024.06}
|
|
||||||
hostname: antispam
|
|
||||||
restart: always
|
|
||||||
env_file: mailu.env
|
|
||||||
logging:
|
|
||||||
driver: journald
|
|
||||||
options:
|
|
||||||
tag: mailu-antispam
|
|
||||||
networks:
|
|
||||||
- default
|
|
||||||
volumes:
|
|
||||||
- "/mailu/filter:/var/lib/rspamd"
|
|
||||||
- "/mailu/overrides/rspamd:/overrides:ro"
|
|
||||||
depends_on:
|
|
||||||
- front
|
|
||||||
- redis
|
|
||||||
- resolver
|
|
||||||
dns:
|
|
||||||
- 192.168.203.254
|
|
||||||
|
|
||||||
# Optional services
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Webmail
|
|
||||||
webmail:
|
|
||||||
image: ${DOCKER_ORG:-ghcr.io/mailu}/${DOCKER_PREFIX:-}webmail:${MAILU_VERSION:-2024.06}
|
|
||||||
restart: always
|
|
||||||
env_file: mailu.env
|
|
||||||
logging:
|
|
||||||
driver: journald
|
|
||||||
options:
|
|
||||||
tag: mailu-webmail
|
|
||||||
volumes:
|
|
||||||
- "/mailu/webmail:/data"
|
|
||||||
- "/mailu/overrides/roundcube:/overrides:ro"
|
|
||||||
networks:
|
|
||||||
- webmail
|
|
||||||
depends_on:
|
|
||||||
- front
|
|
||||||
|
|
||||||
imapsync:
|
imapsync:
|
||||||
build:
|
build:
|
||||||
dockerfile: imapsync-dockerfile
|
dockerfile: imapsync-dockerfile
|
||||||
container_name: imapsync
|
container_name: imapsync
|
||||||
restart: always
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- /app/db:/root/IMAP-Sync/db
|
||||||
logging:
|
logging:
|
||||||
driver: journald
|
driver: journald
|
||||||
options:
|
options:
|
||||||
|
|
@ -162,8 +38,27 @@ services:
|
||||||
networks:
|
networks:
|
||||||
- default
|
- default
|
||||||
depends_on:
|
depends_on:
|
||||||
- front
|
- dovecot
|
||||||
|
|
||||||
|
streamlit:
|
||||||
|
build:
|
||||||
|
dockerfile: streamlit-dockerfile
|
||||||
|
container_name: streamlit
|
||||||
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- /app/db:/root/IMAP-Sync/db
|
||||||
|
logging:
|
||||||
|
driver: journald
|
||||||
|
options:
|
||||||
|
tag: imapsync
|
||||||
|
networks:
|
||||||
|
- default
|
||||||
|
depends_on:
|
||||||
|
- dovecot
|
||||||
|
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
vmail:
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -6,16 +6,16 @@ RUN apt install -y git make gcc
|
||||||
RUN apt install -y apt-file cpanminus libc6-dev libssl-dev python3 python3-pip
|
RUN apt install -y apt-file cpanminus libc6-dev libssl-dev python3 python3-pip
|
||||||
RUN apt install -y libperl-dev zlib1g-dev libnet-ssleay-perl
|
RUN apt install -y libperl-dev zlib1g-dev libnet-ssleay-perl
|
||||||
RUN cpanm App::cpanminus Authen::NTLM CGI Compress::Zlib Crypt::OpenSSL::RSA Data::Dumper Data::Uniqid Dist::CheckConflicts Encode Encode::IMAPUTF7 File::Copy::Recursive File::Tail IO::Socket::INET IO::Socket::INET6 IO::Socket::SSL IO::Tee JSON JSON::WebToken LWP::UserAgent Mail::IMAPClient Module::ScanDeps PAR::Packer Pod::Usage Readonly Regexp::Common Sys::MemInfo Term::ReadKey Test::MockObject Test::More Test::Pod Unicode::String; exit 0
|
RUN cpanm App::cpanminus Authen::NTLM CGI Compress::Zlib Crypt::OpenSSL::RSA Data::Dumper Data::Uniqid Dist::CheckConflicts Encode Encode::IMAPUTF7 File::Copy::Recursive File::Tail IO::Socket::INET IO::Socket::INET6 IO::Socket::SSL IO::Tee JSON JSON::WebToken LWP::UserAgent Mail::IMAPClient Module::ScanDeps PAR::Packer Pod::Usage Readonly Regexp::Common Sys::MemInfo Term::ReadKey Test::MockObject Test::More Test::Pod Unicode::String; exit 0
|
||||||
RUN apt install -y libproc-processtable-perl python3-requests
|
RUN apt install -y libproc-processtable-perl python3-requests iputils-ping
|
||||||
WORKDIR /usr/local/src
|
WORKDIR /usr/local/src
|
||||||
RUN echo PWD
|
RUN echo PWD
|
||||||
RUN git clone https://github.com/imapsync/imapsync.git
|
RUN git clone https://github.com/imapsync/imapsync.git
|
||||||
WORKDIR ./imapsync
|
RUN ./imapsync
|
||||||
RUN make install
|
RUN make install
|
||||||
|
|
||||||
RUN mkdir /app
|
RUN mkdir /app
|
||||||
WORKDIR /app/
|
WORKDIR /app/
|
||||||
RUN git clone https://gitlab.stines.de/sebastian.serfling/IMAP-Sync.git .
|
COPY ../python_scripte/imapsync.py .
|
||||||
CMD ["/bin/bash"]
|
CMD ["/bin/bash"]
|
||||||
|
|
||||||
#RUN impasync-script
|
#RUN impasync-script
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
# app/Dockerfile
|
||||||
|
|
||||||
|
FROM python:3.9-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
build-essential \
|
||||||
|
curl \
|
||||||
|
software-properties-common \
|
||||||
|
git \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
COPY ../python_scripte/streamlit-app.py /app/
|
||||||
|
COPY ../python_scripte/requirements.txt /app/
|
||||||
|
|
||||||
|
RUN pip3 install -r /app/requirements.txt
|
||||||
|
|
||||||
|
EXPOSE 80
|
||||||
|
|
||||||
|
HEALTHCHECK CMD curl --fail http://localhost:80/_stcore/health
|
||||||
|
|
||||||
|
ENTRYPOINT ["streamlit", "run", "/app/streamlit-app.py", "--server.port=80", "--server.address=0.0.0.0"]
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
## You should mount /etc/dovecot if you want to
|
||||||
|
## manage this file
|
||||||
|
|
||||||
|
mail_home=/srv/mail/%Lu
|
||||||
|
mail_location=sdbox:~/Mail
|
||||||
|
mail_uid=1000
|
||||||
|
mail_gid=1000
|
||||||
|
|
||||||
|
protocols = imap pop3 submission sieve lmtp
|
||||||
|
|
||||||
|
first_valid_uid = 1000
|
||||||
|
last_valid_uid = 1000
|
||||||
|
|
||||||
|
passdb {
|
||||||
|
driver = passwd-file
|
||||||
|
args = /etc/dovecot/passwd
|
||||||
|
}
|
||||||
|
namespace {
|
||||||
|
inbox = yes
|
||||||
|
separator = /
|
||||||
|
}
|
||||||
|
|
||||||
|
service lmtp {
|
||||||
|
inet_listener {
|
||||||
|
port = 24
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
listen = *
|
||||||
|
|
||||||
|
log_path=/dev/stdout
|
||||||
|
info_log_path=/dev/stdout
|
||||||
|
debug_log_path=/dev/stdout
|
||||||
|
|
||||||
|
auth_mechanisms = plain login
|
||||||
|
disable_plaintext_auth = no
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
archiv@trendsetzer.eu:{PLAIN}Ln0m2YQZd23H54L5tCiyjIBWLEn8mk36v7KauqS8QFGzu::::::
|
||||||
66
imapsync.py
66
imapsync.py
|
|
@ -1,66 +0,0 @@
|
||||||
import sys
|
|
||||||
import csv
|
|
||||||
import os
|
|
||||||
import requests
|
|
||||||
import socket
|
|
||||||
import subprocess
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
|
|
||||||
csvfile = Path("user.csv")
|
|
||||||
host = "front"
|
|
||||||
port = 993
|
|
||||||
|
|
||||||
|
|
||||||
# Mail Server aktiv ?
|
|
||||||
try:
|
|
||||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
||||||
sock.settimeout(1)
|
|
||||||
result = sock.connect_ex((host, port))
|
|
||||||
if result != 0:
|
|
||||||
print(f"Fehler beim Verbinden zu {host} auf Port {port}") ## --- E-Mail senden
|
|
||||||
except:
|
|
||||||
print(f"Fehler beim Verbinden zu {host} auf Port {port}") ## --- E-Mail senden
|
|
||||||
finally:
|
|
||||||
sock.close()
|
|
||||||
|
|
||||||
|
|
||||||
# CSV vorhanden1
|
|
||||||
try:
|
|
||||||
csvfile_path = csvfile.resolve(strict=True)
|
|
||||||
except FileNotFoundError:
|
|
||||||
print("not Found")
|
|
||||||
|
|
||||||
|
|
||||||
#CSV erste Zeile auslesen (domain;domain)
|
|
||||||
rows = []
|
|
||||||
with open(csvfile, mode='r', newline='') as file:
|
|
||||||
reader = csv.reader(file, delimiter=";")
|
|
||||||
next(reader)
|
|
||||||
for row in reader:
|
|
||||||
rows.append(row)
|
|
||||||
for row in rows:
|
|
||||||
username = row[0]
|
|
||||||
password = row[1]
|
|
||||||
domain = row[2]
|
|
||||||
# Erstellen einer Liste für den Befehl und die Argumente
|
|
||||||
command = [
|
|
||||||
"imapsync",
|
|
||||||
"--host1", domain,
|
|
||||||
"--user1", username,
|
|
||||||
"--password1", password,
|
|
||||||
"--host2", "front",
|
|
||||||
"--user2", "archiv@archiv.trendsetzer.eu",
|
|
||||||
"--port2","143",
|
|
||||||
"--password2", "S8jZT7Ke3gdzxV0QfsB19R1bNwR716M6yUJQ4az9Kr8EK"
|
|
||||||
# "--prefix2", f"Archiv/{username}/", # Verwende dynamisch den username im Zielordner
|
|
||||||
# "--regextrans2", "s/^(.*)$/\\${1}/",
|
|
||||||
]
|
|
||||||
subprocess.run(command)
|
|
||||||
|
|
||||||
# CSV laden
|
|
||||||
# User in CSV kontrollieren ob vorhanden -> User anlegen
|
|
||||||
# impasync für jeden User durchführen -> Doamin aus CSV laden domain1.de;domain2.de
|
|
||||||
# Wenn Anmeldung am User failed -> Email mit User an -> impasync@domain1.de
|
|
||||||
# Abschluss Ergbniss in SQLLite Datenbank schreiben
|
|
||||||
# Daily Report an -> impasync@domain1.de
|
|
||||||
166
mailu.env
166
mailu.env
|
|
@ -1,166 +0,0 @@
|
||||||
# Mailu main configuration file
|
|
||||||
#
|
|
||||||
# This file is autogenerated by the configuration management wizard for compose flavor.
|
|
||||||
# For a detailed list of configuration variables, see the documentation at
|
|
||||||
# https://mailu.io
|
|
||||||
|
|
||||||
###################################
|
|
||||||
# Common configuration variables
|
|
||||||
###################################
|
|
||||||
|
|
||||||
# Set to a randomly generated 16 bytes string
|
|
||||||
SECRET_KEY=YZ6BKHDTZRSIZ4HT
|
|
||||||
|
|
||||||
# Subnet of the docker network. This should not conflict with any networks to which your system is connected. (Internal and external!)
|
|
||||||
SUBNET=192.168.203.0/24
|
|
||||||
|
|
||||||
# Main mail domain
|
|
||||||
DOMAIN=archiv.trendsetzer.eu
|
|
||||||
|
|
||||||
# Hostnames for this server, separated with commas
|
|
||||||
HOSTNAMES=archiv.trendsetzer.eu
|
|
||||||
|
|
||||||
# Postmaster local part (will append the main mail domain)
|
|
||||||
POSTMASTER=admin
|
|
||||||
|
|
||||||
# Choose how secure connections will behave (value: letsencrypt, cert, notls, mail, mail-letsencrypt)
|
|
||||||
TLS_FLAVOR=notls
|
|
||||||
|
|
||||||
# Authentication rate limit per IP (per /24 on ipv4 and /48 on ipv6)
|
|
||||||
AUTH_RATELIMIT_IP=5/hour
|
|
||||||
|
|
||||||
# Authentication rate limit per user (regardless of the source-IP)
|
|
||||||
AUTH_RATELIMIT_USER=50/day
|
|
||||||
|
|
||||||
# Opt-out of statistics, replace with "True" to opt out
|
|
||||||
DISABLE_STATISTICS=True
|
|
||||||
|
|
||||||
###################################
|
|
||||||
# Optional features
|
|
||||||
###################################
|
|
||||||
|
|
||||||
# Expose the admin interface (value: true, false)
|
|
||||||
ADMIN=true
|
|
||||||
|
|
||||||
# Choose which webmail to run if any (values: roundcube, snappymail, none). To enable this feature, recreate the docker-compose.yml file via setup.
|
|
||||||
WEBMAIL=snappymail
|
|
||||||
|
|
||||||
# Expose the API interface (value: true, false)
|
|
||||||
API=true
|
|
||||||
|
|
||||||
# Dav server implementation (value: radicale, none). To enable this feature, recreate the docker-compose.yml file via setup.
|
|
||||||
WEBDAV=none
|
|
||||||
|
|
||||||
# Antivirus solution (value: clamav, none). To enable this feature, recreate the docker-compose.yml file via setup.
|
|
||||||
ANTIVIRUS=none
|
|
||||||
|
|
||||||
# Scan Macros solution (value: true, false). To enable this feature, recreate the docker-compose.yml file via setup.
|
|
||||||
SCAN_MACROS=false
|
|
||||||
|
|
||||||
###################################
|
|
||||||
# Mail settings
|
|
||||||
###################################
|
|
||||||
|
|
||||||
# Message size limit in bytes
|
|
||||||
# Default: accept messages up to 50MB
|
|
||||||
# Max attachment size will be 33% smaller
|
|
||||||
MESSAGE_SIZE_LIMIT=50000000
|
|
||||||
|
|
||||||
# Message rate limit (per user)
|
|
||||||
MESSAGE_RATELIMIT=200/day
|
|
||||||
|
|
||||||
# Networks granted relay permissions
|
|
||||||
# Use this with care, all hosts in this networks will be able to send mail without authentication!
|
|
||||||
RELAYNETS=
|
|
||||||
|
|
||||||
# Will relay all outgoing mails if configured
|
|
||||||
RELAYHOST=
|
|
||||||
|
|
||||||
# Enable fetchmail
|
|
||||||
FETCHMAIL_ENABLED=False
|
|
||||||
|
|
||||||
# Fetchmail delay
|
|
||||||
FETCHMAIL_DELAY=600
|
|
||||||
|
|
||||||
# Recipient delimiter, character used to delimiter localpart from custom address part
|
|
||||||
RECIPIENT_DELIMITER=+
|
|
||||||
|
|
||||||
# DMARC rua and ruf email
|
|
||||||
DMARC_RUA=admin
|
|
||||||
DMARC_RUF=admin
|
|
||||||
|
|
||||||
# Welcome email, enable and set a topic and body if you wish to send welcome
|
|
||||||
# emails to all users.
|
|
||||||
WELCOME=false
|
|
||||||
WELCOME_SUBJECT=Welcome to your new email account
|
|
||||||
WELCOME_BODY=Welcome to your new email account, if you can read this, then it is configured properly!
|
|
||||||
|
|
||||||
# Maildir Compression
|
|
||||||
# choose compression-method, default: none (value: gz, bz2, zstd)
|
|
||||||
COMPRESSION=
|
|
||||||
# change compression-level, default: 6 (value: 1-9)
|
|
||||||
COMPRESSION_LEVEL=
|
|
||||||
|
|
||||||
# IMAP full-text search is enabled by default.
|
|
||||||
# Set the following variable to off in order to disable the feature
|
|
||||||
# or a comma separated list of language codes to support
|
|
||||||
FULL_TEXT_SEARCH=de
|
|
||||||
|
|
||||||
###################################
|
|
||||||
# Web settings
|
|
||||||
###################################
|
|
||||||
|
|
||||||
# Path to redirect / to
|
|
||||||
WEBROOT_REDIRECT=/webmail
|
|
||||||
|
|
||||||
# Path to the admin interface if enabled
|
|
||||||
WEB_ADMIN=/admin
|
|
||||||
|
|
||||||
# Path to the webmail if enabled
|
|
||||||
WEB_WEBMAIL=/webmail
|
|
||||||
|
|
||||||
# Path to the API interface if enabled
|
|
||||||
WEB_API=/api
|
|
||||||
|
|
||||||
# Website name
|
|
||||||
SITENAME=Mailu
|
|
||||||
|
|
||||||
# Linked Website URL
|
|
||||||
#WEBSITE=https://mailu.io
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
###################################
|
|
||||||
# Advanced settings
|
|
||||||
###################################
|
|
||||||
|
|
||||||
# Docker-compose project name, this will prepended to containers names.
|
|
||||||
COMPOSE_PROJECT_NAME=mailu
|
|
||||||
|
|
||||||
# Number of rounds used by the password hashing scheme
|
|
||||||
CREDENTIAL_ROUNDS=12
|
|
||||||
|
|
||||||
# Header to take the real ip from
|
|
||||||
REAL_IP_HEADER=
|
|
||||||
|
|
||||||
# IPs for nginx set_real_ip_from (CIDR list separated by commas)
|
|
||||||
REAL_IP_FROM=
|
|
||||||
|
|
||||||
# choose wether mailu bounces (no) or rejects (yes) mail when recipient is unknown (value: yes, no)
|
|
||||||
REJECT_UNLISTED_RECIPIENT=
|
|
||||||
|
|
||||||
# Log level threshold in start.py (value: CRITICAL, ERROR, WARNING, INFO, DEBUG, NOTSET)
|
|
||||||
LOG_LEVEL=INFO
|
|
||||||
|
|
||||||
# Timezone for the Mailu containers. See this link for all possible values https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
|
||||||
TZ=Etc/UTC
|
|
||||||
|
|
||||||
# Default spam threshold used for new users
|
|
||||||
DEFAULT_SPAM_THRESHOLD=80
|
|
||||||
|
|
||||||
# API token required for authenticating to the RESTful API.
|
|
||||||
# This is a mandatory setting for using the RESTful API.
|
|
||||||
API_TOKEN=ID0UTNZ5L6JOYRUN2WRJL4VXLAJ97JKH
|
|
||||||
|
|
||||||
# Whether tika should be enabled (scan/OCR email attachements). To enable this feature, recreate the docker-compose.yml file via setup.
|
|
||||||
FULL_TEXT_SEARCH_ATTACHMENTS=
|
|
||||||
|
|
@ -0,0 +1,135 @@
|
||||||
|
import sys
|
||||||
|
import socket
|
||||||
|
import subprocess
|
||||||
|
import sqlite3
|
||||||
|
from datetime import datetime
|
||||||
|
import smtplib
|
||||||
|
import os
|
||||||
|
from email.message import EmailMessage
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
# Define server details
|
||||||
|
host = "front"
|
||||||
|
port = 993
|
||||||
|
|
||||||
|
# Function to send an email notification
|
||||||
|
def send_email(subject, body, to_email):
|
||||||
|
smtp_server = os.getenv('SMTP_SERVER')
|
||||||
|
smtp_port = int(os.getenv('SMTP_PORT', 587))
|
||||||
|
smtp_user = os.getenv('SMTP_USER')
|
||||||
|
smtp_password = os.getenv('SMTP_PASSWORD')
|
||||||
|
from_email = os.getenv('FROM_EMAIL')
|
||||||
|
|
||||||
|
msg = EmailMessage()
|
||||||
|
msg.set_content(body)
|
||||||
|
msg['Subject'] = subject
|
||||||
|
msg['From'] = from_email
|
||||||
|
msg['To'] = to_email
|
||||||
|
|
||||||
|
try:
|
||||||
|
with smtplib.SMTP(smtp_server, smtp_port) as server:
|
||||||
|
server.starttls()
|
||||||
|
server.login(smtp_user, smtp_password)
|
||||||
|
server.send_message(msg)
|
||||||
|
print(f"Error notification sent to {to_email}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Failed to send email: {e}")
|
||||||
|
|
||||||
|
# Check if mail server is active
|
||||||
|
try:
|
||||||
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
sock.settimeout(1)
|
||||||
|
result = sock.connect_ex((host, port))
|
||||||
|
if result != 0:
|
||||||
|
print(f"Fehler beim Verbinden zu {host} auf Port {port}") # --- E-Mail senden
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Fehler beim Verbinden zu {host} auf Port {port}: {e}") # --- E-Mail senden
|
||||||
|
finally:
|
||||||
|
sock.close()
|
||||||
|
|
||||||
|
# Prepare SQLite database connection
|
||||||
|
db_path = "imapsync_results.db"
|
||||||
|
conn = sqlite3.connect(db_path)
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
# Create tables if not exists
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE IF NOT EXISTS sync_results (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
email TEXT,
|
||||||
|
messages_transferred INTEGER,
|
||||||
|
date TEXT
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE IF NOT EXISTS users (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
email TEXT UNIQUE,
|
||||||
|
password TEXT,
|
||||||
|
domain TEXT
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
# Fetch user data from the SQLite database
|
||||||
|
cursor.execute("SELECT email, password, domain FROM users")
|
||||||
|
users = cursor.fetchall()
|
||||||
|
|
||||||
|
if not users:
|
||||||
|
print("No users found in the database.")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Process each user
|
||||||
|
for user in users:
|
||||||
|
username, password, domain = user
|
||||||
|
local_part = username.split('@')[0]
|
||||||
|
|
||||||
|
# Command for imapsync
|
||||||
|
command = [
|
||||||
|
"imapsync",
|
||||||
|
"--host1", domain,
|
||||||
|
"--user1", username,
|
||||||
|
"--password1", password,
|
||||||
|
"--host2", "180.1.1.164",
|
||||||
|
"--user2", "archiv@archiv.trendsetzer.eu",
|
||||||
|
"--password2", "pass",
|
||||||
|
"--subfolder2", f"{local_part}",
|
||||||
|
"--regextrans2", "s/^(.*)$/\\1/",
|
||||||
|
"--nolog"
|
||||||
|
]
|
||||||
|
|
||||||
|
# Run the command and capture the output
|
||||||
|
try:
|
||||||
|
result = subprocess.run(command, capture_output=True, text=True)
|
||||||
|
output = result.stdout
|
||||||
|
|
||||||
|
# Check for EXIT_AUTHENTICATION_FAILURE_USER error
|
||||||
|
if "EXIT_AUTHENTICATION_FAILURE_USER" in output:
|
||||||
|
subject = f"Authentication Failure for {username}"
|
||||||
|
body = f"An authentication failure occurred for user {username} during IMAP sync."
|
||||||
|
send_email(subject, body, os.getenv('TO_EMAIL'))
|
||||||
|
|
||||||
|
# Find and extract the "Messages transferred" line
|
||||||
|
for line in output.splitlines():
|
||||||
|
if "Messages transferred" in line:
|
||||||
|
transferred_messages = line.split(":")[-1].strip()
|
||||||
|
transferred_count = int(transferred_messages)
|
||||||
|
current_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
|
||||||
|
# Insert result into SQLite database
|
||||||
|
cursor.execute('''
|
||||||
|
INSERT INTO sync_results (email, messages_transferred, date)
|
||||||
|
VALUES (?, ?, ?)
|
||||||
|
''', (username, transferred_count, current_date))
|
||||||
|
conn.commit()
|
||||||
|
print(f"Data inserted for {username}: {transferred_count} messages on {current_date}")
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
print(f"No 'Messages transferred' line found for {username}.")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error running imapsync for {username}: {e}")
|
||||||
|
|
||||||
|
# Close database connection
|
||||||
|
conn.close()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
requests
|
||||||
|
pandas
|
||||||
|
streamlit
|
||||||
|
|
@ -0,0 +1,122 @@
|
||||||
|
import streamlit as st
|
||||||
|
import sqlite3
|
||||||
|
import pandas as pd
|
||||||
|
|
||||||
|
def fetch_data_from_db(db_path, table_name):
|
||||||
|
conn = sqlite3.connect(db_path)
|
||||||
|
query = f"SELECT * FROM {table_name}"
|
||||||
|
df = pd.read_sql_query(query, conn)
|
||||||
|
conn.close()
|
||||||
|
return df
|
||||||
|
|
||||||
|
def insert_user_into_db(db_path, email, password, domain):
|
||||||
|
conn = sqlite3.connect(db_path)
|
||||||
|
cursor = conn.cursor()
|
||||||
|
cursor.execute('''
|
||||||
|
INSERT INTO users (email, password, domain)
|
||||||
|
VALUES (?, ?, ?)
|
||||||
|
''', (email, password, domain))
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
def delete_user_from_db(db_path, email):
|
||||||
|
conn = sqlite3.connect(db_path)
|
||||||
|
cursor = conn.cursor()
|
||||||
|
cursor.execute('''
|
||||||
|
DELETE FROM users WHERE email = ?
|
||||||
|
''', (email,))
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
def main():
|
||||||
|
st.set_page_config(page_title="Archiv Manager")
|
||||||
|
st.title("IMAPSync Manager")
|
||||||
|
|
||||||
|
db_path = "/app/db/imapsync_results.db"
|
||||||
|
|
||||||
|
# Sidebar for navigation with buttons and unique keys
|
||||||
|
st.sidebar.title("Navigation")
|
||||||
|
add_user = st.sidebar.button("Add User", key="add_user_button")
|
||||||
|
view_users = st.sidebar.button("View Users", key="view_users_button")
|
||||||
|
delete_user = st.sidebar.button("Delete User", key="delete_user_button")
|
||||||
|
st.sidebar.markdown(
|
||||||
|
'<a href="http://180.1.1.164:8000" target="_blank"><button style="background-color: LightGray; color: black; border: none; padding: 8px 16px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer;">View Mails</button></a>',
|
||||||
|
unsafe_allow_html=True
|
||||||
|
)
|
||||||
|
|
||||||
|
# Use session state to keep track of the selected page
|
||||||
|
if 'page' not in st.session_state:
|
||||||
|
st.session_state.page = 'View Users'
|
||||||
|
|
||||||
|
if add_user:
|
||||||
|
st.session_state.page = 'Add User'
|
||||||
|
elif view_users:
|
||||||
|
st.session_state.page = 'View Users'
|
||||||
|
elif delete_user:
|
||||||
|
st.session_state.page = 'Delete User'
|
||||||
|
|
||||||
|
if st.session_state.page == "Add User":
|
||||||
|
st.header("Add a New User")
|
||||||
|
new_email = st.text_input("Email:")
|
||||||
|
new_password = st.text_input("Password:", type="password")
|
||||||
|
new_domain = st.text_input("Domain:")
|
||||||
|
|
||||||
|
if st.button("Add User", key="submit_add_user"):
|
||||||
|
if new_email and new_password and new_domain:
|
||||||
|
insert_user_into_db(db_path, new_email, new_password, new_domain)
|
||||||
|
st.success(f"User {new_email} added successfully!")
|
||||||
|
else:
|
||||||
|
st.error("Please fill in all fields.")
|
||||||
|
|
||||||
|
elif st.session_state.page == "View Users":
|
||||||
|
st.header("IMAPSync Users and Email Transfer Results")
|
||||||
|
|
||||||
|
# Fetch users and email transfer data
|
||||||
|
users_df = fetch_data_from_db(db_path, "users")
|
||||||
|
results_df = fetch_data_from_db(db_path, "sync_results")
|
||||||
|
|
||||||
|
if users_df.empty:
|
||||||
|
st.write("No user data available in the database.")
|
||||||
|
else:
|
||||||
|
emails = users_df['email'].unique().tolist()
|
||||||
|
emails.insert(0, "All")
|
||||||
|
selected_email = st.selectbox("Filter by Email:", options=emails)
|
||||||
|
|
||||||
|
if selected_email == "All":
|
||||||
|
filtered_users_df = users_df
|
||||||
|
else:
|
||||||
|
filtered_users_df = users_df[users_df['email'] == selected_email]
|
||||||
|
|
||||||
|
st.dataframe(filtered_users_df)
|
||||||
|
|
||||||
|
# Display email transfer results if available
|
||||||
|
if not results_df.empty:
|
||||||
|
if selected_email == "All":
|
||||||
|
st.write("Email Transfer Results:")
|
||||||
|
st.dataframe(results_df)
|
||||||
|
else:
|
||||||
|
filtered_results_df = results_df[results_df['email'] == selected_email]
|
||||||
|
if not filtered_results_df.empty:
|
||||||
|
st.write(f"Email Transfer Results for {selected_email}:")
|
||||||
|
st.dataframe(filtered_results_df)
|
||||||
|
else:
|
||||||
|
st.write(f"No transfer data found for {selected_email}.")
|
||||||
|
else:
|
||||||
|
st.write("No email transfer results available.")
|
||||||
|
|
||||||
|
elif st.session_state.page == "Delete User":
|
||||||
|
st.header("Delete a User")
|
||||||
|
|
||||||
|
df = fetch_data_from_db(db_path, "users")
|
||||||
|
|
||||||
|
if df.empty:
|
||||||
|
st.write("No data available in the database.")
|
||||||
|
else:
|
||||||
|
user_to_delete = st.selectbox("Select User to Delete:", df['email'].unique())
|
||||||
|
|
||||||
|
if st.button("Delete User", key="confirm_delete_user"):
|
||||||
|
delete_user_from_db(db_path, user_to_delete)
|
||||||
|
st.success(f"User {user_to_delete} deleted successfully!")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
requests
|
|
||||||
Loading…
Reference in New Issue