はじめてrubyを業務で使ってみました
先日に携わっているサービスでメールが届かないというお問い合わせを頂いたとのことで調査してみることにしました。
まずは、メールの送信ログですよね。
該当のアドレスに送信されているのかを確認するとログには残念な結果が書かれていました。。。
blockされている。。。
対応自体がはじめてだったのでいろいろ調べてみるとメール送信先のサービス側ではじかれていて、そのメール送信先のサービスが利用しているブラックリストサービスでブラックリスト登録されたということらしい。
解決策は登録されているホストの解除依頼をブラックリストサービスに依頼すればいいみたいなんですが根本的になんで登録されたのかもわかっていない、、
更にはネットで調べた解除フォームにたどり着けないということでまずはなんでかを確認することにしました。
結果は意外と簡単でサービスに登録されていたアドレスが適当なものでもアドレス形式であればOKだったので、結果的に宛先不明メールを送っていることになり、それでスパム扱いで登録されたんだと思われます。※サービス作りが悪いですね。。
であれば宛先不明のメールを送信しないようにサービスに導入しないとまたブロックされてしまう。。
そこでバウンスなどの管理をできないかと調べて出てきたのが
sisitoとsisimai
というツール
sisitoは獅子唐のアイコンで気に行ってしまったのですがこちらはsisimaiで解析した結果を表示して管理するグラフィカルツールで結果的には使いませんでした。
sisimaiはバウンスメールなどをインプットして解析してアウトプットしてくれるのでこちらを使うことに。
sisimaiがrubyかperlなのでrubyを選択した結果、抽出後のアドレスに対して処理は書かなければならないのではじめて実践的なrubyを使ってみる事になったというなんとも前置きが長くなりましたが、以下は今回使ってわかったrubyの箇条書き程度のメモです。
今回は特の難しくはなくまずは宛先不明メールの解析がバウンスのメールボックスにはなく、deferredのフォルダにあったため、これをそのまま解析できなかったのでテキストファイルにして読み込んでDB保存して、サービスの方のアドレスを無効とする処理までです。
まずはdeferredを検索してキューIDでキューの内容をテキストファイル化するところです
target = Dir.glob '/path/deferred/*/*'
if target.is_a?(Array)
target.each do |filename|
sp_path = filename.split("/")
queue_id = sp_path.last
`sudo postcat -q #{queue_id} > ~/mail/deferred/#{queue_id}.txt`
end
end
まずはdeferred以下にあるキューIDでバイナリファイル化されているものを検索してそのキューIDでpostcatで出力してそれをファイル化してみました。
#! /usr/bin/env ruby
require './sisimai_local'
require './setting'
sisi = SisimaiLocal.new
f = Dir.glob $deferred_dir + '/*'
if f.is_a? Array
f.each do |fname|
sisi.require_file(fname)
result = sisi.get_mail.count > 0 ? sisi.check_mail() : nill
result ? sisi.insert_address() : nil
end
end
次にテキスト化したものをsisimaiにかませてアドレスを抽出してデータベースへ登録しているんですがせっかくなのでクラス化してみたのでこれだとよくわかりませんね。
かませるsisimaiの関数がこちら
require 'sisimai'
Sisimai.make(filename)
$deferred_dirはテキスト化したファイルで一覧を取得してループしています。
そのファイル名とパスでsisimaiに噛ませた結果をローカルのsisimaiクラスで保存しています。
sisi.check_mailはuserunknownか確認していてもしそうであるならDB登録するというものです。
ちょっとクラス化したところもあるので全体がわからないのですが、rubyではじめてファイルの検索、文字列分割、DB接続、ループや三項演算子などを使ってみた記事でした。
見えてないところもあるのでまとめ
ファイル検索
Dir.glob '/path/*'
文字列分割
text.split("/")
DB接続(Mysql2)
require 'mysql2'
connection = Mysql2::Client.new(
:host => @@host,
:username => @@username,
:password => @@password,
:database => @@database
);
クエリの実行
query = %q{insert into tablename value(?, ?, ?, ?) }
statement = connected.prepare(query)
result = statement.execute(1, 2, 3, 4)
日付関数
datetime = DateTime.now.strftime("%Y-%m-%d %H:%M:%S")
ループ
names.each do |name|
puts name
end
今回はこんなことを学びました!
たまたま実務に関連したので触れましたが自分でももっと使っていきたいと思います!!
コメント
コメントを投稿