Anbarasu Subramaniyan
Anbarasu Subramaniyan

Reputation: 183

How do I send email from an Azure function app?

I have running Azure function App(in python language), for business requirements need to send emails from function app.

for that, I wrote a python function

from email.message import EmailMessage
import smtplib

def send_mail():
    # message to be sent
    msg = EmailMessage()
    msg.set_content('Test content')

    msg['Subject'] = 'Test'
    msg['From'] = "[email protected]"
    msg['To'] = ["[email protected]"]

    # creates SMTP session 
    s = smtplib.SMTP('smtp-mail.outlook.com', 587) 
    s.ehlo()

    # start TLS for security 
    s.starttls() 
    # Authentication 
    s.login("[email protected]", "password-to-login") 
      
    # sending the mail 
    s.send_message(msg)
    
    # terminating the session 
    s.quit() 

    return

Above block of code working fine in local machine. if I move the same code to Azure Function App it's not working.

How do I make it work on the Azure function app?

How do I send email from Gmail in Azure Function App?

Upvotes: 7

Views: 54152

Answers (4)

Kashyap
Kashyap

Reputation: 17441

There is a hack that I'm about to implement. In my case I don't really care about the subject, attachments etc. It's an information email.

  • Add a log message in your code with email body in a parsable form.
  • Create a log based alert rule matching the log.

When Azure Monitor sees this log, it'll send an alert to the email address(es) configured in the alert. Email can include contents of log message.

As mentioned this is very restrictive:

  • can't fully control subject line
  • can't control the recipients programatically (easily at least)
  • can't attach files

Upvotes: 4

Joseph Astrahan
Joseph Astrahan

Reputation: 9072

Below is the actual procedure for getting sendgrid working manually with python for azure functions. This is not the optimal way since azure has it's own in house solution that may be superior to this, but this is a quick and dirty way to get it working.

run pip install sendgrid on your local machine.

In your code include:

from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail

Sending The Email: (keep in mind this is NOT SECURE since the API Key is Exposed, but this is quick way to get something working.)

    message = Mail(
        from_email='[email protected]',
        to_emails='[email protected]',
        subject='Email Subject Line Here',
        html_content='<strong>HTML CONTENT HERE</strong>')
    try:
        sg = SendGridAPIClient('YOUR API KEY HERE')
        response = sg.send(message)
        print(response.status_code)
        print(response.body)
        print(response.headers)
    except Exception as e:
        raise Exception(str(e) + ' -> Error Reported')

The last step is if you want this to work on the actual azure function server you need to add this to requirements.txt

sendgrid

Note that sendgrid is free up to 25,000 emails so it works perfect for most situations. You just need to setup your API key on there website, just follow their instructions, it was simple for me to do and took about 5 minutes to create a 'user' and an API key associated with it.

Also note that I was able to send from my GMAIL account when I did this with sendgrid. HOWEVER, also note that it will go to your spam folder constantly because google can never truly verify it was you who sent from your gmail, so just keep this flaw in mind. In my case since I'm doing just testing work this doesn't matter, but it may be a problem for production work.

Upvotes: 1

DixitArora-MSFT
DixitArora-MSFT

Reputation: 1811

Sending outbound e-mail to external domains (such as outlook.com, gmail.com, etc) directly from an e-mail server hosted in Azure compute services is not supported due to the elastic nature of public cloud service IPs and the potential for abuse.  As such, the Azure compute IP address blocks are added to public block lists (such as the Spamhaus PBL).  There are no exceptions to this policy.

Since we do not support running and smtp server from our platform this should not affect us.

The only way to use EMAIL functionality as of now on Azure Web App is via an SMTP relay. A third party service such as SendGrid provides these type of services.

In the Azure Web Apps architecture the actual Web Apps sit behind common Front-Ends which are shared by all the sites hosted on that Data Centre.

There is a possibility that one of the site hosted on that datacenter is sending SPAM emails and this could have the IP address to be blacklisted by the MAIL Servers. So the e-mails sent from that address will be rejected or considered as SPAM by mail servers.   This limitation exists in case of VM or Cloud Services too. Azure uses a pool of IP Address, and these addresses are reused. That means you could get an IP Address which has already been blacklisted, as someone was sending SPAM from that address before and hence your emails would be rejected or considered as SPAM by mail servers.

This is a common scenario in Cloud and it is typically recommended to use an external Mail Service provider like SendGrid for messaging.   SendGrid related articles: 

How to Send Email Using SendGrid with Azure: https://azure.microsoft.com/en-in/documentation/articles/sendgrid-dotnet-how-to-send-email/

Upvotes: 22

Sajeetharan
Sajeetharan

Reputation: 222582

I would suggest you to use some 3rd party email service such as SendGrid/Twillio You can add SendGrid output binding to you Python Azure Function. The binding in function.json would look something like here

Here is an example

Upvotes: 3

Related Questions