sendmail 的 /etc/aliases 中的管道程序

sendmail 的 /etc/aliases 中的管道程序

我正在尝试通过自制脚本进行某种自动订阅。我知道这可以通过 Mailman 之类的邮件列表来实现,但我也想同时学习如何手动完成。

这是简单的脚本:

#!/usr/bin/perl

use strict;
use warnings;

open ("RCV_MAIL", ">>/home/icasimpan/mail_received.txt") or die $!;
while(<STDIN>){
   print RCV_MAIL;
}
close(RCV_MAIL);

我使用以下语法将上述脚本附加到 /etc/aliases 中:

subscribe: | /home/icasimpan/parse-subscribe.pl

并运行

$ sudo newaliases

这仍然是一个非常简单的脚本。只是测试 /etc/aliases 中的语法是否正确。

但当我尝试发送电子邮件时[电子邮件受保护],它返回类似:

Delivery failure 69

我正在使用 Lotus Notes,所以我的谷歌搜索引导我到这个链接。显然,与该文件有关......不确定。

该命令是可执行的,事实上我尝试将其设置为 777,甚至在目录中创建了 mail_received.txt 只是为了确保我没有文件权限问题,但仍然相同。

答案1

如果您正在运行带有 smrsh 设置的 sendmail(在许多默认配置中很常见),您将需要在 /etc/smrsh/ 之外运行管道命令。它可以是符号链接或脚本的副本,但如果 sendmail 定义了“smrsh”,则需要从该目录运行它。例如:

subscribe: | /etc/smrsh/parse-subscribe.pl

查看 smrsh 上的 sendmail 文档以获取更多详细信息。

答案2

如果“别名”中有空格,则需要引用它:

subscribe: "| /home/icasimpan/parse-subscribe.pl"

或删除空格:

subscribe: |/home/icasimpan/parse-subscribe.pl

答案3

open ("RCV_MAIL", ">>/home/icasimpan/mail_received.txt") or die $!;
while(<STDIN>){
   print RCV_MAIL;
}

是错的。

如果您尝试将 STDIN 的行打印到 mail_received.txt,您将需要:

open (RCV_MAIL, ">>/home/icasimpan/mail_received.txt") or die $!;
while (<STDIN>) {
   print RCV_MAIL $_;
}

因为print只有一个参数时,该参数表示要打印的列表,而不是要打印到的文件句柄。

$ perldoc -f print
print FILEHANDLE LIST
print LIST
...

另外,不需要在open.只需使用RCV_MAIL.

相关内容