SujataNarayana's avatar
SujataNarayana
Microsoft Employee
1 year ago

Dynamic email notifications

You can trigger dynamic notifications to raise awareness or promote a call to action.

 

In this example report, changing an offer status to ‘Accepted’ will automatically send a dynamic marketing email to the partner company’s point of contact.

 

 

Here is the Python code for the user data function that powers this scenario: 

import fabric.functions as fn
import logging
import requests
from flask import Flask
from flask_mail import Mail, Message

udf = fn.UserDataFunctions()
app = Flask(__name__) 
mail = Mail(app) # instantiate the mail class 

# configuration of mail 
app.config['MAIL_SERVER']='smtp.sendgrid.net'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USERNAME'] = 'apikey'
app.config['MAIL_PASSWORD'] = '<your API key here>'
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_DEFAULT_SENDER'] = '<your email here>'
mail = Mail(app) 

html_email = """ <Your HTML email here>
"""

@udf.connection(argName="sqlDB",alias="Translytical")
@udf.function()

def get_data_write_to_sql_db_send_email(sqlDB: fn.FabricSqlConnection, company: str, status: str, date:str, comment: str) -> str:
    logging.info('Python UDF trigger function processed a request.')    

    # Error handling for no status selected or no company input
    if(status=="" or len(status) < 1):
        raise fn.UserThrownError("The status isn't valid.", {"status:": status})

    if(company=="" or len(company) < 1):
        raise fn.UserThrownError("The company isn't valid.", {"company:": company})          
    
    #Call External API to get Company contact information
    url = "https://dummy-json.mock.beeceptor.com/users"
    response = requests.get(url)

    if response.status_code == 200:
        Jsondata = response.json()

        for i in Jsondata:
            #Check if company contact is registered in the external system
            if i['company'] == company:

                # Combine timestamp with comment
                comment_value = date + " - " + comment

                # Get customer contact and put in format based on if updating an record or adding new record
                Existing_Partner_data = (i['name'], i['username'], i['email'], i['address'], i['zip'], i['state'], i['country'], i['phone'], status, comment_value, company)
                New_Partner_data = (i['name'], company, i['username'], i['email'], i['address'], i['zip'], i['state'], i['country'], i['phone'], status, comment_value)

                # Establish a connection to the SQL database
                connection = sqlDB.connect()
                cursor = connection.cursor()

                #Check if there is a status record for the company 
                SQL_read_Command = "SELECT * FROM [dbo].[CompanyStatus] WHERE Company = ?"
                cursor.execute(SQL_read_Command, company)
                if cursor.fetchone():
                    #if there is a status record for the company, update the status and contact info
                    SQL_update_command = "UPDATE [dbo].[CompanyStatus] SET [Name] = ?, [Username] = ?, [Email] = ?, [Address] = ?, [Zip] = ?, [State] = ?, [Country] = ?, [Phone] = ?, [Status] = ?, [Comment] =  ? WHERE [Company] = ?;"
                    cursor.execute(SQL_update_command, Existing_Partner_data)
                    
                else:
                    #if there is not a status record for the company, add new record
                    SQL_insert_command = "INSERT INTO [dbo].[CompanyStatus](Name, Company, Username, Email, Address, Zip, State, Country, Phone, Status, Comment) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"
                    cursor.execute(SQL_insert_command, New_Partner_data)
            
                # Commit the transaction
                connection.commit()

                # Close the connection
                cursor.close()
                connection.close()
                
                #If status is set to accepted, send an email to company contact
                #Note: this is hard-coded to a temp working email for demo purposes
                if(status == "Accepted"):
                  with app.app_context():
                      msg = Message (company + " x Contoso collab time!",
                                      recipients = ['<Email here>'] #I put a static temp email here but you can make this dynamic
                                  )
                      msg.html = html_email
                      mail.send(msg)
                      return "Accepted collab offer with " + company + ", and " + i['name'] + " will be notified shortly."

                return "Collab with " + company + " is now " + status.lower() + "."

        #if reached here in the code, then the company contact is NOT registered in the external system, throw error   
        raise fn.UserThrownError("The company is not a registered partner.", {"company:": company})

 

Feel free to use this code as inspiration for your own dynamic notification scenario!

No RepliesBe the first to reply