web-dev-qa-db-ja.com

特定の送信者からの電子メールの添付ファイルを自動的に印刷する

添付ファイル(PDFファイルとしての請求書)が追加の確認やポップアップなしで自動的に印刷されるように、Thunderbirdで受信メールをフィルタリングしたいと思います。

電子メールの本文は印刷せず、添付のpdfファイルのみを印刷してください。

添付ファイルの自動印刷を実現する方法はありますか?

FilterQuilla を使用してみましたが、これを使用すると、電子メール自体のみを印刷でき、添付ファイルは印刷できません。

ここスーパーユーザーには 関連する質問 がありますが、手動で選択したメッセージのすべての添付ファイルを一括/バッチ印刷するように求められます(回答はありません)。 1つの送信者の電子メールアドレスからのすべての受信電子メールの添付ファイルを具体的に印刷したいと思います。

Thunderbirdベースのソリューションがあればいいのですが、これは必須ではありません。 Thunderbirdでいくつかのフィルターを使用し、電子メールを別の電子メールアドレスに転送して、別の製品からアクセスすることはまったく問題ありません。

ちなみに、私はフリー/オープンソースソリューションを好みます。

1
user1251007

これが問題に対する私の解決策であり、他の答えのいくつかの側面を組み合わせ、それらの制限を克服しています。

このソリューションの利点:

  • オープンソースソリューション、したがって商業的背景にも利用可能
  • 本当に目に見えないサイレント印刷。ウィンドウがポップアップしていません

このアプローチは、いくつかのステップを組み合わせたものです。

  1. ThunderbirdでのFiltaquillaを使用した電子メールのフィルタリングと添付ファイルの抽出
  2. FoxitReaderを介してファイルを印刷するためのpythonスクリプト。 AdobeReaderやGhostscriptなどの他のツールはサイレント印刷に対応していません。AdobeReaderではウィンドウがしばらく表示され、Ghostscriptでもウィンドウがポップアップします。
  3. pythonスクリプトを定期的に実行するためのスケジュールされたタスク

ステップ1

すべてのメールはThunderbirdで Filtaquilla (2019年の時点でThunderbird 52.0-60。*で利用可能)でフィルタリングされます。電子メールの送信者と件名をフィルタリングすると、今のところ十分な「セキュリティ」が提供されます。電子メールはIMAPサブフォルダーに移動されます(何か問題が発生した場合に後で検査するためのアーカイブとして)。 Filtaquillaは、指定されたフォルダー(_C:\invoices_)へのすべての添付ファイルを抽出します。 Filtaquillaでは、添付ファイルの抽出がデフォルトで有効になっていません。必ずFiltaquillaの設定を確認してください。

ステップ2

次のprint.pywを_C:\invoices_に配置します。

_import os
import subprocess
import sys
import glob
import time

foxit = "C:\Program Files (x86)\Foxit Software\Foxit Reader\FoxitReader.exe"
script_dir = os.path.dirname(os.path.realpath(__file__))

# get all pdf files
pdf_files = glob.glob(script_dir + "/*.pdf")

# print each pdf and delete it
for pdf_file in pdf_files:
    command = []
    command.append(foxit)
    command.append("/p")
    command.append("/h")
    command.append(pdf_file)
    proc = subprocess.Popen(command, stdout=subprocess.PIPE)
    time.sleep(10) 
    os.remove(pdf_file)
_

ステップ3

原則として、print.pywファイルはFiltaquillaで実行できます。ただし、フィルターが複数の電子メールを検出した場合、抽出されたpdfファイルが複数回印刷される可能性があります。

これを克服するには、スケジュールされたタスク(アクション:プログラムの実行)が役立ち、10分程度ごとに実行されます。

  • プログラム/スクリプト:"C:\Program Files (x86)\Python36-32\pythonw.exe"
  • 引数:_"C:\invoices\print.pyw"_
  • 実行:_C:\invoices\_

run inフィールドに引用符がないことに注意してください。引用符がない場合、スクリプトは実行されません。また、スクリプトと抽出されたファイルがネットワークドライブにないことも重要です。

0
user1251007

電子メールサーバーがIMAPを使用する場合は、2段階のソリューションを使用できます。

  1. 添付ファイルを新着メールからフォルダにダウンロードする
  2. 新着ファイルがないかフォルダを監視し、印刷します

最初のステップとして、 Mail Attachment Downloader Free Edition などの無料の製品を使用できます。

メール添付ファイルダウンローダーは、検索設定に基づいて、すべてのメール添付ファイルを一度に安全にダウンロードして処理します。すべてのメールをサーバーに残します。メールのダウンロードに現在使用している他のメールプログラムに干渉することはありません。サイズ、ファイルタイプ、送信元、電子メールの件名、日付とタイムスタンプなどのさまざまなフィルターを設定して、ダウンロードするものを指定できます。

2番目の手順では、添付ファイルが指定されたフォルダーに保存されたら、次のPowerShellワンライナーを使用してすべてのファイルを印刷できます。

Get-ChildItem -Path 'C:\Temp\tmp2' -File | ForEach-Object { Start-Process -FilePath $_.Fullname -Verb Print -PassThru | %{sleep 10}}

上記には、Print動詞をサポートするPDF製品がインストールされている必要があります。たとえば、無料の Foxit Reader で、グラフィカル環境(ログイン)は必要ありません。

このPowerShellスクリプトは、.ps1ファイルに保存し、タスクスケジューラで定期的に実行するようにスケジュールできます。

Adobe Readerを使用している場合は、印刷後も最新バージョンが開いたままになることがあります。これは、スクリプトを次のように変更することで解決できます。

Get-ChildItem -Path 'C:\Temp\tmp2' -File | ForEach-Object { Start-Process -FilePath $_.Fullname -Verb Print -PassThru | %{sleep 10;$_} | kill}
1
harrymc
  1. FilterQuillaでフォルダ「AttachmentsToPrint」を作成し、Save Attachments Toをチェックして、そのフォルダを指定します
  2. 60秒待機するバッチ/スクリプトファイルを作成し(FilterQuillaに添付ファイルを抽出してから何かを実行する時間を与えるため)、ファイルを印刷してからファイルを削除します
  3. FilterQuillaでRun Programをチェックし、そのバッチ/スクリプトファイルを指定します
  4. 指を交差させます

このための商用ソフトウェアは確かに存在するため、購入すればリクエストは非常に可能で簡単です。オープンソースは可能性が高いですが、上記よりも複雑です。始めるためのリンクは次のとおりです。 https://blog.thomashampel.com/blog/Tomcat2000.nsf/dx/print-email-attachments-with-a-raspberrypi.htm - https://ubuntuforums.org/showthread.php?t=935489

私が心配している問題は、メールクライアントがない場合、スパム/ジャンクをどのようにフィルタリングして印刷しないかということです。また、抽出添付ファイルが感染を引き起こす可能性があることを少し心配していますが、私はただ妄想しているだけかもしれません。

1
gregg

以下のような(かなり小さい)pythonスクリプトを使用すると、指定した送信者から最初のメッセージを接続して取得し、メッセージを標準出力に出力できます。次に、munpack(Debianのパッケージmpack)添付ファイルを取得して処理できます。

メッセージの解析も実行できます Pythonの場合 つまり、mpackは不要であり、ソリューションはより多くの環境に移植できます。

完了時にメッセージを削除したり、他のタイプの検索を実行したりするなど、その他のオプションについては imaplib を確認してください。

import getpass, imaplib

M = imaplib.IMAP4("yourserver")
M.login("user","password")
M.select("INBOX")
typ, data = M.search(None, 'from','your_sender')

num = data[0].split()[0]
typ, data = M.fetch(num, '(RFC822)')
print 'Message %s\n%s\n' % (num, data[0][1])

M.close()
M.logout()
1