pythonでEmail自動生成スクリプトを作って得たTips
久しぶりの備忘録的なブログ。
この前、Email処理を楽にするスクリプトを書いたとき、ちょっとした知見が得られたので、備忘。
今回、メールを送信する前に人間の目で最終確認、ちょこっと編集をしたかったので、
任意のディレクトリ下にメールファイル(.eml)を生成していくスクリプトを作っていました。
そこで、気になったことが1つ。
生成したメールファイル(.eml)を開くと、メールソフトが立ち上がるのですが、
編集状態ではなく、受信したメールと同様に編集不可の状態で開かれてしまいました。
これは、Windows Live Mail (WLM) での動作のようで、
私が私的にメインで使っている Thunderbird では、
再送信(再編集)の項目がメニューにあり、ひと手間かかるようですが、再編集状態にできました。
ただ、仕事でWLMを使えと言われたら、使わないといけませんので、どうにかしようと思って検索をしていたら見つけました。
上記のページを読むと、Header中の X-Unsent に 1 を入れればよい、とのこと。
そして、肝となる部分を抜粋してきたコードが以下。
環境
- python 3.5.1
- email(標準ライブラリ)
import email from email.mime.text import MIMEText from email.utils import formataddr from email.header import Header from email import generator from_addr = 'from_addr@mail' to_addr = 'to_addr@mail' subject = "メール件名" body = "メール本文" encoding = 'utf-8' sender_name = Header('fromのニックネーム', encoding).encode() message = MIMEText(body.encode(encoding), 'plain', _charset=encoding) message['Subject'] = Header(subject, encoding) message['From'] = formataddr((sender_name, from_addr)) message['To'] = to_addr message.add_header('X-Unsent', '1') with open('test.eml', 'w') as eml: gen = generator.Generator(eml) gen.flatten(message) print("** end **")
node.jsでScratchXとDigisparkをつなげる
今年の頭にやっていたことを振り返って、ターゲットとして初心者を想定した割に、
手順が多すぎると感じたので、node.js(electron)で手順を少なくした。
※毎度のことですが、実際にやるときは自己責任でお願いいたします。
electronでバイナリ化
最終的な形としては、これを目指していて、Windowsでもこれがやりたかった。
現時点、Macのみ対応。Windowsについては後述。
動作確認した環境は
準備
Digispark
Digisparkには、ArduinoIDEを使って、File > Examples > DigisparkUSB > DigiBlinkの DigiBlink.inoを書き込んでおく。
libusb
- libusbが必要になるので、パッケージマネージャーのHomebrewを入れる。
- Homebrewを使って、libusbをインストール。
brew install libusb
app
- 最後に、実行ファイル(app)が入っているzipファイルを落してくる。 uitspitss/electron_scratchX-digispark/release
- 落してきたzipファイルを解凍(展開)する。
実行
app実行時にクリップボードにURLのコピーが行われるので注意!
DigisparkをUSBに挿した状態で、中に入っているappを実行すると、以下のようなウィンドウが立ち上がる。
appを立ち上げたときに、ファイアウォールからの警告が出てきたら、「許可」「拒否」どちらかを選択で警告ウィンドウは消す。
あとは、立ち上ったウィンドウに表示されているURLにウェブブラウザ(Chrome推奨)でアクセスすると、 以下の画像のように、その他(Others)のところにDigispark用のブロックが読み込まれているはず。
この読み込まれたブロックを組み込んでプログラムを書くとその通りに動く。
Windows
Windowsでは、electronとnode-usbの相性問題でelectronがコケてしまうので、 electronを使わずにCLIで動くものも書いた。
環境
動作確認した環境は
- Windows10
- node.js -
v6.1.0
- npm -
3.8.6
準備
Digispark
ここは、上述のelectronバージョンと同様。
libusb
Windowsではzadig(usbドライバ書き換えソフト)を使ってインストール。
- zadigをダウンロードする。
- zadigでDigiUSBのドライバを
WinUSB
に変更する。
node
まず、下のリポジトリをクローンしたら、コマンドプロンプト(cmd.exe)で落としてきたディレクトリの中に入る。
uitspitss/electron_scratchX-digispark
そして、 npm install
で必要パッケージをインストールする。
(package.jsonのelectronは不要であれば、はずしてしまっても大丈夫)
実行
パッケージのインストール後、同ディレクトリの中で node no_electron.js
とすると、
以下のような出力が出てくる。
-master>node no_electron.js Digispark is opened. ACCESS to following URL http://scratchx.org/?url=http://localhost:9911/myscratch.js R:255(100%), G:255(100%), B:255(100%) R:130(51%), G:10(4%), B:8(3%) R:212(83%), G:105(41%), B:222(87%) R:245(96%), G:145(57%), B:161(63%) R:77(30%), G:229(90%), B:171(67%) R:214(84%), G:184(72%), B:222(87%) R:117(46%), G:0(0%), B:26(10%) R:217(85%), G:41(16%), B:102(40%) R:41(16%), G:242(95%), B:224(88%) R:61(24%), G:66(26%), B:194(76%) -master>
実行後に出力されるURLにブラウザ(Chrome推奨)でアクセスすると、
上述したelectronのものと同様の動作をする。
R:~
以下の部分はScratchXで組み込まれたブロッグが実行されると出力されるもの。
終了するときは、Ctrl-C
で終了。
Windows環境においてのelectronとnode-usbの問題
electron
は、使用するパッケージ内部のnode
のバージョンとelectron
内部のnode
のバージョンを合わせるようにパッケージをリビルドする機能がある。
しかし、このリビルドがコケてしまい、electronで起動すると、node-usb
でできなかった。
このあたりは、node-usb
のissuesのあたりに前例はあったけど、VisualStudioのバージョンも噛んだりしていて、私の環境では解決しなかった…
まとめ
技術的なところ
今回は、できるだけnode.jsで使うパッケージを減らす方向で作り始めた。 というのも、下調べ段階で、node.jsとelectronがともにのバージョンアップが頻繁であり、 パッケージのバージョン違いでビルドが失敗しているのをよく見かけたため。
javascriptのコードがES6の書き方をしているのもあれば、 ES5?の書き方をしているもあるのは、そのせい。
思ったこと
最近では、Arduinoなどを使えば、ハードウェアに飛び出していけるものが簡単に作れるようになった。 しかし、それを使うには、プログラミングをする環境をそろえたり、そこに出てくる問題を解決したりしなければいけない。 それがプログラミングのおいしいところにたどり着くまでの障害になっていることもよくある。
そこで、使い方によっては、繰り返し処理(for,while)や条件分岐(if,else)などの深いところまで 使うことができる、ScratchXをベースとして、手軽にプログラミングを楽しみたい。楽しませたいのである。 特にハードウェアに結果が出力されるものは、個人的におもしろいと感じるので、Digisparkを使っている。
最後に、node.jsやelectronに詳しい方は、ぜひ、Windowsバージョンのバイナリ化に挑戦してみてください! 成功しましたら、ご連絡いただけると大変うれしいです。
ダ○ソーで売っていたLEDランプの外装をランプカバーにすると、かわいい。
参考にしたサイト
ティアマト彗星に類似した彗星
最近、映画「君の名は。」が話題になっていますね。 新海誠さんの作品と言えば、「ほしのこえ」を始めとして、作中に宇宙に関するものやSF要素が散りばめられているのが印象的です。 そういえば、私がJAXAの前身であるNASDAを初めて知ったのは、「秒速5センチメートル」を見た時だったかもしれません。
さて、今回の「君の名は。」では、この記事のタイトルにある、ティアマト彗星が物語の鍵として描かれています。そこで、ふと、「こんな彗星あるのかな?」という疑問が浮かんだので、さらっと調べてみました。
作中で描かれているティアマト彗星は、1200年周期で太陽を公転し、軌道長半径は168億km以上とのこと。簡単に、ケプラーの法則で軌道長半径を確認してみると、
(それぞれ文字については一般的に使われている意味と同じなので、ここでの説明は割愛します。) さらに、この式に対して、、Pに1200年を当てはめてみると、
軌道長半径 a は確かに168.9億kmとなります。
地球の公転軌道の約100倍、海王星の公転軌道の約3倍強の軌道長半径です。遠いですね。
さて、そのような彗星はあるのでしょうか。ここで、NASA/JPLのSmall-Body Database Search Engineの出番です。 Cometに限定してテーブルを出力。そのテーブルから公転周期が1100年から1300年までのものを抽出すると、以下の通りでした。
彗星名 | 軌道長半径(億km) | 周期(年) |
---|---|---|
C/2016 N4 (MASTER) | 162.3349711 | 1125.873107 |
C/2014 C3 (NEOWISE) | 162.6250627 | 1128.892347 |
C/2010 E1 (Garradd) | 165.5987407 | 1159.99698 |
C/2012 T4 (McNaught) | 170.0622661 | 1207.211201 |
C/2015 F4 (Jacques) | 174.5471269 | 1255.27931 |
これらの彗星名でググると、おそらく吉田誠一さんのHPが引っかかると思います。 そこで、彗星の画像など、それぞれの彗星について詳しく見られます。 中でも「C/2016 N4」は2ヶ月前に発見報告がされている旬な彗星です。
長周期の彗星は、何かロマンがあって素敵ですよね。 今回のテーブルでは、あの百武彗星は周期が108303年になっていました。 人類は再び、百武彗星を見ることができるのでしょうか…
今回は、いつもと逆で小説を読んでから、映画を見に行こうと思っていて、 小説は昨日読み終わったので、今度映画を見に行こうと思います。