116 lines
4.7 KiB
Python
116 lines
4.7 KiB
Python
from typing import Type
|
|
from mautrix.util.config import BaseProxyConfig, ConfigUpdateHelper
|
|
from maubot import Plugin, MessageEvent
|
|
from maubot.handlers import command
|
|
|
|
import smtplib, ssl
|
|
from email.mime.multipart import MIMEMultipart
|
|
from email.mime.text import MIMEText
|
|
import email
|
|
import email.encoders
|
|
|
|
import re
|
|
import datetime
|
|
import locale
|
|
|
|
class Config(BaseProxyConfig):
|
|
def do_update(self, helper: ConfigUpdateHelper) -> None:
|
|
helper.copy("sender_addr")
|
|
helper.copy("sender_passwd")
|
|
helper.copy("smtp_server")
|
|
helper.copy("smtp_port")
|
|
helper.copy("send_to")
|
|
|
|
class MailBot(Plugin):
|
|
async def start(self) -> None:
|
|
#self.on_external_config_update()
|
|
self.config.load_and_update()
|
|
|
|
@command.new(name="mail")
|
|
@command.argument("pattern", pass_raw=True, required=True)
|
|
async def sendMail(self, evt: MessageEvent, pattern: str) -> None:
|
|
await evt.mark_read()
|
|
try:
|
|
fullMail = pattern.split("\n", 1)
|
|
subject = fullMail[0]
|
|
body = fullMail[1]
|
|
|
|
self.log.info("Connecting to " + self.config["smtp_server"]+", port : "+ str(self.config["smtp_port"]))
|
|
smtp_server=smtplib.SMTP_SSL(self.config["smtp_server"],self.config["smtp_port"])
|
|
self.log.info("With user : " + self.config["sender_addr"])
|
|
smtp_server.login(self.config["sender_addr"], self.config["sender_passwd"])
|
|
|
|
msg = MIMEMultipart()
|
|
user = re.search('@(.*):', evt.sender)
|
|
msg['From'] = user.group(1) + " via ConDeBot<" + self.config["sender_addr"] + '>'
|
|
self.log.info(msg['From'])
|
|
msg['To'] = self.config["send_to"]
|
|
msg['Subject'] = subject
|
|
msg['Date'] = email.utils.formatdate(localtime=True)
|
|
|
|
msg.attach(MIMEText(body))
|
|
self.log.info(msg.as_string())
|
|
smtp_server.sendmail(msg['From'],msg['To'],msg.as_string())
|
|
await evt.respond('Mail envoyé')
|
|
except IndexError:
|
|
if len(subject) == 0:
|
|
await evt.respond("<p>!mail Object<br />Corps du message<p>", allow_html=True)
|
|
else:
|
|
self.log.error("Il manque le corps du mail")
|
|
await evt.respond('Il manque le corps du mail')
|
|
await evt.respond("<p>!mail Object<br />Corps du message<p>", allow_html=True)
|
|
except Exception as e:
|
|
self.log.error(str(e))
|
|
await evt.respond('Erreur envoi mail')
|
|
await evt.respond("<p>!mail Object<br />Corps du message<p>", allow_html=True)
|
|
|
|
|
|
|
|
def next_weekday(self, d, weekday):
|
|
days_ahead = weekday - d.weekday()
|
|
if days_ahead < 0:
|
|
days_ahead += 7
|
|
return d + datetime.timedelta(days_ahead)
|
|
@command.new(name="repet")
|
|
@command.argument("pattern", pass_raw=True, required=True)
|
|
async def repet(self, evt: MessageEvent, pattern: str) -> None:
|
|
await evt.mark_read()
|
|
try:
|
|
locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')
|
|
#Mercredi jour = 2
|
|
nWed = self.next_weekday(datetime.date.today(), 2)
|
|
subject = "Programme répet du " + nWed.strftime('%d %B')
|
|
body = pattern
|
|
|
|
if len(body) == 0:
|
|
self.log.error("Il manque le corps du mail")
|
|
await evt.respond('Il manque le corps du mail')
|
|
await evt.respond("<p>!repet Corps du message<p>", allow_html=True)
|
|
return
|
|
|
|
self.log.info("Connecting to " + self.config["smtp_server"]+", port : "+ str(self.config["smtp_port"]))
|
|
smtp_server=smtplib.SMTP_SSL(self.config["smtp_server"],self.config["smtp_port"])
|
|
self.log.info("With user : " + self.config["sender_addr"])
|
|
smtp_server.login(self.config["sender_addr"], self.config["sender_passwd"])
|
|
|
|
msg = MIMEMultipart()
|
|
user = re.search('@(.*):', evt.sender)
|
|
msg['From'] = user.group(1) + " via ConDeBot<" + self.config["sender_addr"] + '>'
|
|
self.log.info(msg['From'])
|
|
msg['To'] = self.config["send_to"]
|
|
msg['Subject'] = subject
|
|
msg['Date'] = email.utils.formatdate(localtime=True)
|
|
|
|
msg.attach(MIMEText(body))
|
|
self.log.info(msg.as_string())
|
|
smtp_server.sendmail(msg['From'],msg['To'],msg.as_string())
|
|
await evt.respond('Mail envoyé')
|
|
except Exception as e:
|
|
self.log.error(str(e))
|
|
await evt.respond('Erreur envoi mail')
|
|
await evt.respond("<p>!mail Object<br />Corps du message<p>", allow_html=True)
|
|
|
|
@classmethod
|
|
def get_config_class(cls) -> Type[BaseProxyConfig]:
|
|
return Config
|