SlackのIncoming WebHooksを使う

 
カテゴリー Python SaaS   タグ

SlackのIncoming Webhookを使う

json形式でWebhook用のURLにPOSTするだけ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import os
import json
import requests

class SlackWebHook():
def __init__(self, webhook_url, user_name, channel):
self.incoming_webhook_url = webhook_url
self.user_name = user_name
self.channel = channel

def post(self, message):
post_dic = {
"text":message,
"username":self.user_name,
"icon_emoji":':ghost:',
"channel":self.channel,
}

requests.post(self.incoming_webhook_url, data=json.dumps(post_dic))

# Incoming Webhooksを使って対象のチャンネルにメッセージを送付
if __name__=='__main__':
incoming_webhook_url = os.environ['SLACK_INCOMING_WEBHOOK_URL']
slack = SlackWebHook(incoming_webhook_url, "JobRunner-BOT", '#report')
slack.post("テストメッセージ <https://www.google.co.jp>")

Slackの設定

SlackのAppからIncoming WebHooksを選択。

IncomingWebhook width=640

Appディレクトリで確認する。

IncomingWebhook width=640

Slackに追加。

IncomingWebhook width=640

投稿先のチャンネルを選択。

IncomingWebhook width=640

Webhook URLを取得する。

IncomingWebhook width=640

コメント・シェア

PythonでGmailを使ったメール送信

 
カテゴリー Google Python   タグ

smtplibを使ったメール送信

gmailの場合、SMTPサーバはsmtp.gmail.com:587で設定する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import os
import smtplib
import email.utils
from email.mime.text import MIMEText

# 環境変数
mail_from = os.environ['MAIL_FROM']
rcpt_to = os.environ['RCPT_TO']
smtp_server = 'smtp.gmail.com'
smtp_port = 587
smtp_user = os.environ['SMTP_USER']
smtp_password = os.environ['SMTP_PASSWORD']

# Body
msg = MIMEText('テストメッセージ\n' + '送信テスト\n')
msg['To'] = email.utils.formataddr(('テスト宛先', mail_from))
msg['From'] = email.utils.formataddr(('テスト送信元', rcpt_to))
msg['Subject'] = 'テストメール'

# smtplib を使ったメール送信
server = smtplib.SMTP(smtp_server, smtp_port)
server.set_debuglevel(True)
try:
server.ehlo()
server.starttls()
server.login(smtp_user, smtp_password)
server.sendmail(mail_from, rcpt_to, msg.as_string())
finally:
server.quit()

Gmailの設定

デフォルトではSMTPサーバとして使用できない

SMTPでメール送信を行う設定をせずに送信するとエラーになる。

1
smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8  https://support.google.com/mail/?p=BadCredentials xxxxxxxxxxxxxxxx.xx - gsmtp')

方法1: 安全性の低いアプリのアクセス

標準で無効になっている、安全性の低いアプリのアクセスを有効にして送信可能にする。
パスワードはGmailアカウントのパスワードを使用する。

GmailSecruity width=640

GmailSecruity width=640

GmailSecruity width=640

方法2: 2段階認証用のアプリパスワード

2段階認証を有効にして、アプリパスワードを発行する。
パスワードはアプリ用パスワードとして発行した16桁のパスワードを使用する。

GmailSecruity width=640

GmailSecruity width=640

SMSか音声通話で2段階認証プロセスを有効化する(ここでは音声通話)。

GmailSecruity width=640

GmailSecruity width=640

GmailSecruity width=640

GmailSecruity width=640

認証アプリケーションを設定する。

GmailSecruity width=640

GmailSecruity width=640

GmailSecruity width=640

GmailSecruity width=640

アプリ用パスワードを発行する。

GmailSecruity width=640

GmailSecruity width=640

GmailSecruity width=640

コメント・シェア

SMTPHandlerでログ出力をメール通知する

 
カテゴリー Python   タグ

SMTPHandlerを使ったメール通知

設定例

SMTPHandlerを使ってERRORレベルのログをメール送信する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import os
import json
import logging.config

# 環境変数
mail_from = os.environ['MAIL_FROM']
rcpt_to = os.environ['RCPT_TO']
smtp_server = 'smtp.gmail.com'
smtp_port = 587
smtp_user = os.environ['SMTP_USER']
smtp_password = os.environ['SMTP_PASSWORD']

# json.load() で読み込むとタプルとリストの区別がつかないので、 json.load()で読み込めない
config = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'simple': {
'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
}
},
'handlers': {
'consoleHandler': {
'level': 'DEBUG',
'formatter': 'simple',
'class': 'logging.StreamHandler',
},
'smtpHandler': {
'level': 'ERROR',
'formatter': 'simple',
'class': 'logging.handlers.SMTPHandler',
'mailhost': (smtp_server, smtp_port),
'fromaddr': mail_from,
'toaddrs': [rcpt_to],
'subject': "error log",
'credentials': (smtp_user, smtp_password),
'secure': (),
}
},
'loggers': {
'': {
'handlers': ['consoleHandler', 'smtpHandler'],
'level': "INFO",
}
}
}

logger = logging.getLogger(__name__)
logging.config.dictConfig(config)
logger.debug('Debug log message')
logger.info('Info log message')
logger.warning('Warning log message')
logger.error('Error log message')

実行結果

実行するとrootで設定したINFOレベル以上のログをlogging.StreamHandlerで表示。

1
2
3
4
$python log_to_mail.py
2020-04-19 00:18:11,840 - __main__ - INFO - Info log message
2020-04-19 00:18:11,840 - __main__ - WARNING - Warning log message
2020-04-19 00:18:11,840 - __main__ - ERROR - Error log message

ERRORレベルのログはSMTPHandlerでメール通知。

  • 件名 error log
  • 本文 2020-04-19 00:18:11,840 - __main__ - ERROR - Error log message

コメント・シェア

Keyring

バックエンドとして各種OSのパスワード機構を使える

  • macOS Keychain
  • Freedesktop Secret Service supports many DE including GNOME (requires secretstorage)
  • KDE4 & KDE5 KWallet (requires dbus)
  • Windows Credential Locker

Linuxの場合、GnomeかKDEが稼働しているホストでなければならない。

keyring-cliツール

python:3-slimベースのContainer上ではNoKeyringErrorになる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$keyring
Usage: keyring [get|set|del] SERVICE USERNAME

Options:
-h, --help show this help message and exit
-p KEYRING_PATH, --keyring-path=KEYRING_PATH
Path to the keyring backend
-b KEYRING_BACKEND, --keyring-backend=KEYRING_BACKEND
Name of the keyring backend
--list-backends List keyring backends and exit
--disable Disable keyring and exit
$keyring set system test
Password for 'test' in 'system': ***********
Traceback (most recent call last):
File "/usr/local/bin/keyring", line 8, in <module>
sys.exit(main())
File "/usr/local/lib/python3.8/site-packages/keyring/cli.py", line 136, in main
return cli.run(argv)
File "/usr/local/lib/python3.8/site-packages/keyring/cli.py", line 89, in run
set_password(service, username, password)
File "/usr/local/lib/python3.8/site-packages/keyring/core.py", line 62, in set_password
_keyring_backend.set_password(service_name, username, password)
File "/usr/local/lib/python3.8/site-packages/keyring/backends/fail.py", line 25, in get_password
raise NoKeyringError(msg)
keyring.errors.NoKeyringError: No recommended backend was available. Install a recommended 3rd party backend package; or, install the keyrings.alt package if you want to use the non-recommended backends. See https://pypi.org/project/keyring for details.

Windows Credential Locker(Windows資格情報)をバックエンドにした場合

Windows資格情報に対する追加・削除・参照ができる。

1
2
3
4
5
6
7
import keyring

keyring.set_password('test', 'testuser', 'passpasstest')
print(keyring.get_password('test', 'testuser'))

keyring.delete_password('test', 'testuser')
print(keyring.get_password('test', 'testuser'))

実行結果

1
2
3
PS > python .\keyring-test.py
passpasstest
None

コメント・シェア

  • page 1 of 1


nullpo

めも


募集中


Japan