Send Email And Receive Email By Raspberry Python
On Raspberry Pi we very easy to access Gmail email and use IMAP protocol for sending & receving email.
Then follow bellow step:
Then follow bellow step:
Step1: Install SSMTP
sudo apt-get install ssmtp mailutils mpack
Step2: Edit ssmtp.conf
file
sudo nano /etc/ssmtp/ssmtp.conf
mailhub=smtp.gmail.com:587
hostname=ENTER YOUR RPI'S HOST NAME HERE
AuthUser=YOU@gmail.com
AuthPass=PASSWORD
useSTARTTLS=YES
Step3:Sending email source code
Step3:Sending email source code
#-----------METHOD
1--------------------------------
import smtplib
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login("YOUR EMAIL ADDRESS", "YOUR PASSWORD")
msg = "YOUR MESSAGE!"
server.sendmail("YOUR EMAIL ADDRESS", "THE EMAIL ADDRESS TO SEND
TO", msg)
server.quit()
#-----------METHOD
2---------------------------
import
smtplib
from
email.MIMEMultipart
import
MIMEMultipart
from
email.MIMEText
import
MIMEText
fromaddr
=
"YOUR
ADDRESS"
toaddr
=
"ADDRESS
YOU WANT TO SEND TO"
msg
=
MIMEMultipart()
msg['From']
=
fromaddr
msg['To']
=
toaddr
msg['Subject']
=
"SUBJECT
OF THE MAIL"
body
=
"YOUR
MESSAGE HERE"
msg.attach(MIMEText(body,
'plain'))
server
=
smtplib.SMTP('smtp.gmail.com',
587)
server.starttls()
server.login(fromaddr,
"YOUR
PASSWORD")
text
=
msg.as_string()
server.sendmail(fromaddr,
toaddr,
text)
server.quit()
#--------------METHOD3-------SEND EMAIL WITH ATTACH FILE--------------------------------------
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEBase import MIMEBase
from email import encoders
fromaddr = "YOUR EMAIL"
toaddr = "EMAIL ADDRESS YOU SEND
TO"
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "SUBJECT OF THE EMAIL"
body = "TEXT YOU WANT TO SEND"
msg.attach(MIMEText(body, 'plain'))
filename = "NAME OF THE FILE WITH ITS
EXTENSION"
attachment = open("PATH OF THE FILE", "rb")
part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename=
%s" % filename)
msg.attach(part)
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(fromaddr, "YOUR PASSWORD")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
Step4: Receive email code
import
imaplib
import email
import time
def checkEmail():
mail = imaplib.IMAP4_SSL('imap.gmail.com');
mail.login('raspberrypi_emailid@gmail.com','raspberrypi_password');
mail.list(); # Gives list of folders or labels in gmail.
count = 0
while count < 6:
try:
# Connect to inbox
mail.select("inbox");
# Search for an unread email from user's email address
result, data = mail.search(None,'(UNSEEN FROM "my_email_id@gmail.com")');
ids = data[0] # data is a list
id_list = ids.split() # ids is a space separated string
latest_email_id = id_list[-1] # get the latest
result, data = mail.fetch(latest_email_id, "(RFC822)");
raw_email = data[0][1];
recv_msg = email.message_from_string(raw_email)
if(recv_msg['Subject'] == "Allow person"):
print("The person has been granted access. Hurray!!!")
else:
print("ACCESS DENIED!!!")
count = 6
except IndexError:
time.sleep(30*1)
if count < 5:
count = count + 1
continue
else:
print("Sorry,No reply in the last 3 minutes.")
count = 6
checkEmail()
//ADDITIONAL INSTRUCTION
import email
import time
def checkEmail():
mail = imaplib.IMAP4_SSL('imap.gmail.com');
mail.login('raspberrypi_emailid@gmail.com','raspberrypi_password');
mail.list(); # Gives list of folders or labels in gmail.
count = 0
while count < 6:
try:
# Connect to inbox
mail.select("inbox");
# Search for an unread email from user's email address
result, data = mail.search(None,'(UNSEEN FROM "my_email_id@gmail.com")');
ids = data[0] # data is a list
id_list = ids.split() # ids is a space separated string
latest_email_id = id_list[-1] # get the latest
result, data = mail.fetch(latest_email_id, "(RFC822)");
raw_email = data[0][1];
recv_msg = email.message_from_string(raw_email)
if(recv_msg['Subject'] == "Allow person"):
print("The person has been granted access. Hurray!!!")
else:
print("ACCESS DENIED!!!")
count = 6
except IndexError:
time.sleep(30*1)
if count < 5:
count = count + 1
continue
else:
print("Sorry,No reply in the last 3 minutes.")
count = 6
checkEmail()
//ADDITIONAL INSTRUCTION
Send Email with a Raspberry Pi
Sending email with a Raspberry Pi Python program can be very useful when you want an alert, to receive a set of results or find out if a set of conditions have been reached among other things. To achieve this we need to create a python script that uses the smtplib native library. Through this I will show you how to create a simple email right through to a more complete email with subject lines, attachments, extended body text and the ability to send to multiple recipients,to achieve more than a simple email we will need in include some additional modules, email.mime.multipart and email.mime.text.
To run the python script on the Pi I am assuming that you have the latest version of Raspian and have the ability to connect to your Pi either through SSH with putty and FTP with filezilla, or directly with a keyboard and monitor, if you haven’t set-up your Pi yet then check out my getting started section. The code below should work on both python 2.7 and python 3.2 that are used on the Pi.
A further consideration is your internet connection security, given that the scripts below will contain your email address and password in the code it may be wise to consider getting another gmail address or similar just for the purpose of sending automated emails rather than using your normal day to day address and risking it being compromised.
Simple Email:
Warning: Due to Google using oauth 2.0 security normally a 2 stage check is required to access the server, this can be overcome by allowing less secure apps on your account
To send a simple email with no subject line we can use the following code
#!/usr/bin/env python
import smtplib
server = smtplib.SMTP(‘smtp.gmail.com’, 587)
server.starttls()
server.login(“FromUser@gmail.com“, “FromUserPassword“)
msg = “This is a simple email test!”
server.sendmail(“FromUser@gmail.com“, “ToUser@gmail.com“, msg)
server.quit()
server.starttls()
server.login(“FromUser@gmail.com“, “FromUserPassword“)
msg = “This is a simple email test!”
server.sendmail(“FromUser@gmail.com“, “ToUser@gmail.com“, msg)
server.quit()
Note: In this example I am using the gmail smtp server, if you are sending from an outlook or yahoo address replace smtp.gmail.com with one of the following:
smtp-mail.outlook.com
smtp.mail.yahoo.com
Replace the entries highlighted in blue with your email address and password and the intended recipient. The msg=” ” is the mesage that will be contained in the body of your email.
Email with a Subject Line:
While a simple email may suffice as an alert just to yourself if you intend the email to look slightly more professional then including a subject line may be important.
#!/usr/bin/env python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.text import MIMEText
fromaddr = “FromUser@gmail.com”
toaddr = “ToUser@gmail.com”
toaddr = “ToUser@gmail.com”
msg = MIMEMultipart()
msg[‘From’] = fromaddr
msg[‘To’] = toaddr
msg[‘Subject’] = “Test Alert”
body = ‘This is an extended email test’
msg.attach(MIMEText(body, ‘plain’))
msg[‘From’] = fromaddr
msg[‘To’] = toaddr
msg[‘Subject’] = “Test Alert”
body = ‘This is an extended email test’
msg.attach(MIMEText(body, ‘plain’))
server = smtplib.SMTP(‘smtp.gmail.com’, 587)
server.ehlo
server.starttls()
server.login(fromaddr, “FromUserPassword“)
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
server.ehlo
server.starttls()
server.login(fromaddr, “FromUserPassword“)
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
Again in this example you just need to enter your details in the blue highlighted entries in the relevant spots in the script, In this case the message in the body of the email is entered in the body=” ” section. The subject line of your email will contain your entry in the msg [‘Subject’] = ” ”
Email with an Attachment:
To take it one step further if you want to include an attachment with your email the following code can be used.
#!/usr/bin/env python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
fromaddr = “FromUser@gmail.com”
toaddr = “ToUser@gmail.com”
toaddr = “ToUser@gmail.com”
msg = MIMEMultipart()
msg[‘From’] = fromaddr
msg[‘To’] = toaddr
msg[‘Subject’] = “Test Alert”body = ‘This is an extended email test’
msg.attach(MIMEText(body, ‘plain’))
msg[‘From’] = fromaddr
msg[‘To’] = toaddr
msg[‘Subject’] = “Test Alert”body = ‘This is an extended email test’
msg.attach(MIMEText(body, ‘plain’))
filename = “AttachmentFileWithExt”
attachment = open(“FullPathToFile“, “rb”)
attachment = open(“FullPathToFile“, “rb”)
part = MIMEBase(‘application’, ‘octet-stream’)
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header(‘Content-Disposition’, “attachment; filename= %s” % filename)
msg.attach(part)
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header(‘Content-Disposition’, “attachment; filename= %s” % filename)
msg.attach(part)
server = smtplib.SMTP(‘smtp.gmail.com’, 587)
server.starttls()
server.login(fromaddr, “FromUserEmailPassword“)
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
server.starttls()
server.login(fromaddr, “FromUserEmailPassword“)
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
In addition to adding your own information you need to set the name of the file to attach with it’s extension (eg. testfile.txt) and the full path to where the file can be found (eg. /home/pi/testfile.txt).
Email with Extended Body Text:
If you need to send an email with more text in the body where it is impractical to write it directly into the python code then a text file can be created with the body of the email and then read into the script.
#!/usr/bin/env python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
fromaddr = “FromUser@gmail.com”
toaddr = “ToUser@gmail.com”
toaddr = “ToUser@gmail.com”
msg = MIMEMultipart()
msg[‘From’] = fromaddr
msg[‘To’] = toaddr
msg[‘Subject’] = “Test Alert”
f = open(“PathToEmailBodyTextWithExtension“)
body = f.read()
msg.attach(MIMEText(body, ‘plain’))
msg[‘From’] = fromaddr
msg[‘To’] = toaddr
msg[‘Subject’] = “Test Alert”
f = open(“PathToEmailBodyTextWithExtension“)
body = f.read()
msg.attach(MIMEText(body, ‘plain’))
filename = “AttachmentFileWithExt”
attachment = open(“FullPathToFile“, “rb”)
attachment = open(“FullPathToFile“, “rb”)
part = MIMEBase(‘application’, ‘octet-stream’)
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header(‘Content-Disposition’, “attachment; filename= %s” % filename)
msg.attach(part)
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header(‘Content-Disposition’, “attachment; filename= %s” % filename)
msg.attach(part)
server = smtplib.SMTP(‘smtp.gmail.com’, 587)
server.starttls()
server.login(fromaddr, “FromUserEmailPassword“)
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
server.starttls()
server.login(fromaddr, “FromUserEmailPassword“)
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
Here you need to add the full path name of the text file containing your body text to the line f = open(” “) eg. /home/pi/email_body_text.txt.
Email with Multiple Recipients:
Finally if you want to send the email to more than one recipient we need to present the all the receiving email addresses to the server.sendmail function.
#!/usr/bin/env python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
fromaddr = “FromUser@gmail.com”
toaddr = “ToUser1@gmail.com,ToUser2@gmail.com,ToUser3@gmail.com”
alladdr = toaddr.split(“,”)
toaddr = “ToUser1@gmail.com,ToUser2@gmail.com,ToUser3@gmail.com”
alladdr = toaddr.split(“,”)
msg = MIMEMultipart()
msg[‘From’] = fromaddr
msg[‘To’] = toaddr
msg[‘Subject’] = “Test Alert”
f = open(“PathToEmailBodyTextWithExtension“)
body = f.read()
msg.attach(MIMEText(body, ‘plain’))
msg[‘From’] = fromaddr
msg[‘To’] = toaddr
msg[‘Subject’] = “Test Alert”
f = open(“PathToEmailBodyTextWithExtension“)
body = f.read()
msg.attach(MIMEText(body, ‘plain’))
filename = “AttachmentFileWithExt”
attachment = open(“FullPathToFile“, “rb”)
attachment = open(“FullPathToFile“, “rb”)
part = MIMEBase(‘application’, ‘octet-stream’)
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header(‘Content-Disposition’, “attachment; filename= %s” % filename)
msg.attach(part)
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header(‘Content-Disposition’, “attachment; filename= %s” % filename)
msg.attach(part)
server = smtplib.SMTP(‘smtp.gmail.com’, 587)
server.starttls()
server.login(fromaddr, “FromUserEmailPassword“)
text = msg.as_string()
server.sendmail(fromaddr, alladdr, text)
server.quit()
server.starttls()
server.login(fromaddr, “FromUserEmailPassword“)
text = msg.as_string()
server.sendmail(fromaddr, alladdr, text)
server.quit()
When entering your own information the “toaddr” variable is now where you can add the comma separated recipients. As a bonus if you want to add Cc or Bcc recipients then you will need to add the “ccaddr” and “bccaddr” variables and configure the “alladdr” variable to combine all the intended recipients into one string as show in the code below.
#!/usr/bin/env python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
fromaddr = “FromUser@gmail.com”
toaddr = “ToUser1@gmail.com,ToUser2@gmail.com”
ccaddr = “ToUser3@gmail.com,ToUser4@gmail.com,ToUser5@gmail.com”
bccaddr = “ToUser6@gmail.com”
alladdr = toaddr.split(“,”) + ccaddr.split(“,”) + [bccaddr]msg = MIMEMultipart()
toaddr = “ToUser1@gmail.com,ToUser2@gmail.com”
ccaddr = “ToUser3@gmail.com,ToUser4@gmail.com,ToUser5@gmail.com”
bccaddr = “ToUser6@gmail.com”
alladdr = toaddr.split(“,”) + ccaddr.split(“,”) + [bccaddr]msg = MIMEMultipart()
msg[‘From’] = fromaddr
msg[‘To’] = toaddr
msg[‘Subject’] = “Test Alert”
f = open(“PathToEmailBodyTextWithExtension“)
body = f.read()
msg.attach(MIMEText(body, ‘plain’))
msg[‘To’] = toaddr
msg[‘Subject’] = “Test Alert”
f = open(“PathToEmailBodyTextWithExtension“)
body = f.read()
msg.attach(MIMEText(body, ‘plain’))
filename = “AttachmentFileWithExt”
attachment = open(“FullPathToFile“, “rb”)
attachment = open(“FullPathToFile“, “rb”)
part = MIMEBase(‘application’, ‘octet-stream’)
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header(‘Content-Disposition’, “attachment; filename= %s” % filename)
msg.attach(part)
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header(‘Content-Disposition’, “attachment; filename= %s” % filename)
msg.attach(part)
server = smtplib.SMTP(‘smtp.gmail.com’, 587)
server.starttls()
server.login(fromaddr, “FromUserEmailPassword“)
text = msg.as_string()
server.sendmail(fromaddr, alladdr, text)
server.quit()
server.starttls()
server.login(fromaddr, “FromUserEmailPassword“)
text = msg.as_string()
server.sendmail(fromaddr, alladdr, text)
server.quit()
With these scripts you will now be able to send emails in whatever style you like be that formal or just a simple alert. All the python code for the above emails is available for both 2.x and 3.x on MyHydropi Github Repository.
If you have any thought’s about this article, improvements or errors let me know in the comments below and if you found this helpful, why not share it with others.
Send Email And Receive Email By Raspberry Python
Reviewed by Unknown
on
February 23, 2017
Rating:
No comments: