InterFAXを使用したFAX送信機能の実装
先日、弊社のRailsアプリケーションにFAX送信機能を実装しました。
「なぜ今さらFAX?」と思うかもしれませんが、医療機関では薬局に処方箋を送信する際にFAXがよく使われています。
処方箋を印刷して手動でFAX機から送信する従来の方法はかなり手間がかかるため、システムから直接FAXを送信できるようにすることで、作業を効率化しました。
実装にはInterFAXというサービスのAPIを使用しましたので、この記事ではその具体的な実装方法について説明します。
InterFAXとは
InterFAX とは、インターネットでFAXを送受信できるサービスです。
RESTやSOAPでのAPIも提供されており、Rubyや他の言語のSDKも提供されています。
日本語でのサポートやドキュメントも充実しているため、導入が簡単にできるサービスです。
弊社のシステムでは、TwilioというサービスでSMSの送信などを実装していたため、TwilioのFAXサービスを検討していましたが、2021年にサービスの提供が終了していました。そこで他の似たようなサービスを検討し、ドキュメントやAPIの提供が充実しているInterFAXを利用することにしました。
実装方法
こちらのドキュメントにRubyでのFAX送信についてサンプルコードと一緒にわかりやすく記載されています。
interfaxのgemをインストールした後に、以下のように書くだけで簡単に送信機能は実装できました。
interfax = InterFAX::Client.new(username: "USER_ID", password: "PASSWORD")
fax = interfax.deliver(
faxNumber: "+11111111112",
file: 'path/to/fax.pdf'
)
送信はこれだけで完了ですが、送信が成功したか失敗したかどうかがすぐにはわからないので、送信結果が出るまでAPIを繰り返し実行する必要があります。
ドキュメントには以下のように記載されています。
loop do
# reload the fax data
fax = fax.reload
# sleep if pending
if fax.status < 0
sleep(1)
else
# output on success or error
if fax.status == 0
puts "Sent!"
else
puts "Error: #{fax.status}"
end
break
end
end
ただFAXの送信は、送信するページ数や送信先の環境に依存するため、時間が結構かかることが多いです。
今回の開発では、リアルタイムですぐに結果を知りたいわけではなかったため、5分おきに実行するバッチ処理で結果を確認することにしました。
具体的には、fax_logsのようなテーブルにInterFAXのidとstatusを保存し、まだ送信結果が出ていないFAXを一括でInterFAXのAPIで問い合わせて取得するようにしました。
pending_faxes = FaxLog.where(status: :pending)
interfax = InterFAX::Client.new(username: "USER_ID", password: "PASSWORD")
interfax_ids = pending_faxes.pluck(:interfax_id)
# 送信済みのFAXの情報を一覧で取得
sent_faxes = interfax.outbound.completed(interfax_ids)
sent_faxes.each do |sent_fax|
fax = pending_faxes.find { |f| f.interfax_id == sent_fax.id.to_s }
fax_status = sent_fax.status
next if fax_status < 0
if fax_status == 0
# FAX送信成功時の処理
fax.update!(status: :success)
else
# FAX送信失敗時の処理
fax.update!(status: :failed)
end
end
動作確認
InterFAXでは挙動確認用のFAX番号が用意されているので、その番号を使ってFAX送信、失敗をテストで実行することもできます。
FAXの送信エラーには、「受信側FAX機から応答なし」や「不正なFAX番号/回線異常(現在使用されていない電話番号)」、「相手が無応答のためタイムアウト」など結構パターンがありますが、電話番号を変えるだけでその結果をシミュレートできるので、開発後の動作確認がやりやすかったです。
また、InterFAXにはGUIで見ることができる管理画面が用意されているため、そこで現在の送信状況や送信結果を確認することもできました。もし送信失敗した場合は、その画面で再送信もできるようです。
まとめ
InterFAX APIを使用することで、Railsアプリケーションから直接FAXを送信する機能を簡単に実装することができました。
他にもメールを使用したFAXの送受信機能や、FAX受信システムのAPIなども提供されているため、機会があれば使ってみたいです。
参考
Discussion