Can setup SMTP inside python itself but for better protection, setup sendmail with SMTP as in other post and then:
More focused module :
def send_mail(email, subject, body="", dataframe_dict = {}):
html_content = ""
for name, df in dataframe_dict.items():
html_content += f"<h3>{name}</h3>"
html_content += df.to_html(escape=False, classes='table table-striped', table_id='dataframe')
html_content += "<br><br>"
styled_html = f"""
<html>
<body>
{body}
<br><br><br><br>
{html_content}
</body>
</html>
"""
# Send HTML email using mail command
process = subprocess.Popen(
['mail', '-s', subject, '-a', 'Content-Type: text/html', email],
stdin=subprocess.PIPE,
text=True
)
process.communicate(input=styled_html)
print(f"Email sent to {email}.")
Or generic script:
import subprocess
import os
import argparse
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
def send_file_as_email(file_path, to, subject):
"""Sends an HTML file as the email body and also as an attachment."""
# If subject is None, use the base file name
if subject is None:
subject = os.path.basename(file_path)
# Create the email with mixed content (text + attachments)
message = MIMEMultipart("mixed")
message["Subject"] = subject
message["To"] = to
# Read HTML content and attach as email body
with open(file_path, "r") as file:
html_content = file.read().strip()
html_body = MIMEText(html_content, "html")
message.attach(html_body)
# Attach the file as an attachment
with open(file_path, "rb") as file:
attachment = MIMEBase("application", "octet-stream")
attachment.set_payload(file.read())
# Encode to base64
encoders.encode_base64(attachment)
attachment.add_header("Content-Disposition", f'attachment; filename="{os.path.basename(file_path)}"')
message.attach(attachment)
# Send email using sendmail
process = subprocess.Popen(["/usr/sbin/sendmail", "-t", "-i"], stdin=subprocess.PIPE)
process.communicate(message.as_bytes())
print("Email sent successfully!")
def main():
"""Parses command-line arguments and sends an email."""
parser = argparse.ArgumentParser(description="Send an HTML file as an email body & attachment.")
parser.add_argument("-f", "--file", required=True, help="Path to the HTML file")
parser.add_argument("-t", "--to", default="harshal.patil@firl.com", help="Recipient email address (default: harshal.patil@firm.com)")
parser.add_argument("-s", "--subject", default=None, help="Email subject (default: file name)")
args = parser.parse_args()
send_file_as_email(args.file, args.to, args.subject)
if __name__ == "__main__":
main()