RaspberryPiで自動同報メール発送機をつくるよ!
※有料記事にしていますがほぼ無料で読めます☆
いんとろだくしょん
それは昔々、コロナ禍の始まりぐらいのころ。世間ではGWどうすんのよーとかが話題になっていた時代。
ある地方都市の一角に、顧客数千ニンをかかえる零細企業がありました。
まあ、うちのおじさんのところなんですけどw (業種とかバレるとまずいから内緒)
そこでは毎月お客さんに向けてメルマガをだしてるんですけど、今年のGWごろって皆さんが急にリモートワークを始めたせいでか、ネット環境が(おじさんのところ限定?)劣悪になってしまったとかで、多量のメールを出そうとするとメールサーバーが悲鳴を上げて、数通だすとすぐ止まっちゃって全部送ることができなかったそう。
で、結局一晩かけてもちゃんと送れなくて、ワタシのところに悲鳴とお鉢がまわってきたのでした。
ワタシ「何千もあるの!?(嫌だなあ)ねぇ、個人情報保護法って知ってます?」
おじさん「オフコース、なのでキミは今からウチの社員だ! (明日までね)」
ワタシ「なんだかなー」
とゆーわけで、急遽数千のメアド情報と、そこに送り付けるメールの内容がおじさん有限会社の期間限定個人情報管理者兼情報担当者のワタシのところに送られてきたのでした。
ワタシ「お知らせなんてホームページにかけばいいじゃん」
おじさん「見ない人もいるだろう。メールなら届くんだから見るわい」
ワタシ「私なら全部自動でゴミ箱いきですけどね。それに、同じ文面なら、全部BCCで送ればいいんじゃないの?」
おじさん「そんな失礼なことできん!」
という、なんとも昭和なやり取りのすえ、しょうがなく情報担当者としてやっつける羽目になりましたとさ。(個人情報保護法で、担当は誰でどうデータを保存しているとか決めておかないといけないキマリなのです><)
おじさんの使っている同報メーラーアプリは使う人限定の有料版だそうで、他人は使えないので例によってDIYしてなんとかすることにします。
こういう目にあってる突然情報担当者様がワタシのほかにもおられるかもしれませんので、noteにやったことまとめておきますねー。(自分で作れば有料のアプリ使わなくてもいいかもだしねw)
退屈なことはPythonだよね
10や20の同じ作業ならまだいいんですが、百だの千だのの定型作業は人間がやるのは苦痛で退屈なだけ。とゆーことで、Pythonさんの出番です。
今回も日本語を使いますので使うのはPython3系です。また、使うマシンはRaspberryPi Zeroを想定していますが、Python3が動けば普通のパソコンWindowsやMacでももちろん問題ありません。(パソコンだと高性能すぎるぐらいですw)
RaspberryPi の設定方法などは例によって割愛! 分からないところはぐぐってやってみてください。ネットにつながっていて、Python3が動けがOKです。
Pythonでメールを出そう!
Pythonを使ってメールを送信・・・でググると、
参考URL: https://qiita.com/kawa-Kotaro/items/460977f050bf0e2828f2
↑こんなかんじのけっこうズバリ情報がありました。こちらをもとにやってみたいと思います。
Gmailの設定
ワタシの場合は、おじさん会社のメールサーバーに直接つないで行いましたが、今回noteに書く記事では Gmail を使っていこうと思います。
ですが、Python から GmailにアクセスしようとするとGoogle先生から「信頼できん奴だ!」とはじかれてしまいますので、ココを参考に安全性の低いアプリからもアクセスできるように設定を変更しておきます。(今回は実験のみ。実験後はまた設定を戻しておくことをおすすめします)
以下、gmailの設定で、
こんな感じですね。
RaspberryPiにPython3入ってる?
使うのはいつものRaspberryPi Zeroさん。
Python3が入っているかを一応確認しておきましょう。
↑Python 3 以降ならOK。
もちろん、Python3が動けばZeroじゃなくても、RaspberyPiシリーズじゃなくてもよいですよ。
メールサーバーへのログイン
参考サイトの情報に従って、
import smtplib
smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
smtpobj.ehlo()
smtpobj.starttls()
smtpobj.ehlo()
smtpobj.login(MAIL_ADDRESS, PASSWORD)
Python3の対話環境でやってみます。(↑のMAIL_ADDRESSやPASSWORDはもちろん自分のやつに書き換えてネ)
こちらを打ち込んでみると(メアドやパスを書き換えたらコピペでOK)
このような結果となります。赤い枠のなかのように
(235, b'2.7.0 Accepted')
とでてくればGmailへログイン成功です。
メール文面作成
メールの文面やほかの情報は
from email.mime.text import MIMEText
from email.utils import formatdate
msg = MIMEText(body_msg)
msg['Subject'] = subject
msg['From'] = from_address
msg['To'] = to_address
msg['Date'] = formatdate()
このようにしてね。と参考サイトにあります(まんまや)
この内容を以下のように書き換えてみます
from email.mime.text import MIMEText
from email.utils import formatdate
msg = MIMEText('body message desuyo!')
msg['Subject'] = 'subject'
msg['From'] = 'rasentest1@gmail.com'
msg['To'] = 'kagurazakarasen@gmail.com'
msg['Date'] = formatdate()
print(msg)
で、やっちみます。
こんなかんじ。メールの内容が最後のprint(msg)で表示されています。
送信!
では、いよいよドキドキの送信!
送信は(例によって参考サイトでは)
smtpobj.sendmail(from_addr, to_addr, msg.as_string())
smtpobj.close()
こうなってますね。
※送信後の後始末。2行目にある closeはわすれずに!
from_addrとto_addrのあたりを書き換えて実行しましょう。
メールの文の中にもFromとToがありますが、こちらでも改めて設定します。(これ、食い違わせることもできるのです。いわゆるなりすましメールってやつ。セキュリティに厳しいサーバーからは怒られる原因になりますので、同じ内容にしておきましょう)
fromをrasentest1(今回作ったテストアカウント)にして、送信先を私の常用アカウントkagurazakarasenにします。
うりゃ!っと実行して、送られた方のkagurazakarasen@gmailを開いてみると……。
わあい! きてました!!☆ (∩´∀`)∩☆
※なお、これらの作業をもたもたやっていると、gmailはすぐタイムアウトしてしまうので注意です。別にテキストエディタ等を開いて文面を用意して、一気にコピペして貼り付けるほうがいいでしょう。
日本語は?
そして大事な日本語メールができるのかもチェックします。
文面作成の所を
msg = MIMEText('内容だって日本語だもんね!')
msg['Subject'] = '日本語のタイトルはどうかな?'
このように書き換え、実行してみます。
赤枠の中、charaset="utsf-8" になっているほか、Encoding が Base64に、そして日本語の文面が宇宙語になっていますね。コレ、日本語メールの特性なのです(詳しくはぐぐって!)
届いているかどうか確認してみましょう。
ばっちりです!!(∩´∀`)∩☆
ちなみに
msg = MIMEText('内容だって日本語だもんね2!\n改行もいける?\nすごーい!☆')
msg['Subject'] = '日本語のタイトルはどうかな?'
こんな風にしてみて送信すると、
こういうのが届きます。
もうばっちりすぎですね!! Python簡単すぎやばっ!
メール文章をファイルにしておいて送信するプログラム
というわけで、こんなの作りました。
# -*- coding: utf-8 -*-
# コマンドラインで与えたメールアドレスへ "mailmsg.txt" の内容をメールする
# Usage: python3 AutoMail.py ToAddress
import sys
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
FromAddres = 'xxxxx@gmail.com' # 送信元のメールアドレス
MailText = "mailmsg.txt" # メール内容のテキストファイル、一行目はメールタイトル
ToAddres = sys.argv[1] # コマンドラインの最初の文字列(宛先アドレスのメアドであること!)
def create_message(from_addr, to_addr, subject, body):
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = from_addr
msg['To'] = to_addr
msg['Date'] = formatdate()
return msg
def send_mail(from_addr, to_addr, body_msg):
smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
smtpobj.ehlo()
smtpobj.starttls()
smtpobj.ehlo()
smtpobj.login(FromAddres , MY_PASSWORD)
smtpobj.sendmail(from_addr, to_addr, body_msg.as_string())
smtpobj.close()
def mailtxtread(textreadfile):
with open(textreadfile,'r',encoding="utf8", errors='ignore') as f:
lines = f.readlines()
#print(lines)
return(lines)
mailLines = mailtxtread( MailText )
title = mailLines.pop(0).rstrip('\n') # 一行目はタイトル。popで取り出して同時に1行目をリストからカット。ついでに改行をchomp!
#print('title:'+ title)
bodytxt = ''.join(mailLines)
#print(bodytxt)
# メール文作成と送信実行
mail_msg = create_message(FromAddres ,ToAddres ,title ,bodytxt )
send_mail(FromAddres ,ToAddres,mail_msg)
このスクリプトを AutoMail.py という名前で保存しておいて、
$ python3 AutoMail.py <宛先メアド>
とすれば、 そのメールアドレスへ "mailmsg.txt" の内容をメールするプログラムです。
mailmsg.txt は1行目をメールのタイトルにしておいて、2行目からが本文。utf-8で保存しておきます。※改行はCRLFで。
あとは、この<宛先メアド>を次々書き換えてこのプログラムを呼び出すシェルスクリプトでも書けば、ばっちり動作するはずです(シェルスクリプトについては別にググりましょう!w)
もちろん、上のプログラムを改造して、別の宛先リストcsvファイルででも呼び出して自動送信するように書き換えてもいいですね。
あんまり一気に送るとサーバーから怒られることがありますので、一通につき1秒ぐらいWaitをかけるのがおすすめです。
そして、今回は簡略化のためすっとばしましたが、実際には
smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
smtpobj.set_debuglevel(True)
のようにデバックレベルで実行することをお勧めします。(サーバーから怒られたら内容がわかります)
そのほか、メールの暗号化や認証等については
https://www.python.ambitious-engineer.com/archives/2034
がよくまとまっていて参考になりました。
※当然ですが、このプログラムを利用してなんかやばいことがおきても一切責任とれませんのでよろしくね☆ (特にスパムメールの送出元としてブラックリストにのってもしりませんよー)
いやあ、それにしてもらくちんらくちん♪
Pythonはすごいねー。らくちんだねー。
と、いうわけで、だいたい2時間ぐらいの作業でしたが、バイト代は時給なので、丸々2日間かかったことにしてステイホームあつ森しておりましたです、はいw
さて、ここまででやりたいことはできてしまっていますが、メアド以外にお客の名前や送り元の名前をセットしたり、同じ内容なのをぐるぐる力業で回したりしないでよいような、よりエレガントな方法ももちろんあります。それについてはこの続きに書いておきます。
なお、エレガントすぎてスパムメールの温床になりかねませんので、ここから先は有料情報にしておきます。
ここから先は
¥ 200
Amazonギフトカード5,000円分が当たる
よろしければサポートお願いします!いただいたサポートはクリエイターとしての活動費にさせていただきます!感謝!,,Ծ‸Ծ,,