📠

InterFAXを使用したFAX送信機能の実装

2024/06/27に公開

先日、弊社の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送信、失敗をテストで実行することもできます。

https://www.interfax.jp/users/guide/send_22.html

FAXの送信エラーには、「受信側FAX機から応答なし」や「不正なFAX番号/回線異常(現在使用されていない電話番号)」、「相手が無応答のためタイムアウト」など結構パターンがありますが、電話番号を変えるだけでその結果をシミュレートできるので、開発後の動作確認がやりやすかったです。

また、InterFAXにはGUIで見ることができる管理画面が用意されているため、そこで現在の送信状況や送信結果を確認することもできました。もし送信失敗した場合は、その画面で再送信もできるようです。

まとめ

InterFAX APIを使用することで、Railsアプリケーションから直接FAXを送信する機能を簡単に実装することができました。

他にもメールを使用したFAXの送受信機能や、FAX受信システムのAPIなども提供されているため、機会があれば使ってみたいです。

参考

https://www.interfax.jp/index.html

https://www.interfax.jp/system/error_code.html

Linc'well, inc.

Discussion