![仅使用第一封未读电子邮件向外部地址发送新邮件通知](https://linux22.com/image/581188/%E4%BB%85%E4%BD%BF%E7%94%A8%E7%AC%AC%E4%B8%80%E5%B0%81%E6%9C%AA%E8%AF%BB%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E5%90%91%E5%A4%96%E9%83%A8%E5%9C%B0%E5%9D%80%E5%8F%91%E9%80%81%E6%96%B0%E9%82%AE%E4%BB%B6%E9%80%9A%E7%9F%A5.png)
我正在运行一个带有联系表单的网络服务器,它会触发一个 php 脚本将消息发送到服务器上的本地帐户,并且我希望在收到新消息时在我的常规电子邮件帐户上收到通知。
我可以对每封电子邮件发送通知,或者直接将电子邮件发送到我的帐户,但这样太多了:我只希望每次收件箱中的未读邮件从 0 封变成 1 封时,都向我的电子邮箱发送“您有新邮件”的通知。
Google 把我埋在 sendmail 文档中,但仍然找不到任何关于它的信息。
有任何想法吗?
答案1
我利用 .forward 文件来实现这一点。
优点:非常简单。
缺点:每收到一封电子邮件,就会有 1 封“ping”电子邮件。因此,如果我在检查之前收到 5 封电子邮件,那么我的其他邮箱中就会收到 5 封 ping。可以使用脚本(例如 send_notification_if_no_new_mails())来解决此问题。
.forward 文件:
\username
|"echo 'New email just arrived.' | mailx -s 'new message on the server' [email protected]"
第一行是您的本地帐户,前面有一个反斜杠,以防止循环。这确保了本地交付。第二行执行脚本。在这种情况下,它直接调用 mailx 来触发 ping 电子邮件。您可以运行类似于 send_notification_if_no_new_mails() 的脚本来限制发送的 ping。
答案2
您可能想要编写某种 cron 任务。
例如,您可以用 Python 或 PHP 编写一些程序,每分钟运行一次,使用 IMAP 登录邮箱,检查等待消息的大小是否已更改,如果是,则向您发送通知电子邮件。
让 Sendmail 本身执行此操作将会带来更多麻烦。
顺便说一句,为什么你不将联系表单中的电子邮件同时发送到本地帐户和你的真实帐户呢?
答案3
你需要写一个类似 biff 的程序,比如 xbiff 或者 xbiff2。你应该记录以下状态:全部已读、未读邮件未发送、未读邮件已发送。
因此,现在您必须编写一个脚本,由 cron 每 30 分钟运行一次,检查您的邮箱(通过 POP3、IMAP 甚至直接检查)并询问是否有新邮件。如果有新邮件,您必须知道是否已发送通知邮件。如果您有新邮件但尚未发送通知,请发送通知并将事实记录在“标志”文件中。如果您有新邮件并且文件存在,请不要发送电子邮件。如果没有新邮件并且文件存在,请将其删除。
答案4
如果有人感兴趣,这里有一个基本示例,其中包含我在 .php 联系表单脚本中包含的代码,通过调用mail -f /var/mail/www-data -e
,可以完成我想要的操作。这不是我正在寻找的解决方案,但结果相同:
基本联系表和邮件脚本:
<?php
require_once 'send_notification_if_no_new_mails.php';
if (isset($_POST['subject'])&&isset($_POST['message'])){
send_notification_if_no_new_mails();
mail("www-data",$_POST['subject'],$_POST['message']);
}
?>
<!doctype html><html>
<head><title>contact form</title></head>
<body><form method='post'>Subject:<input name='subject' type='text' /><br />
<textarea name='message'>Type here your message.</textarea>
<input type='submit' value='send'/></form></body>
</html>
检查并在必要时发送通知的功能:
<?php
function send_notification_if_no_new_mails(){
exec('mail -f /var/mail/www-data -e',$output,$return_var);
if ($return_var=='0') {
/* There's already new mail. Do not send notification. */
return 0;
}
/* There is no new mail but there is going to be now -> Send notification */
$email="[email protected]";
$subject="New message from your webapp";
$msg = "You have a new message from your webapp's contact form";
$msg .= PHP_EOL.PHP_EOL;
/* Common Headers */
$time = time();
$now = (int)(date('Y',$time).date('m',$time).date('j',$time));
$headers = 'From: SYNAPP mailer <[email protected]>'.PHP_EOL;
$headers .= 'Reply-To: noreply <[email protected]>'.PHP_EOL;
$headers .= 'Return-Path: noreply <[email protected]>'.PHP_EOL;
$headers .= "Message-ID:<".$now." admin@".$_SERVER['SERVER_NAME'].">".PHP_EOL;
$headers .= "X-Mailer: PHP v".phpversion().PHP_EOL;
$headers .= 'MIME-Version: 1.0'.PHP_EOL;
$headers .= "Content-Type: text/plain; charset=\"utf-8\"".PHP_EOL;
mail($email, $subject, $msg, $headers);
return 1;
}
?>