
I've had a look at mime-mail and think it provides a nice interface
for sending emails.
I started trying to write up a simple default interface to it for
easily adding attachments (I was going to look at adding a
pandoc-based automatic markdown to html later today).
getMimeType ('g':'p':'j':'.':_) = "image/jpeg"
getMimeType ('g':'e':'p':'j':'.':_) = "image/jpeg"
getMimeType ('f':'d':'p':'.':_) = "application/pdf"
simpleMail to from subject body attachments =
do
readAttachments <- mapM (\x -> B.readFile x) attachments
return Mail {
mailHeaders =
[ ("To", to)
,("From", from)
,("Subject", subject)
]
, mailParts =
[
[ Part "text/plain" None Nothing $ LU.fromString
$ unlines body
, Part "text/html" None Nothing $ LU.fromString
$ unlines body
]]
++
(map (\x -> [Part (getMimeType $ reverse $ fst x)
Base64 (Just $ fst x) $ snd x])
$ zip attachments readAttachments)
}
main = do
myMail <- simpleMail
"wrwills@gmail.com"
"mimemail@test.com"
"a test message"
[ "so much depends"
, "upon"
, "a red wheel"
, "barrow 你好"
]
["/tmp/cv.pdf", "/tmp/img.jpg"]
renderSendMail myMail
HaskellNet uses Bytestrings for sending mail so it might be easier to
use it for basic smarthost
sending with mime-mail than with SMTPClient -- but then again
SMTPClient looks at first blush
to be more adaptable.
I tried to use put the result of renderMail' into HaskellNet's sendMail
renderedMail <- renderMail' myMail
HN.sendMail from [to] renderedMail con
HN.closeSMTP con
but the typechecker didn't like it:
Couldn't match expected type `Data.ByteString.Internal.ByteString'
against inferred type `B.ByteString'
In the third argument of `HN.sendMail', namely `renderedMail'
because B.ByteString is Data.ByteString.Lazy.
Not sure how easy that would be to fix. I'm a little confused by all
the different
types of ByteStrings.
-Rob
On Mon, Oct 18, 2010 at 12:29 PM, Michael Snoyman
On Sun, Oct 17, 2010 at 7:07 PM, Jeremy Shaw
wrote: On Sun, Oct 17, 2010 at 10:14 AM, Michael Snoyman
wrote: I'm sure people would love to see built-in support for serving over SMTP, but I think that's more appropriate for a different package. Proper SMTP support will also include SSL/TLS support, which will require even more dependencies.
SMTPClient,
http://hackage.haskell.org/package/SMTPClient-1.0.3
can be used to send mail via SMTP to a smart host. It is still based on 'String', but it is a start. To send a simple message you can do:
import Network.SMTP.Simple import System.IO
main :: IO () main = do sendSimpleMessages (hPutStrLn stderr) "10.2.23.11" "example.com" [message] where message = SimpleMessage [NameAddr (Just "John Doe") "johnd@example.com"] [NameAddr (Just "Team") "team@exmaple.com"] "My test email using Network.SMTP.Simple" "Hi, this is a test email which uses SMTPClient."
I wonder what it would take to make it so that the message body could be multipart mime...
Currently, the idea in mime-mail is to produce fully-formed messages, complete with headers, encoded as UTF-8 lazy bytestrings. To address the headers issue, we would need to do one of:
* Allow SMTPClient to accept messages with the headers already attached. * Modify mime-mail to produce a list of headers separate from the message content. I'm not opposed to this.
Regarding the String/ByteString issue, there are three choices I believe:
* Switch mime-mail to use Strings. I *am* opposed to this ;). * Switch SMTPClient to use ByteStrings. I think this is the right answer. * Leave the libraries as-is, and just use a Lazy.Char8.unpack to bridge the two.
Am I leaving anything out? I'd be happy to try and get mime-mail to work with SMTPClient.
Michael _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe