#!/usr/bin/python3 # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # import smtplib import ssl from typing import Any, Dict, List, Optional from click.core import Context try: import jinja2 except ModuleNotFoundError: exit("Jinja2 is a required dependency for this script") try: import click except ModuleNotFoundError: exit("Click is a required dependency for this script") SMTP_PORT = 587 SMTP_SERVER = "mail-relay.apache.org" PROJECT_NAME = "Superset" PROJECT_MODULE = "superset" PROJECT_DESCRIPTION = "Apache Superset is a modern, enterprise-ready business intelligence web application" def string_comma_to_list(message: str) -> List[str]: if not message: return [] return [element.strip() for element in message.split(",")] def send_email( smtp_server: str, smpt_port: int, username: str, password: str, sender_email: str, receiver_email: str, message: str, ) -> None: """ Send a simple text email (SMTP) """ context = ssl.create_default_context() with smtplib.SMTP(smtp_server, smpt_port) as server: server.starttls(context=context) server.login(username, password) server.sendmail(sender_email, receiver_email, message) def render_template(template_file: str, **kwargs: Any) -> str: """ Simple render template based on named parameters :param template_file: The template file location :kwargs: Named parameters to use when rendering the template :return: Rendered template """ template = jinja2.Template(open(template_file).read()) return template.render(kwargs) def inter_send_email( username: str, password: str, sender_email: str, receiver_email: str, message: str ) -> None: print("--------------------------") print("SMTP Message") print("--------------------------") print(message) print("--------------------------") confirm = input("Is the Email message ok? (yes/no): ") if confirm not in ("Yes", "yes", "y"): exit("Exit by user request") try: send_email( SMTP_SERVER, SMTP_PORT, username, password, sender_email, receiver_email, message, ) print("Email sent successfully") except smtplib.SMTPAuthenticationError: exit("SMTP User authentication error, Email not sent!") except Exception as e: exit(f"SMTP exception {e}") class BaseParameters(object): def __init__( self, email: str, username: str, password: str, version: str, version_rc: str, ) -> None: self.email = email self.username = username self.password = password self.version = version self.version_rc = version_rc self.template_arguments: Dict[str, Any] = {} def __repr__(self) -> str: return f"Apache Credentials: {self.email}/{self.username}/{self.version}/{self.version_rc}" @click.group() @click.pass_context @click.option( "--apache_email", prompt="Apache Email", help="Your Apache email this will be used for SMTP From", ) @click.option( "--apache_username", prompt="Apache username", help="Your LDAP Apache username" ) @click.option( "--apache_password", prompt="Apache password", hide_input=True, help="Your LDAP Apache password", ) @click.option("--version", envvar="SUPERSET_VERSION") @click.option("--version_rc", envvar="SUPERSET_VERSION_RC") def cli( ctx: Context, apache_email: str, apache_username: str, apache_password: str, version: str, version_rc: str, ) -> None: """Welcome to releasing send email CLI interface!""" base_parameters = BaseParameters( apache_email, apache_username, apache_password, version, version_rc ) base_parameters.template_arguments["project_name"] = PROJECT_NAME base_parameters.template_arguments["project_module"] = PROJECT_MODULE base_parameters.template_arguments["project_description"] = PROJECT_DESCRIPTION base_parameters.template_arguments["version"] = base_parameters.version base_parameters.template_arguments["version_rc"] = base_parameters.version_rc base_parameters.template_arguments["sender_email"] = base_parameters.email ctx.obj = base_parameters @cli.command("vote_pmc") @click.option( "--receiver_email", default="dev@superset.apache.org", type=str, prompt="The receiver email (To:)", ) @click.pass_obj def vote_pmc(base_parameters: BaseParameters, receiver_email: str) -> None: template_file = "email_templates/vote_pmc.j2" base_parameters.template_arguments["receiver_email"] = receiver_email message = render_template(template_file, **base_parameters.template_arguments) inter_send_email( base_parameters.username, base_parameters.password, base_parameters.template_arguments["sender_email"], base_parameters.template_arguments["receiver_email"], message, ) @cli.command("result_pmc") @click.option( "--receiver_email", default="dev@superset.apache.org", type=str, prompt="The receiver email (To:)", ) @click.option( "--vote_bindings", default="", type=str, prompt="A List of people with +1 binding vote (ex: Max,Grace,Krist)", ) @click.option( "--vote_nonbindings", default="", type=str, prompt="A List of people with +1 non binding vote (ex: Ville)", ) @click.option( "--vote_negatives", default="", type=str, prompt="A List of people with -1 vote (ex: John)", ) @click.option( "--vote_thread", default="", type=str, prompt="Permalink to the vote thread " "(see https://lists.apache.org/list.html?dev@superset.apache.org)", ) @click.pass_obj def result_pmc( base_parameters: BaseParameters, receiver_email: str, vote_bindings: str, vote_nonbindings: str, vote_negatives: str, vote_thread: str, ) -> None: template_file = "email_templates/result_pmc.j2" base_parameters.template_arguments["receiver_email"] = receiver_email base_parameters.template_arguments["vote_bindings"] = string_comma_to_list( vote_bindings ) base_parameters.template_arguments["vote_nonbindings"] = string_comma_to_list( vote_nonbindings ) base_parameters.template_arguments["vote_negatives"] = string_comma_to_list( vote_negatives ) base_parameters.template_arguments["vote_thread"] = vote_thread message = render_template(template_file, **base_parameters.template_arguments) inter_send_email( base_parameters.username, base_parameters.password, base_parameters.template_arguments["sender_email"], base_parameters.template_arguments["receiver_email"], message, ) @cli.command("announce") @click.option( "--receiver_email", default="dev@superset.apache.org", type=str, prompt="The receiver email (To:)", ) @click.pass_obj def announce(base_parameters: BaseParameters, receiver_email: str) -> None: template_file = "email_templates/announce.j2" base_parameters.template_arguments["receiver_email"] = receiver_email message = render_template(template_file, **base_parameters.template_arguments) inter_send_email( base_parameters.username, base_parameters.password, base_parameters.template_arguments["sender_email"], base_parameters.template_arguments["receiver_email"], message, ) cli()