我希望以某种方式过滤 Thunderbird 中收到的电子邮件,以便自动打印附件(pdf 文件形式的发票),而无需额外的确认或弹出窗口。
不应打印电子邮件正文,仅需打印附加的 pdf 文件。
有没有什么办法可以实现附件的自动打印?
我尝试使用过滤Quilla,但这样我只能打印电子邮件本身,而不能打印附件。
有一个相关问题但是,这里超级用户要求批量打印所有手动选择邮件的附件(没有答案)。我想专门打印来自一个发件人电子邮件地址的所有传入电子邮件的附件。
虽然拥有基于 Thunderbird 的解决方案会很好,但这不是必需的。使用 Thunderbird 中的一些过滤器并将电子邮件转发到另一个电子邮件地址,然后由另一个产品访问该地址是完全可以的。
顺便说一句,我更喜欢免费/开源解决方案。
答案1
这是我对这个问题的解决方案,结合了其他答案的一些方面并克服了这些答案的局限性。
该解决方案的优点:
- 开源解决方案,因此也可用于商业背景
- 真的隐形、静音打印. 没有弹出任何窗口
该方法包含几个步骤:
- 过滤电子邮件并提取附件菲尔塔基亚在 Thunderbird 中
- Apython 脚本通过打印文件福昕阅读器。其他工具(例如 AdobeReader 或 Ghostscript)无法实现静默打印 - AdobeReader 的窗口会持续显示一段时间,而 Ghostscript 的窗口则会弹出。
- A计划任务定期运行python脚本。
步骤1
Thunderbird 会过滤所有电子邮件菲尔塔基亚(自 2019 年起适用于 Thunderbird 52.0-60.*)。目前,电子邮件发件人和主题的过滤提供了足够的“安全性”。电子邮件将移动到 IMAP 子文件夹(作为存档,以备日后检查,如果出现任何问题)。Filtaquilla 将所有附件提取到指定文件夹(C:\invoices
)。Filtaquilla 默认不启用附件提取 - 请务必检查 Filtaquilla 的设置。
第2步
放置以下内容打印.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\
请注意跑进 字段,否则脚本将不会运行。同样重要的是,脚本和提取的文件是不在网络驱动器上!
答案2
- 创建文件夹“AttachmentsToPrint”,在 FilterQuilla 中检查
Save Attachments To
并指定该文件夹 - 创建一个等待 60 秒的批处理/脚本文件(让 FilterQuilla 有时间提取附件,然后再对其进行处理),然后打印文件,然后删除文件
- 在 FilterQuilla 中检查
Run Program
并指定批处理/脚本文件 - 祈祷吧
当然存在商业软件,因此如果购买,请求是非常有可能且容易的。开源很可能是可行的,但甚至比上述更复杂。以下是一些可能帮助您入门的链接: https://blog.thomashampel.com/blog/tomcat2000.nsf/dx/print-email-attachments-with-a-raspberrypi.htm https://ubuntuforums.org/showthread.php?t=935489
我担心的问题是,如果没有邮件客户端,你如何过滤垃圾邮件/垃圾,这样你就不会打印这些邮件,也有点担心提取附件可能会导致感染,但也许我只是有点偏执
答案3
如果电子邮件服务器使用 IMAP,您可以使用两步解决方案:
- 将新电子邮件中的附件下载到文件夹
- 监控文件夹中是否有新到货并打印出来
第一步,你可以使用免费产品,例如 邮件附件下载器免费版, 被形容为:
邮件附件下载器会根据您的搜索偏好一次性安全地下载和处理您的所有电子邮件附件。将所有邮件保留在您的服务器上 - 它不会干扰您目前用于下载邮件的任何其他电子邮件程序。您可以设置各种过滤器,如大小、文件类型、发件人、电子邮件主题、日期和时间戳,以指定要下载的内容。
对于第二步,一旦附件文件存储在指定的文件夹中,您就可以使用以下 PowerShell 单行命令打印所有文件:
Get-ChildItem -Path 'C:\Temp\tmp2' -File | ForEach-Object { Start-Process -FilePath $_.Fullname -Verb Print -PassThru | %{sleep 10}}
以上内容需要安装支持 Print 动词的 PDF 产品,例如免费的 福昕阅读器,不需要图形环境(登录)。
此 PowerShell 脚本可以存储在.ps1
文件中,并安排在任务计划程序中定期运行。
如果您使用的是 Adobe Reader,则打印后最新版本可能会保持打开状态。可以通过将脚本修改为:
Get-ChildItem -Path 'C:\Temp\tmp2' -File | ForEach-Object { Start-Process -FilePath $_.Fullname -Verb Print -PassThru | %{sleep 10;$_} | kill}
答案4
您可以使用如下所示的(非常小的)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()