在Haskell中使用simplemail会导致损坏的管道错误

时间:2015-06-03 01:04:53

标签: excel email haskell

我有一个Haskell程序,我在一年前写过,直到几个月前一直运行良好。

改变了什么?该程序使用SpreadsheetML(我是其中的贡献者)构建一系列Excel报告文件,并将其作为附件发送给用户列表。该程序由逗号分隔的文本文件控制,其中每行代表一个报告,包含报告标题,数据库关键字列表(以|分隔)和收件人电子邮件地址列表(也以|分隔)。

三个月前,该文件进行了重组,以更改生成的报告以及分发给谁。从那时起,文件中的一行正在以管道错误的方式查杀程序。程序的错误消息是:

CreateExcel: fd:7: hPutBuf: resource vanished (Broken pipe)

程序接受命令行参数来控制是否发送报告。如果此参数为False,则永远不会调用sendReport方法(下面),也不会报告错误。因此,我相信在调用sendReport之前的一切都是可靠的。以下是产生错误的代码:

makeAddress :: String -> Address
makeAddress addr = Address Nothing (T.pack addr)

sendReport :: String -> [String] -> String -> IO ()
sendReport file to title = do
    simplemail <- simpleMail (Address Nothing (T.pack "")) 
                       (Address Nothing (T.pack "")) 
                       (T.pack ("CDC/Groth Training Report: " ++ title)) 
                       (L.pack ("The attachment contains your training report for" ++ title ++ "."))
                       (L.pack ("The attachment contains your training report for <u>" ++ title ++ "</u>."))
                       [(T.pack "application/xml", file)]
    let mail = simplemail { mailFrom = Address (Just (T.pack "Order Fulfillment")) (T.pack "order_fulfillment@brindlewaye.com"), 
                            mailTo   = map makeAddress to, 
                            mailCc   = [], 
                            mailBcc  = [Address (Just(T.pack "Dave Smith")) (T.pack "dave@brindlewaye.pair.com")] }

    mailStream <- renderMail' mail
    sendmail mailStream

报告错误时,电子邮件确实已发送,但没有Excel文件附件。此外,在报告错误后,程序退出并且其下面没有任何行被处理。

导致崩溃的报告驱动程序文件中的行是:

Sales-Europe-Africa, Sales/Thijssen|Sales/Pecqueur|Sales/van den Bos|Sales/Zuyderduyn|Sales/Marksman, user1@example.com|user2@example.com

...转换为&#34;销售 - 欧洲 - 非洲&#34;的报告标题。以及数据库关键字和电子邮件收件人列表。如果我将报告标题更改为&#34; TEST&#34;有用;但是,在同一个文件中还有另一行,其中报告标题为&#34; Sales-North-South-Americas&#34;并且该报告运行良好。

有人看到我错过了吗?

1 个答案:

答案 0 :(得分:1)

解决!

通过环形交叉过程,我发现只需从原始源重建应用程序就可以解决问题。要完成重建,我必须重新安装几个依赖项,但原始代码中没有一个字符被更改。

新的可执行文件没有此处报告的问题。感谢大家的建议。