如果预期的计划报告电子邮件尚未到达,请收到警告

时间:2011-01-14 08:41:22

标签: reporting-services gmail scheduling

我(就像大多数科技管理员一样)我的收件箱中的预定服务有很多状态信息。但是,当一个服务电子邮件失败时,显然没有发送电子邮件。所以我只想要一个服务查看我的收件箱,说“嘿,这个服务昨天没有发送电子邮件报告 - 有些事情错了!”。

这个应该在某个地方解决我猜。也许Gmail(或其他一些电子邮件提供商)提供此类服务,这将是很棒的。

2 个答案:

答案 0 :(得分:3)

像Nagios这样的集中式监控解决方案,如果配置的方式只是在服务错过心跳,达到高水位,耗尽燃料时发出通知,那么这不是一个更好的选择吗?然后关闭监控主要监控解决方案的第二个监控解决方案......

http://www.nagios.org/documentation

我不知道您描述的任何服务,但手动例程可能是这样的:

有一个像这样的文件夹/标签结构:

Services\Hourly-[NumberOfServices] (or add a folder per service)
Services\Daily-[NumberOfServicves]
Services\Weekly-[NumberOfServicves]
Services\Monthly-[NumberOfServicves]

为传入邮件制定规则,以过滤每个特定服务通知,并根据预期时间将其移至正确的文件夹。

每小时唤醒并检查您的每小时文件夹中是否有未读消息。未读的数量应与文件夹中提到的NumberOfServices相同。读取/处理它们并确保将它们全部标记为已读。任何没有通过电子邮件发送的服务都很容易被发现。

在0:00唤醒并检查Daily文件夹中是否有未读邮件。等等。

在0:00和周六唤醒并检查您的Weekly文件夹中是否有未读消息。等.....

在本月的第一天0:00唤醒并检查Weekly文件夹中是否有未读消息。等等等......

我的建议是减少服务产生的噪音。

如果您仍然觉得需要服务,我只能提供一个非常基本的.Net实现,大致基于上述过程并使用gmail ... 这也可以移植到powershell ......

static void Main(string[] args)
        {
            var resolver = new XmlUrlResolver
            {
                Credentials = new NetworkCredential("yourgoolgeaccount", "yourpassword")
            };

            var settings = new XmlReaderSettings();

            settings.XmlResolver = resolver;

            var xr = XmlReader
                .Create("https://mail.google.com/mail/feed/atom/[name of your filter]"
                , settings);

            var navigator = new XPathDocument(xr).CreateNavigator();

            var ns = new XmlNamespaceManager(new NameTable());
            ns.AddNamespace("fd", "http://purl.org/atom/ns#");

            var fullcountNode =  navigator.SelectSingleNode(
                "/fd:feed/fd:fullcount"
                , ns);

            Console.WriteLine(fullcountNode.Value);

            int fullcount = Int32.Parse(fullcountNode.Value);
            int expectCount = 10;

            if (expectCount > fullcount)
            {
                Console.WriteLine("*** NOT EVERY ONE REPORTED BACK");
            }
}

答案 1 :(得分:2)

您提到了Gmail,因此您可能对googlecl感兴趣,它可以为Google日历和文档等内容提供命令行控件。很遗憾,他们还不支持Gmail,但如果您的长期偏好是使用Gmail帐户作为状态报告的中心,那么googlecl可能是您的最佳选择。

在短期内,您可以使用日历,Blogger或文档的命令立即尝试googlecl,所有这些命令都已受支持。例如,这些命令会将事件添加到Google日历中:

google calendar add --cal server1 "I'm still alive at 13:45 today"
google calendar add "Server 1 is still alive at 2011-02-08 19:43"

...并且这些命令查询日历:

google calendar list --fields title,when,where --cal "commitments"
google calendar list -q party --cal ".*"

考虑到这一点,您甚至可能会发现日历,Blogger或Google文档比Gmail更适合跟踪状态更新。例如,电子表格或日历格式应该可以更轻松地生成给定服务启动或停止时的图形表示。

您仍然需要编写一个使用googlecl查询日历(或博客,或文档等)的小程序,但是一旦您拥有简单的命令行,其余的应该非常简单。以下是有关googlecl的更多信息的链接:

http://code.google.com/p/googlecl/

如果您真的想使用Gmail,并立即使用它,它们会提供IMAP界面。使用IMAP,您可以执行许多简单的操作,例如确定是否存在包含指定主题行的消息。这是了解细节的好地方:

http://mail.google.com/support/bin/answer.py?hl=en&answer=75725

以下是一个使用IMAP和Python列出最新的十封电子邮件的快速示例,这些电子邮件具有给定的Gmail“标签”:



import getpass, imaplib
# These gmail_* utilties are from https://github.com/drewbuschhorn/gmail_imap                                                                                                   
import gmail_mailboxes, gmail_messages, gmail_message

# Update these next lines manually, or turn them into parms or somesuch.                                                                                                        
gmail_account_name = "your_user_name@gmail.com" # Your full gmail address.                                                                                                      
mailbox_name = "StatusReports" # Use Gmail "labels" to tag the relevant msgs.                                                                                                   

class gmail_imap:
    def __init__ (self, username, password):
        self.imap_server = imaplib.IMAP4_SSL("imap.gmail.com",993)
        self.username = username
        self.password = password
        self.loggedIn = False
        self.mailboxes = gmail_mailboxes.gmail_mailboxes(self)
        self.messages = gmail_messages.gmail_messages(self)
    def login (self):
        self.imap_server.login(self.username,self.password)
        self.loggedIn = True
    def logout (self):
        self.imap_server.close()
        self.imap_server.logout()
        self.loggedIn = False

# Right now this prints a summary of the most-recent ten (or so) messages                                                                                                       
# which have been labelled in Gmail with the string found in mailbox_name.                                                                                                      
# It won't work unless you've used Gmail settings to allow IMAP access.                                                                                                         
if __name__ == '__main__':
    gmail = gmail_imap(gmail_account_name,getpass.getpass())
    gmail.messages.process(mailbox_name)
    for next in gmail.messages: 
      message = gmail.messages.getMessage(next.uid)
      # This is a good point in the code to insert some kind of search                                                                                                          
      # of gmail.messages.  Instead of unconditionally printing every                                                                                                           
      # entry (which is what the code below does), issue some sort of                                                                                                           
      # warning if the expected email (message.From and message.Subject)                                                                                                        
      # did not arrive within the expected time frame (message.date).                                                                                                           
      print message.date, message.From, message.Subject
    gmail.logout()

如代码注释中所述,如果该邮箱中的最新邮件不包含预期的邮件,则可以对其进行调整以发出某种警告。然后每天运行一次Python程序(或者您需要的任何时间段),以查看是否从未收到过预期的电子邮件。