使用Haskell中的simplemail会导致"broken pipe"错误。

3
我有一个Haskell程序,一年前写的,一直运行得很好,直到几个月前。发生了什么?该程序使用SpreadsheetML(我是其中的贡献者)构建一系列Excel报表文件,并将其作为附件发送给用户列表。该程序由逗号分隔的文本文件控制,其中每行表示单个报表,包含报表标题、数据库关键字列表(用|分隔)和收件人电子邮件地址列表(也用|分隔)。
三个月前,该文件进行了重构,以更改生成的报表以及分发给谁。从那时起,该文件中的一行导致程序出现了一个“broken pipe”错误。程序的错误信息如下:
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

...这段文字中提到了一个报告标题为“销售-欧洲-非洲”,并列出了数据库关键词和电子邮件收件人。如果我将报告标题更改为“测试”,它可以正常工作;但是,在同一文件中还有另一行,报告标题为“销售-南北美洲”,该报告也可以正常运行。

有人看出我错过了什么吗?


我认为你构建邮件的方式(一开始地址为空)有点古怪,但我猜这应该无关紧要。你尝试过使用simplemail的内存版本来排除懒惰IO问题吗? - Sarah
只是为了明确,这里的问题出现在一个14行文件的其中一行。如果我把这一行放在文件的最后,就会生成并发送13个报告,没有任何问题。如果我更改此行中的报告标题,则不会出现错误。也许我被卡住了,看不到它,但我无法想象更改报告标题的字符串如何会导致程序崩溃。我感到很傻,因为我觉得这个问题似乎不存在。然而,我已经与它斗争了三个月,直到今天才意识到报告标题导致了崩溃。这不可能,但确实发生了。 - dacDave
1个回答

1

问题已解决!

经过一番周折的过程,我发现仅仅通过从原始源代码重新构建应用程序就能够解决问题。为了完成重建,我不得不重新安装几个依赖项,但原始代码中没有改变一个字符。

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


很奇怪!一定是出了什么问题,或者你升级的某个包修复了一个错误。 - dfeuer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接