検索ガイド -Search Guide-

単語と単語を空白で区切ることで AND 検索になります。
例: python デコレータ ('python' と 'デコレータ' 両方を含む記事を検索します)
単語の前に '-' を付けることで NOT 検索になります。
例: python -デコレータ ('python' は含むが 'デコレータ' は含まない記事を検索します)
" (ダブルクオート) で語句を囲むことで 完全一致検索になります。
例: "python data" 実装 ('python data' と '実装' 両方を含む記事を検索します。'python data 実装' の検索とは異なります。)
当サイトのドメイン名は " getwebtips.net " です。
トップレベルドメインは .net であり、他の .com / .shop といったトップレベルドメインのサイトとは一切関係ありません。
practical_python_design_patterns

Practical Python Design Patterns - Python で学ぶデザインパターン: The Adapter Pattern - Part. 1 「第6章: アダプターパターン - 概要 [メール送信機能の実装 with Python]」の巻 投稿一覧へ戻る

Published 2022年5月29日19:03 by T.Tsuyoshi

SUPPORT UKRAINE

- Your indifference to the act of cruelty can thrive rogue nations like Russia -

Chapter 6: Adapter Pattern - Overview
(第6章: アダプターパターン - 概要 [メール送信機能の実装 with Python])

最も強いものが生き残るわけでも、最も賢いものが生き残るわけでもない。変化に最も適応できたものが生き残るのだ。
- Charles Darwin
Overview
利用したいな、と思うインターフェースが用意されていないことも間々あります。この章では、提供されているものを自分たちが望む近い形に変更する為にできることは何なのか、ということについて考えます。
あなたは、自分で利用するマーケティングのためのソフトウェアを作成しているとします。そしてまず電子メール (emails) を送信するコードから記述を始めました。次のような感じです:
send_email.py
import smtplib
from email.mime.text import MIMEText

def send_email(sender, recipients: list[str], subject, message):
msg = MIMEText(message, _charset='utf-8')
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = ','.join(recipients)

with smtplib.SMTP(host='server_name', port=123) as mail_sender:
mail_sender.login('user_name', 'password')
errors = mail_sender.send_message(msg)

if isinstance(errors, dict) and len(errors) > 0:
print(f'Error: {errors}')

if __name__ == '__main__':
response = send_email(
'email@example.com',
['nana@example.com', 'hana@example.com'],
'ご挨拶とお知らせ',
'良い一日をお過ごしください'
)
続けて、メール送信機能をクラスとして実装します。それは、システムをより大きなものに発展させる場合、オブジェクト指向アプローチを採る必要があるだろう、と考えているためです。ユーザーのアドレス情報は Comma-Separated Values (CSV) ファイルに保存し、必要に応じて読み込むようにします:
users.csv
name,surname,email
Nana,Sato,nana@example.com
Hana,Suzuki,hana@example.com
...
メール送信クラスの最初の実装は次のようにしました:
mail_sender.py
import csv
import smtplib
from email.mime.text import MIMEText

class Mailer:
def send(self, sender, recipients: list[str], subject, message):
msg = MIMEText(message, _charset='utf-8')
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = ','.join(recipients)

with smtplib.SMTP(host='server_name', port=123) as mail_sender:
mail_sender.login('user_name', 'password')
errors = mail_sender.send_message(msg)

if isinstance(errors, dict) and len(errors) > 0:
print(f'Error: {errors}')

if __name__ == '__main__':
with open('users.csv', 'r', encoding='utf-8') as csv_file:
reader = csv.DictReader(csv_file)
users = [row for row in reader]
print(users)

mailer = Mailer()
mailer.send(
'email@example.com',
[x['email'] for x in users],
'ご挨拶とお知らせ',
'良い一日をお過ごしください'
)
このコードを実際に動作させてみるには、OS 側でメール送信サービスを提供できるようなセットアップが必要です。Postfix といったフリーソフトがありますので、興味のある方はググってみてください。
INFO:
Postfix は Windows をサポートしていないようですが、Windows に WSL (Windows Subsystem for Linux: Linux 用 Windows サブシステム) を導入して Linux の実行環境を構築することで利用可能になります。
私は外部のメールサーバーを利用してこのコードを実行しましたが、ちゃんと動作することを確認しました (勿論サーバー名やポート番号、認証情報などは適宜変更しています)。
さて、話を進める前に、このシリーズで何回も目にすることになるであろう2つのデザイン原則 (two design principles) を紹介したいと思います。これらの原則は、より良いコードを記述するための明確な指針を提供してくれます。

この投稿をメールでシェアする

0 comments

コメントはまだありません。

コメントを追加する(不適切と思われるコメントは削除する場合があります)