Raspberry Pi
Tutorial de Rapberry Pi en español.
- Juan Antonio Villalpando -
Volver al índice del tutorial
____________________________
37.- Enviar correo mediante una cuenta de Gmail. Tomar una foto y enviarla por correo.
GPIO2 es SDA
GPIO3 es SCL
- Vamos a enviar un correo mediante una cuenta de Gmail.
- Tenemos una cuenta de Gmail y vamos a enviarle un correo a otra persona desde el Raspberry.
- Supongamos que tenemos micuenta@gmail.com y le queremos enviar un correo a correodeldestinatario@yahoo.com
______________________________
1.- Permitir la llegada de correo enviada por aplicaciones.
- Primero debemos permitir a nuestra cuenta de Gmail que puedan "Acceder aplicaciones poco seguras", para ello seguimos el siguiente proceso en nuestra cuenta de Gmail:
______________________________
2.- Código para enviar un texto.
- Es necesario poner tu cuenta de correo de Gmail y tu contraseña de esa cuenta de correo.
|
#!/usr/bin/python3
import socket
import smtplib
import os
import sys
sender_address = "micuenta@gmail.com"
sender_password = "contraseña_de_mi_correo"
sender_server = 'smtp.gmail.com'
sender_port = 587
recipient_address = "correodeldestinatario@yahoo.com"
def get_device_ip_address():
try:
if os.name == "nt":
# On Windows
result = "Running on Windows"
hostname = socket.gethostname()
result += "\nHostname: " + hostname
host = socket.gethostbyname(hostname)
result += "\nHost-IP-Address:" + host
return result
elif os.name == "posix":
gw = os.popen("ip -4 route show default").read().split()
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((gw[2], 0))
ipaddr = s.getsockname()[0]
gateway = gw[2]
host = socket.gethostname()
result = "OS:\t\tRaspbian\nIP:\t\t" + ipaddr + "\nGateway:\t" + gateway + "\nHost:\t\t" + host
return result
else:
result = os.name + " no funciona en este sistema."
return result
except:
return "No detecta la IP"
def send_email(text):
try:
message = "From: " + sender_address + "\nTo: " + recipient_address + "\nSubject: Raspberry\n\n" + text
server = smtplib.SMTP(sender_server, sender_port)
server.ehlo()
server.starttls()
server.login(sender_address, sender_password)
server.sendmail(sender_address, recipient_address, message)
server.close()
print("Mensaje enviado por:\n", message)
except:
print("Fallo. Lee el punto 1 del tutorial.")
message = get_device_ip_address()
print(message)
print("Enviando el mensaje.")
send_email(message)
print("Terminado.")
sys.exit()
|
- Obtendremos esta información.
-
______________________________
3.- Enviar una imagen o un texto.
- Tenemos esta imagen en el directorio: /home/pi/ladron.jpg, la vamos a enviar.
|
# Envía texto o imagen
# Juan A. Villalpando
# kio4.com
import smtplib,ssl
from time import sleep
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import formatdate
from email import encoders
def envia_email():
enviador = 'micuenta@gmail.com'
asunto = "Te están robando"
receptor = 'correodeldestinatario@yahoo.com'
msg = MIMEMultipart()
msg['From'] = enviador
msg['Subject'] = asunto
msg['To'] = receptor
part = MIMEBase('application', "octet-stream")
part.set_payload(open("/home/pi/ladron.jpg", "rb").read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="ladron.jpg"')
msg.attach(part)
try:
s = smtplib.SMTP('smtp.gmail.com', 587)
s.ehlo()
s.starttls()
s.login(user = enviador, password = 'contraseña_de_tu_correo')
s.sendmail(enviador, receptor, "Envia este texto") # Envia texto. Consulta Spam.
s.sendmail(enviador, receptor, msg.as_string()) # Envia imagen.
s.quit()
except smtplib.SMTPException as error:
print ("Error")
envia_email()
|
______________________________
4.- Enviar texto y una imagen.
|
# Envía texto plano, código HTML e imagen.
# Modificado por Juan A. Villalpando
# kio4.com
import smtplib,ssl
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
enviador = 'micuenta@gmail.com'
receptor = 'correodeldestinatario@yahoo.com'
msgRoot = MIMEMultipart('related')
msgRoot['Subject'] = 'Te están robando'
msgRoot['From'] = enviador
msgRoot['To'] = receptor
msgRoot.preamble = 'Esto es el preambulo.'
msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative)
# Envío en texto plano
msgText = MIMEText('Este texto se enviará, pero no en HTML.')
msgAlternative.attach(msgText)
# Envío en formato HTML
msgText = MIMEText('<b>Texto <i>en HTML</i> y además </b> una imagen.<br><img src="cid:image1"><br>Fin de página', 'html')
msgAlternative.attach(msgText)
# Dirección de la imagen
fp = open('/home/pi/ladron.jpg', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
# Adjunta imagen1
msgImage.add_header('Content-ID', '<image1>')
msgRoot.attach(msgImage)
s = smtplib.SMTP('smtp.gmail.com', 587)
s.ehlo()
s.starttls()
s.login(user = enviador, password = 'contraseña_de_tu_correo')
s.sendmail(enviador, receptor, msgRoot.as_string())
s.quit()
print ("Creo que ya se ha enviado el correo :)")
|
______________________________
5.- Al pulsar un botón se ha de enviar un correo con el código del ejemplo anterior.
- Conectamos un pulsador al terminal 10 de RP y a 3.3V.
- Al pulsar este Botón, se ejecutará el código del ejemplo anterior y se enviará el correo con la imagen.
|
import subprocess
import os
from time import sleep # Función sleep del módulo time
import RPi.GPIO as GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(10, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
while True:
if GPIO.input(10) == GPIO.HIGH:
print("Botón PULSADO.")
p1 = subprocess.Popen(['python3','correo_4.py'])
sleep(7)
os.system("pkill -f 'python3 correo_4.py' "))
|
- Dejamos 7 segundos de espera. Luego cierra el script correo_4.py
______________________________
6.- Tenemos una cámara USB enfocando a un lugar, al pulsar un Botón debe tomar una foto y enviarla por correo.
- Nos basamos en el tutorial:
26.- Webcam USB en el Raspberry Pi. Timelapse.
- Conectamos la cámara USB, comprobamos si es reconocida.
lsusb
ls -al /dev/video*
sudo v4l2-compliance -d /dev/video0
Utilizamos las aplicaciones:
sudo apt-get install v4l-utils
sudo apt-get install fswebcam
- Creamos el siguiente script. Al pulsar el Botón se capturará la imagen de la cámara y se guardará en /home/pi/ladron.jpg
- Luego se ejecutará el script correo_4.py, visto anteriormente, que enviará esa imagen por correo.
- Por último terminará el proceso de correo_4.py
|
import subprocess
import os
import sys
from time import sleep # Función sleep del módulo time
import RPi.GPIO as GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(10, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
while True:
if GPIO.input(10) == GPIO.HIGH:
print("Botón PULSADO.")
os.system("fswebcam -i 0 -d /dev/video0 -r 640x480 -q --title @kio4.com /home/pi/ladron.jpg")
sleep(1)
p1 = subprocess.Popen(['python3','correo_4.py'])
sleep(7)
os.system("pkill -f 'python3 correo_4.py' "))
|
- Si te sale error:
Error setting pixel format
VIDIOC_S_FMT device or resource busy
Probablemente está funcionando "motion" y pueden ser incompatibles.
- Consulta el ID de motion
sudo ps -aux | grep motion
- Termina el proceso
sudo kill -9 id_de_motion
- Comentarios.
- Se podría utilizar un fin de carreras en una ventana o puerta de manera que cuando se abriera actuara como el botón del ejemplo.
______________________________
7.- Tenemos una cámara USB enfocando a un lugar, cuando haya movimiento en su cercanía debe tomar una foto y enviarla por correo.
- Se puede hacer de varias formas, mediante "motion", esto es que la cámara enfoca a un sitio y si hay cambio de imagen hace una foto.
http://kio4.com/raspberry/25_webcam_motion.htm
- También se puede hacer mediante un detector de presencia. Ver tutorial:
7.- Sensor de proximidad HR 501. Detector de movimiento.
https://randomnerdtutorials.com/raspberry-pi-motion-detector-photo-capture/
___________________________________________________
|