2011-06-15 11 views
5

He estado luchando para enviar correos electrónicos desde un programa Haskell por un tiempo, he intentado usar la biblioteca HaskellMime o algo así, pero he fallado.
Instalé HaskellNet recientemente y trato de usar el módulo Haskellnet.SMTP. Intenté enviar un correo electrónico con el comando 'sendMail' y obtener "error de usuario (error sendmail)". Supongo que fue porque el servidor SMTP que utilicé necesitaba autenticación.
Eché un vistazo al código fuente 'sendMail' y terminé escribiendo esta simple principal: http://hpaste.org/47841
Comprobé cada comando 'sendCommand' y después del comando AUTH obtengo un "Auth success" del servidor SMTP y código 250 de los otros comandos, como se esperaba en el código fuente 'sendMail'.
El problema es que no tengo ningún correo en mi buzón, entonces ¿qué estoy haciendo mal? Lo único que se me ocurre es que el correo está en cola en algún lugar de la lista saliente SMTP y necesito enjuagar el servidor SMTP, pero eso no forma parte del código 'sendMail', así que me pregunto ... Cualquier ayuda sería en gran medida apreciado, porque nunca pensé que sería tan difícil enviar un correo electrónico:/
PD Uso exactamente la misma configuración en mi teléfono para enviar correos electrónicos con este servidor SMTP, el mismo "smtp.sfr.fr", la misma ID (dirección completa), la misma contraseña; y funciona: puedo enviar correos desde mi teléfono.
Gracias de antemano por la ayuda.¿Debo limpiar el servidor SMTP? Si es así, ¿cómo hacerlo?

+0

¿Ha comprobado su carpeta de correo no deseado? – hammar

+0

Sí, había revisado mis carpetas de spam, no había nada allí. – nschoe

Respuesta

2

Si bien no puedo comentar sobre el uso de HaskellNet, he tenido un gran éxito usando SMTPClient, que puede tomar de hackage con cabal install SMTPClient.

He incluido el ejemplo del paquete para darle un sentido de lo que el uso de la biblioteca es como:

import Network.SMTP.ClientSession 
import Network.SMTP.Client 
import Network.Socket 
import System.Time 
import System.IO 
import Data.Bits 
import Data.IORef 

myDomain = "example.com" 
smtpHost = "hubert.blacksapphire.com" -- <-- Your SMTP server here 

-- This will send the author an email. I don't mind! 
main = do 
    now <- getClockTime 
    nowCT <- toCalendarTime now 
    let message = Message [ 
       From [NameAddr (Just "Mr. Nobody") "[email protected]"], 
       To [NameAddr (Just "Stephen Blackheath") "[email protected]"], 
       Subject "I'm using SMTPClient!", 
       Date nowCT 
      ] 
      ("Dear Sir,\n"++ 
      "It has come to my attention that this is an email.\n"++ 
      "Yours sincerely,\n"++ 
      "Mr. Nobody\n") 
    addrs <- getAddrInfo Nothing (Just smtpHost) Nothing 
    let SockAddrInet _ hostAddr = addrAddress (addrs !! 0) 
     sockAddr = SockAddrInet (fromIntegral 25) hostAddr 
    putStrLn $ "connecting to "++show sockAddr 
    sentRef <- newIORef [] 
    sendSMTP' (hPutStrLn stderr) (Just sentRef) myDomain 
     sockAddr [message] 
    statuses <- readIORef sentRef 
    -- If no exception was caught, statuses is guaranteed to be 
    -- the same length as the list of input messages, therefore head won't fail here. 
    case head statuses of 
     Nothing  -> putStrLn "Message successfully sent" 
     Just status -> putStrLn $ "Message send failed with status "++show status 
+0

Bueno, gracias por su respuesta, incluso un código aquí, no estaba pidiendo demasiado, ¡pero gracias! Veré su código, pero esto es lo que hice hasta ahora (y está funcionando): utilicé telnet para conectarme al servidor SMTP que quería usar. Luego emití los comandos necesarios para enviar un correo electrónico, encontré errores, los corrigí. Una vez que los tuve todos correctos, solo usé 'sendCommand's' para enviar los comandos exactos, el mismo orden, los mismos argumentos y simplemente funcionó. Aquí está la parte del código: http://hpaste.org/47929. Por supuesto que es muy minimalista aquí: no compruebo si hay errores, solo un comienzo ^^ – nschoe

Cuestiones relacionadas