Auparavant, j'ai écrit un article Lancer automatiquement un navigateur sur Ubuntu et observer les valeurs sur le WEB aux points fixes. J'ai envisagé d'envoyer une alerte par e-mail s'il y avait un mouvement notable dans la valeur que je surveillais, mais configurer le serveur SMTP à partir de zéro était un problème. Quand je l'ai recherché, j'ai essayé de construire un programme car il est possible d'envoyer du courrier sans préparer SMTP si j'utilise l'API Gmail.
OS : Ubuntu16.04 python : version3.5
pip3 install --upgrade google-api-python-client
L'authentification doit être effectuée conformément à l'étape 1 sur la page here.
Le code du programme réel a été presque imité à partir du site suivant. → Envoyer des e-mails à l'aide de l'API Gmail avec Python3 + google-api-python-client Il est rédigé de manière très simple à comprendre.
Le code du programme est indiqué ci-dessous. Vous pouvez l'utiliser dans votre propre environnement en modifiant simplement les quatre constantes (CLIENT_SECRET_FILE, APPLICATION_NAME, MAIL_FROM, MAIL_TO) dans le code.
from __future__ import print_function
import httplib2
import os
import apiclient
from apiclient import discovery
import oauth2client
from oauth2client import client
from oauth2client import tools
import base64
from email.mime.text import MIMEText
from email.utils import formatdate
import traceback
try:
import argparse
flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
flags = None
# If modifying these scopes, delete your previously saved credentials
# at ~/.credentials/gmail-python-quickstart.json
SCOPES = 'https://www.googleapis.com/auth/gmail.send'
CLIENT_SECRET_FILE = '<path_to_credintial>.json'
APPLICATION_NAME = '<application_name>'
MAIL_FROM = "<sender email-address>"
MAIL_TO = "<receiver email-address>"
def get_credentials():
home_dir = os.path.expanduser('~')
credential_dir = os.path.join(home_dir, '.credentials')
if not os.path.exists(credential_dir):
os.makedirs(credential_dir)
credential_path = os.path.join(credential_dir,
'gmail-send-api.json')
store = oauth2client.file.Storage(credential_path)
credentials = store.get()
if not credentials or credentials.invalid:
flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
flow.user_agent = APPLICATION_NAME
if flags:
credentials = tools.run_flow(flow, store, flags)
else: # Needed only for compatibility with Python 2.6
credentials = tools.run(flow, store)
print('Storing credentials to ' + credential_path)
return credentials
def create_message(receiver,subject,mail_str):
message = MIMEText(mail_str)
message["from"] = MAIL_FROM
message["to"] = receiver
message["subject"] = subject
message["Date"] = formatdate(localtime=True)
byte_msg = message.as_string().encode(encoding="UTF-8")
byte_msg_b64encoded = base64.urlsafe_b64encode(byte_msg)
str_msg_b64encoded = byte_msg_b64encoded.decode(encoding="UTF-8")
return {"raw": str_msg_b64encoded}
def send_mail(receiver,subject,mail_str):
credentials = get_credentials()
http = credentials.authorize(httplib2.Http())
service = discovery.build('gmail', 'v1', http=http)
try:
result = service.users().messages().send(
userId = MAIL_FROM,
body=create_message(receiver,subject,mail_str)
).execute()
print("Message Id: {}" .format(result["id"]))
except apiclient.errors.HttpError:
print("-----start trace-----")
traceback.print_exc()
print("-----end trace-----")
if __name__ == '__main__':
send_mail("gano_test\ngano_test2")
En complément, entrez ce qui suit pour chacune des quatre constantes.