Kindleに朝刊を配達しよう!

プログラマを辞めて、早、10年近く。錆びれた脳を奮い起こして、Kindleにmobiを送信するスクリプトを作ってみました。当時、3流プログラマだったんだよな・・・・

とうわけで、環境的には

  • Powershellの最新版が使えるOS(Windows7だとデフォでOKでした。Xpはわかんない)
  • .net framework 2.0以上(最新版入れておけ)
  • メール送信がSMTP経由であること(Hotmailとかはだめ。プロバイダの設定を確認してね)
  • メール送信にTKMP.DLLを使います(スクリプトと同じディレクトリに入れておいてください)

原理的には簡単です。Yahoo pipeで取得したニュース系RSSをFeedbooksでmobiに変換できます。それをダウンロードして@free.kindle.comに添付ファイルとしてメール送信する。このタスクをWindows7標準のタスクスケジューラに登録して毎朝実行。Wifi接続を設定しておいたKindleを朝起きて顔を洗う前に電源を入れておけば、歯磨きが終わる頃に自動でニュースをダウンロードしてくれます。Wifi経由なら通信料はかからないよね、エコだよね。

では本体。エラー処理とかいい加減なのは・・・・

Param([String]$dldir=’temp’, [String]$file=’list.dat’)
#スクリプト実行時の引数。指定しない場合は上記のデフォルト値

#スクリプトのpathを取得
$scriptpath = $MyInvocation.MyCommand.Path

#ディレクトリ分離
$scriptdir =  Split-Path $scriptpath –Parent

#スクリプトのディレクトリからテンポラリディレクトリ名の作成
$tempdir = Join-path $scriptdir  $dldir

#もし無かったら、ディレクトリ作成
if( -not (Test-Path $tempdir)){
“ディレクトリを作成しました”
New-Item -path $scriptdir -name $dldir -type directory
}

#ダウンロードするURLが記述してあるファイル名の生成
$file= Join-path $scriptdir $file

#送信先(freek.kindle.com)を設定してください
$ToAddress = “ユーザ名@free.kindle.com”

#smtpサーバー
$server = “使用しているメールのSMTPサーバ名”

# 差出人(Kindle側でも許可しておいてください)
$FromAddress = “差出人@xxxx.ne.jp”

#SMTPに接続するときのユーザー名
$smtpuser = “SMTP認証のユーザ名”

#SMTPに接続するときのパスワード
$smtppass = “SMTP認証のパスワード”

#SMTPのポート(メールソフトの設定を確認)
$smtpport = 465

#TKMP.dllを使えるように読み込み(スクリプトのディレクトリから)
Add-Type -Path  (Join-path $scriptdir “TKMP.dll”)

#メールオブジェクトの作成
$mail = New-Object TKMP.Writer.MailWriter

# ファイルをダウンロードするためのWebClientオブジェクトを生成
$cli = New-Object System.Net.WebClient

# ファイルリストから順にURLを抽出
foreach($url in Get-Content $file){
#1文字目が#ならスルー
if ($url[0] -eq “#”) { continue }

###### mobiのダウンロード
try{
# URLからファイル名を取り出し、変数$filenameにセット
$uri = New-Object System.Uri($url)
$filename = Split-Path $uri.AbsolutePath –Leaf

# 指定されたURLからファイルをダウンロードし、同名のファイル名で保存
$cli.DownloadFile($uri, (Join-Path $tempdir $filename))
}catch{
#dowonload失敗時は次の行を読み込み
continue
}

#ダウンロードしたファイルのフルパス
$dlfile = (Join-Path $tempdir $filename)

######メール送信
#あて先
$mail.ToAddressList.Add($ToAddress)

#差出人
$mail.FromAddress=$FromAddress

# 本文のクラスを作成します
$part = New-Object TKMP.Writer.TextPart(“”)

#添付ファイルのパートを作成(ダウンロードしたファイルを添付)
$part2 =  New-Object TKMP.Writer.FilePart( $dlfile)

#本文と添付ファイルを持つ、マルチパートクラスを作成
$multipart = New-Object TKMP.Writer.MultiPart($part , $part2)

#送信メール作成クラスに本文としてマルチパートを登録
$mail.MainPart = $multipart;

# 相手のメーラーで「差出人」として表示
$mail.Headers.Add(“From”, “”)

# 相手のメーラーで「あて先」として表示されます
$mail.Headers.Add(“To”, “”)

# メールの件名
$mail.Headers.Add(“Subject”, “”)

# 付加情報など メーラの名前とか
$mail.Headers.Add(“X-Mailer”, “TKMP Version 2.0.0”)

# SMTPサーバーへ接続
# SMTPサーバーを利用する場合に認証設定
$logon = New-Object TKMP.Net.AuthLogin($smtpuser, $smtppass)
$smtp  = New-Object TKMP.Net.SmtpClient($server, $smtpport, $logon)

#SMTPの接続にSLLを使います。環境に合わせて変更を
$smtp.AuthenticationProtocol  =  “SSL”

# 接続
if ( $smtp.Connect() -eq $false ) {
“接続に失敗しました。”
}else {
$smtp.SendMail($mail)
$dlfile + “メールを送信しました”
}
# サーバーから切断します
$smtp.Close()
#ダウンロードしたmobiファイルの削除
Remove-Item $dlfile
}

手で整形したので間違っていたらごめんなさい。普通の人はどーやって書いているのか不思議。あ、メールを送信する度にSMTP接続しているから、直したほうがいいね。

内容的には

  1. スクリプトのあるディレクトリに”temp”フォルダを作成し
  2. そこにスクリプトのフォルダにある”list.dat”の中に記述してあるURLからファイル(mobi)をダウンロード
  3. それをSMTPで@free.kindle.comを送信し、ファイルを削除

当方のプロバイダではSMTP認証をSSL通信でやっています。ただ、Netscapeのメールを使っている人のために平文認証をやっていてw、そちらでも動作しました。AuthenticationProtocol  とポート番号等を環境に合わせて設定してください。

ちなみに”list.dat”の内容は

# NIKKEI Web刊 / 日経Web
http://www.feedbooks.com/feed/25952.mobi
# SankeiBIZ / サンケイビズ
http://www.feedbooks.com/feed/24661.mobi
# YOMIURI ONLINE / 読売新聞
http://www.feedbooks.com/feed/24574.mobi
# INTERNET Watch
http://www.feedbooks.com/feed/24656.mobi
# 各紙社説
http://www.feedbooks.com/feed/16478.mobi
# CNN
http://www.feedbooks.com/feed/24652.mobi
# Number 1ページ目だけw
http://www.feedbooks.com/feed/30595.mobi

さて、さらに面倒くさいことにWindows7のデフォルトの環境ではPowershellスクリプトを実行できません。ポリシーを変えてスクリプト実行するバッチファイルを作成しました。

Powershell -command “& {Set-ExecutionPolicy remotesigned -Force}”

REM スクリプトのフルパス tempディレクトリ名
powershell “Z:DownloadWindows7Kindleスクリプトsendmobi.ps1” “temp”

Powershell -command “& {Set-ExecutionPolicy restricted -Force}”

このバッチファイルををタスクスケジューラに最上位の特権で実行するで登録します。バッチファイルを手動で動かすときには右クリックの管理者として実行してください。

最後に、参考にしたサイトと久しぶりにプログラミングもどきというか他人のコードを合体させた感想を

しかし、メーラもいろんなプロトコルをサポートしなくちゃいけないんで大変ですな。そもそもSMTPに最初っから認証システムがついていればよかったのにね。昔と比べてネットに転がっているコードが多くて助かりますわ。

では、これが快適なKindleライフにとって少しでも参考になれば幸いです。

カテゴリー: コンピューターとインターネット, kindle タグ: パーマリンク

コメントを残す