import argparse import secrets import smtplib import string import subprocess from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText def generate_password(length: int) -> str: alphabet = string.ascii_letters + string.digits password = "".join(secrets.choice(alphabet) for i in range(length)) return password def send_email( sender_email, receiver_email, subject, message, smtp_username, smtp_password, ): # Create a multipart message msg = MIMEMultipart() msg["From"] = sender_email msg["To"] = receiver_email msg["Subject"] = subject # Add body to the email msg.attach(MIMEText(message, "plain")) try: # Create a secure SSL/TLS connection to the SMTP server server = smtplib.SMTP("localhost", 25) server.ehlo() server.starttls() server.ehlo() # Login to the SMTP server server.login(smtp_username, smtp_password) # Send the email server.sendmail(sender_email, receiver_email, msg.as_string()) # Close the SMTP connection server.quit() print("Email sent successfully!") except Exception as e: print("Failed to send email. Error:", str(e)) def create_user( name: str, email: str, mail_text: str, mail_user: str, mail_password: str, dry_run: bool = False, ): username = name.split()[0].lower() + "." + name.split()[1].lower()[0] password = generate_password(20) cmd = [ "yunohost", "user", "create", username, "--password", password, ] if dry_run: print(" ".join(cmd)) else: result = subprocess.run(cmd) result.check_returncode() cmd = [ "yunohost", "user", "update", username, "--add-mailforward", email, ] if dry_run: print(" ".join(cmd)) else: result = subprocess.run(cmd) result.check_returncode() mail_text = mail_text.replace("{name}", name) mail_text = mail_text.replace("{username}", username) mail_text = mail_text.replace("{password}", password) if dry_run: print(mail_text) else: send_email( f"{mail_user}@cloud.allmende-gufi.de", email, "Dein Zugang zur neuen Allmende Cloud", mail_text, mail_user, mail_password, ) if __name__ == "__main__": parser = argparse.ArgumentParser( description="Creates Yunohost user from a csv file and sends them an email with the password", ) parser.add_argument("filename", help="Input file name") parser.add_argument( "mail_user", help="This user will be used to send the confirmation mail" ) parser.add_argument( "mail_password", help="This password will be used to send the confirmation mail" ) parser.add_argument("--dry-run", action="store_true") args = parser.parse_args() with open(args.filename, "r") as f: data = f.readlines() with open("./email.txt", "r") as f: email_text = f.read() for line in data: create_user( *line.strip().split(","), mail_text=email_text, mail_user=args.mail_user, mail_password=args.mail_password, dry_run=args.dry_run, )