我的邮件服务器 (IMAP) 上有大量电子邮件,其中包含附件(PDF 等)。这些附件浪费空间 - 我服务器上的 HDD 空间受到我的托管公司的限制 - 我正在尝试重新获得一些通过删除电子邮件中的附件来占用该空间。 (这些在邮件服务器上是多余的,因为它们几乎都已在本地下载或上传。)
当我使用 Windows 时(很久以前),有一个名为“IMAPSize”的应用程序,它是一个“客户端类型”电子邮件处理程序,可用于登录邮件服务器并操作消息、删除附件等。但我有对于 Unix/Linux,(到目前为止)在易用性和完成工作方面还没有找到任何可比的东西(尽管我们可能有更好、更强大的解决方案——我只是不知道是哪一个。)
我知道 munpack(已在本地安装并使用它)和 ripmime,但在我看来,这些程序旨在处理本地存储的消息、Mbox 或 MailDir。我不会在本地同步我的电子邮件,而是将它们留在我们的服务器上(有很多电子邮件,总共超过 10 万封。)
此外,Munpack 似乎很擅长提取附件,但我还没有找到一种方法可以只删除附件而不破坏邮件本身。
我确实有 Horde、Roundcube 和 SquirrelMail 作为 Web GUI 可用,但同样,我还没有找到仅删除附件的方法。
此外,我正在寻找一种不涉及复杂设置和配置等的解决方案。(我可能梦想/要求太多。)
我想尝试这种方法:使用offlineimap在本地下载并同步我的所有电子邮件,然后可能使用munpack或ripmime删除附件(前提是我能找到一种方法来做到这一点,而不是只提取它们),然后重新-与服务器同步,希望电子邮件能够在没有附件的情况下返回到服务器,但是a)不确定这种方法是否有效,2)再说一遍,我并不是真的想在本地下载数以万计的电子邮件......
我确信有一个适合我的解决方案(也许某种类型的客户端类型 GUI 应用程序可以让我在服务器上操作电子邮件/删除附件;或者其他一些不太复杂的方法。)
注意:我不使用 Thunderbird,也不想安装或使用它;葡萄酒也是如此。我尽可能使用占用空间较小的应用程序来使我的盒子保持“最小化”。
感谢您指出正确的方向。
答案1
我有以下 perl 代码,它从标准输入中删除所有附件并返回标准输出,这可能会有所帮助:
#!/usr/bin/perl -w
use strict;
use Mail::Audit;
use Mail::Audit::Attach qw(Attach);
my $mail = Mail::Audit->new;
my $attachments = $mail->attachments;
foreach (@$attachments)
{
$_->remove;
}
$mail->print();
而不是对 Maildir 中的文件进行简单循环,例如您想要删除附件:
for filename in <list>
do
./strip.pl < "$filename" > "$filename".lock && mv "$filename".lock "$filename"
rm "$filename".lock
done
一个有趣的修改可能是首先提取附件并单独存储它们,然后再从邮件中删除它们:
foreach (@$attachments)
{
$_->save("/path/to/attachment/dir");
$_->remove;
}
不过,请先进行备份;)
答案2
我试过IMAP大小同样,但它不再受支持,有时会崩溃,并留下似乎应该删除的消息。还有取消附加为 GMail 用户提供的应用程序,尽管我不能保证它。
为了自己解决这个问题,我制作了一个可能有用的 python 脚本:IMAP 大小缩减器
每次运行它都会作用于一个指定的文件夹。只要您知道如何在命令行上运行 python 脚本、如何登录服务器(URL、用户名、密码)以及 IMAP 文件夹规范(例如“INBOX.Sent”),它就应该适用于任何 IMAP文件夹。 (如有必要,您的 ISP 可以帮助您提供这些详细信息。)
您可以指定“最大所需邮件大小”(即“如果邮件大于此大小,则删除附件,直到其低于此大小”)和“可容忍的部分大小”(即“如果单个邮件部分低于此大小” ,无论邮件整体大小如何,都不要删除它”)。
以下 MIME 类型被视为删除部分的候选类型:
Anything with Content-Disposition "attachment"
Content-Type image/*
Content-Type audio/*
Content-Type video/*
Content-Type music/*
Content-Type x-music/*
Content-Type application/*
它尚未在各种电子邮件提供商上经过严格测试,但对我来说效果很好。有关使用详情,请参阅网页。
答案3
您可以使用 Thunderbird 和 AttachmentExractor 插件来实现此目的。只需将您的邮件帐户添加到 Thunderbird,然后启动 AttachmentExtractor。它可以删除附件的内容,同时保留邮件中的附件文件名。
答案4
删除服务器上的附件非常容易,它们只是(文本)文件。 - 分配带有附件的邮件(通常是较大的邮件):
find -P /home/*/mail/*/*/* -mindepth 1 -maxdepth 1 -name "*=*" -size +2M -mtime '+367'
它在带有邮件目录的 WHM 服务器上 100% 正常工作,未使用 mbox 进行测试
- 循环遍历文件
if grep -e '------=_' ${file};
# 包含字符串....然后- 根据共同标准拆分电子邮件,例如:
csplit --prefix=split4mail2clean. -z ${file} /commonstring/
- 在您字符串的分割文件中分配/查找,附件将有一些典型的字符串,删除这些部分
- 以相反的顺序加入剩下的临时拆分文件(没有典型附件的文件)以重建原始电子邮件
- 重新应用修改时间戳
- 如果需要的话,在这里做其他事情
为了成功,您可能需要 3、4 个可能的更多 IF 条件,如果文件包含此字符串,则删除...从临时文件夹中运行推荐的 shell 脚本,调整大小和其他搜索条件。是的,我有一个工作脚本,在大约 40000 个邮件文件上进行了测试,在指定的搜索和删除条件内,它留下了 0 个附件。