Skip to content

ScriptWizards.Net Posts

How to Send HTML Emails with Python

Python Logo

Python provides libraries like smtplib and email that make it relatively straightforward to compose and send HTML emails. In this guide, we’ll walk through the process step by step, including code examples and explanations.

Set up your SMTP server credentials

Before sending emails via Python, you’ll need to have access to an SMTP (Simple Mail Transfer Protocol) server. This could be your company’s email server, a third-party service like Gmail, or any other SMTP server that you have permission to use. You’ll need the server address, port, and your login credentials (username and password) for authentication.

Install required libraries:

Make sure you have the necessary Python libraries installed. You’ll need smtplib for sending emails and email for composing the email message.

You can install these libraries using pip:

pip install secure-smtplib
pip install emails

Compose the HTML email:

Create the HTML content for your email. You can use any HTML editor or simply write the HTML code directly in your Python script. Here’s a basic example:

html_content = """
<html>
<head></head>
<body>
    <h1>Hello!</h1>
    <p>This is a <strong>test email</strong> sent using Python.</p>
</body>
</html>
"""

Create the email message:

Use the email.message.EmailMessage class to create your email message. Set the From, To, Subject, and Content-Type headers appropriately.

import email.message
 
msg = email.message.EmailMessage()
msg["From"] = "your_email@example.com"
msg["To"] = "recipient@example.com"
msg["Subject"] = "ScriptWizards.net Test HTML Email"
msg.set_content(html_content, subtype="html")

Connect to the SMTP server and send the email:

Now, you’ll establish a connection to the SMTP server and send the email using the smtplib library. Replace "smtp.example.com" with your SMTP server address and "your_username" and "your_password" with your login credentials.

import smtplib
 
with smtplib.SMTP("smtp.example.com", 587) as server:
    server.starttls()
    server.login("your_username", "your_password")
    server.send_message(msg)

Full code example

Here’s the full code combining all the steps:

import smtplib
import email.message
 
# HTML content for the email
html_content = """
<html>
<head></head>
<body>
    <h1>Hello!</h1>
    <p>This is a email from <strong>ScriptWizards.Net</strong> sent using Python.</p>
</body>
</html>
"""
 
# Create the email message
msg = email.message.EmailMessage()
msg["From"] = "your_email@example.com"
msg["To"] = "recipient@example.com"
msg["Subject"] = "ScriptWizards.net Test HTML Email"
msg.set_content(html_content, subtype="html")
 
# Connect to the SMTP server and send the email
with smtplib.SMTP("smtp.example.com", 587) as server:
    server.starttls()
    server.login("your_username", "your_password")
    server.send_message(msg)

Conclusion

By following these steps, you can easily send HTML emails programmatically using Python. Whether you’re sending newsletters, marketing campaigns, or personalized notifications, Python provides the tools you need to automate the process and engage with your audience effectively. Remember to handle sensitive information like passwords securely and adhere to email sending best practices to avoid being flagged as spam.

PowerShell $ErrorActionPreference Explained

In PowerShell, the $ErrorActionPreference variable controls how PowerShell responds to non-terminating errors. It determines the default behaviour when an error occurs within a script or command. Understanding the different options of $ErrorActionPreference is crucial for effective error handling.

Here are the different options and what each does:

  • Continue: This is the default value. When an error occurs, PowerShell displays the error message but continues executing the remaining commands in the script. It does not halt the script execution.
  • SilentlyContinue: PowerShell suppresses the error message and continues executing the script as if no error occurred. It does not display any error messages to the user. This option is useful when you want to handle errors programmatically without interrupting the script flow.
  • Stop: When an error occurs, PowerShell displays the error message and stops executing the script. It terminates the script execution immediately after encountering the error. This behaviour is useful when you want to ensure that any error is addressed before proceeding further.
  • Inquire: PowerShell prompts the user to choose whether to continue executing the script or not when an error occurs. This option allows for interactive error handling, where the user can decide how to proceed based on the error message.
  • Ignore: PowerShell ignores the error completely and continues executing the script without displaying the error message. It treats the error as if it didn’t occur. This option is not recommended for most scenarios as it can lead to unexpected behaviour and potential data loss.

To modify the $ErrorActionPreference variable, you can assign one of the above values to it. For example:

$ErrorActionPreference = "Stop"

This sets the error action preference to “Stop”, meaning PowerShell will halt script execution upon encountering an error.

You can also scope the $ErrorActionPreference variable to specific parts of your script using the Scope parameter:

$ErrorActionPreference = "Stop" -Scope Script

This sets the error action preference to “Stop” only within the current script scope.

By understanding and appropriately setting the $ErrorActionPreference, you can control how PowerShell handles errors within your scripts, ensuring they behave as expected and provide a better user experience.


Recommended Reading: Understanding Try/Catch Error Handling in PowerShell

Understanding Try/Catch Error Handling in PowerShell

PowerShell Logo

Error handling is a critical aspect of writing robust and reliable scripts in PowerShell. The try/catch statement is a powerful mechanism that allows you to gracefully handle errors that may occur during script execution. In this article, we’ll delve into how try/catch error handling works in PowerShell, explore various scenarios, and provide examples to illustrate its usage.

How Try/Catch Works

The try/catch statement in PowerShell allows you to monitor a block of code for errors.

Here’s how it works:

  • The code within the try block is executed.
  • If an error occurs within the try block, PowerShell immediately jumps to the catch block.
  • Inside the catch block, you can handle the error gracefully, log it, or take appropriate action.

Syntax:

try {
# Code block to monitor for errors
}
catch {
# Error handling code
}

Handling Specific Exceptions:

try {
    $result = 10 / 0  # Attempting to divide by zero
}
catch [System.DivideByZeroException] {
    Write-Host "Cannot divide by zero."
}
catch {
    Write-Host "An unexpected error occurred: $_"
}

In this example, the catch block specifically handles the DivideByZeroException. If any other type of exception occurs, it falls back to the generic catch block.

Handling Multiple Exceptions:

try {
    $file = Get-Content "nonexistentfile.txt"  # Attempting to read a nonexistent file
}
catch [System.IO.FileNotFoundException] {
    Write-Host "File not found: $($Error[0].Exception.Message)"
}
catch [System.UnauthorizedAccessException] {
    Write-Host "Access denied: $($Error[0].Exception.Message)"
}
catch {
    Write-Host "An unexpected error occurred: $_"
}

Here, the catch blocks handle different types of exceptions that may occur while attempting to read a file.

Using Finally Block:

try {
    # Code that may throw an error
}
catch {
    # Error handling code
}
finally {
    # Cleanup code that always executes, regardless of errors
}

The finally block is optional and executes whether an error occurs or not. It’s typically used for clean-up tasks such as closing files or releasing resources.

Scenarios for Error Handling

  • Network Operations: Handling timeouts or connection failures when making network requests.
  • File Operations: Dealing with file not found, access denied, or permission issues.
  • Database Operations: Managing errors when querying databases or executing SQL commands.
  • External Commands: Handling errors from external executables called within PowerShell scripts.
  • Input Validation: Validating user input and handling errors caused by invalid data.

Conclusion

The try/catch statement in PowerShell provides a structured and reliable way to handle errors in scripts. By anticipating potential issues and implementing appropriate error handling logic, you can make your scripts more robust and resilient to failures. Understanding how to use try/catch effectively empowers you to write PowerShell scripts that gracefully handle errors and maintain stability in various scenarios.


Recommended Reading: Top 20 Common PowerShell Exceptions

How to Connect to vCenter with PowerCLI

PowerCLI, VMware’s PowerShell module, is a powerful tool for managing and automating VMware environments. With PowerCLI, you can perform a wide range of tasks, from simple VM management to complex automation workflows. One of the fundamental tasks is connecting to vCenter Server, which allows you to access and manage your VMware infrastructure programmatically. In this guide, we’ll walk through the process of connecting to vCenter using PowerCLI:

Prerequisites

Before we begin, ensure you have the VMware PowerCLI module installed on your system. You can install it via PowerShell by running:

    Install-Module -Name VMware.PowerCLI -Scope CurrentUser
    
    

      Connecting to vCenter Server:

      Once the module is imported, you can use the Connect-VIServer cmdlet to establish a connection to your vCenter Server. Replace vcenter.example.com with the hostname or IP address of your vCenter Server.

      Connect-VIServer -Server vcenter.example.com
      
      

      Provide Credentials:

      You will be prompted to enter your credentials. Alternatively, you can pass the credentials directly using the -User and -Password parameters.

      Connect-VIServer -Server vcenter.example.com -User "YourUsername" -Password "YourPassword"
      
      

      Code Example:

      This example code utilises what we have discussed above to connect to vCenter. The script then get a list of all Virtual Machines and exports them to a .csv file in the C:\Temp\ directory:

      # Import the PowerCLI Module
      Import-Module VMware.PowerCLI
       
      # Define vCenter Server details
      $vCenterServer = "vcenter.example.com"
      $Username = "YourUsername"
      $Password = "YourPassword"
       
      # Connect to vCenter Server
      try {
          Connect-VIServer -Server $vCenterServer -User $Username -Password $Password -ErrorAction Stop
          Write-Host "Connected to vCenter Server successfully."
      }
      catch {
          Write-Host "Failed to connect to vCenter Server: $($_.Exception.Message)" -ForegroundColor Red
          exit
      }
       
      # List all VMs and export to CSV
      try {
          $VMs = Get-VM
          $VMs | Export-Csv -Path "C:\Temp\VM_List.csv" -NoTypeInformation
          Write-Host "VM list exported to VM_List.csv."
      }
      catch {
          Write-Host "Error occurred while retrieving VMs: $($_.Exception.Message)" -ForegroundColor Red
      }
      finally {
          # Disconnect from vCenter Server
          Disconnect-VIServer -Server $vCenterServer -Confirm:$false
      }
      
      

        Note: It is good practise to disconnect from vCenter once you have finished. You can disconnect from vCenter using Disconnect-VIServer


        • Import-Module VMware.PowerCLI: Imports the PowerCLI module into the current PowerShell session.
        • Connect-VIServer: Establishes a connection to the specified vCenter Server.
        • -Server: Specifies the hostname or IP address of the vCenter Server.
        • -User and -Password: Provide the username and password for authentication.
        • Get-VM: Retrieves a list of all virtual machines managed by the vCenter Server.
        • Export-Csv: Exports the VM list to a CSV file named “VM_List.csv” without including the object type information.
        • Disconnect-VIServer: Terminates the connection to the vCenter Server.

        By following these steps and using the provided code examples, you can easily connect to your vCenter Server using PowerCLI and perform various management tasks efficiently.

        Featured Post

        * Script Wizards *

        Welcome, young sorcerers of the digital realm, to the sacred halls of ScriptWizards.Net! I am but a humble Script Wizard, a sage of the scripting arts, who has traversed the vast expanses of time and space delving into the arcane mysteries of programming. Within these digital scrolls, you shall find the eldritch secrets of PowerShell & Python, the ancient languages of automation, woven with threads of magic and logic.

        © 2024 ScriptWizards.net - Powered by Coffee & Magic