2012-07-03 18 views
9

के लिए tls-extra का उपयोग करना मैं अपने जीमेल खाते के माध्यम से एक मेल भेजने के लिए एक साधारण स्क्रिप्ट लिखने की कोशिश कर रहा हूं। लेकिन मैं एक नौसिखिया हूं इसलिए यह इतना आसान नहीं है। मैंने Google की कोशिश की लेकिन हैकेज के लिए बाहर निकला, कोई मदद या उदाहरण नहीं है।सरल smtp

समस्या यह है कि मैं जिस तरह से STARTTLS विनिमय आरंभ करने के लिए टीएलएस-अतिरिक्त (या TLS) का उपयोग करने के भी नहीं मिला है।

import Network 
import Network.TLS.Extra 
import System.IO 
import Text.Printf 

server = "smtp.gmail.com" 
port = 25 --that has to chage, I think 

forever a = a >> forever a 

main = test1 

write :: Handle -> String -> IO() 
write h s = do 
    hPrintf h "%s\r\n" s 
    printf "> %s\n" s 

listen :: Handle -> IO() 
listen h = forever $ hGetLine h >>= putStrLn 

test1 = do h <- connectTo server (PortNumber (fromIntegral port)) 
      hSetBuffering h NoBuffering 
      write h "EHLO" 
      write h "STARTTLS" 
      listen h 

एक और बात है कि मैं सुन फ़ंक्शन का उपयोग पता करने के लिए क्या हो रहा है:

ठीक है, यहाँ कोड है। लेकिन मैं यह नहीं समझ सकता कि लिखने के साथ इसका उपयोग कैसे किया जाए। यही कहना है, मैं कुछ डेटा भेजते समय सर्वर-साइड पर क्या चल रहा हूं यह देखने में सक्षम होना चाहूंगा।

connectionClient :: CryptoRandomGen g => String -> String -> TLSParams -> g -> IO (TLSCtx Handle) 
forkIO :: IO() -> IO ThreadId 

टीएलएस के लिए पहला और भेजने के लिए और एक ही समय में प्राप्त करने के लिए दूसरा:

मैं दो कार्य है कि मेरी समस्याओं का समाधान हो सकता पाया। लेकिन उन्हें काम करने के लिए प्रतीत नहीं होता है।

मुझे आशा है कि मैं यहाँ गंदा करने के लिए नहीं कर रहा हूँ, किसी भी मदद की सराहना की जाएगी।

पीएस: अंग्रेजी मेरा मूल नहीं है।

संपादित करें: तो, मैं कुछ प्रगति की है।

import Network 
import Network.TLS 
import Network.TLS.Extra 
import System.IO 
import Text.Printf 
import Control.Monad (forever) 
import Control.Concurrent (threadDelay) 
import qualified Data.ByteString.Char8 as B 
import Crypto.Random 

serv :: String 
serv = "smtp.gmail.com" 
port :: Int 
port = 25 --that has to chage, I think 

main :: IO() 
main = test1 

write :: Handle -> String -> IO() 
write h s = do 
    hPrintf h "%s\r\n" s 
    printf "> %s\n" s 

listen :: Handle -> IO() 
listen h = forever $ hGetLine h >>= putStrLn 

printSock :: Handle -> String -> IO() 
printSock h s = do write h s 
        hGetLine h >>= putStrLn 
        threadDelay 25 

params :: TLSParams 
params=defaultParams {pConnectVersion=TLS12 
        ,pAllowedVersions=[TLS10, TLS11, TLS12] 
        ,pCiphers=ciphersuite_all} 

test1 = do h <- connectTo serv (PortNumber (fromIntegral port)) 
      hSetBuffering h NoBuffering 
      printSock h "EHLO" 
      printSock h "STARTTLS" 
      --google waits for tls handshake 
      --the problem is from here 
      g <- newGenIO :: IO SystemRandom 
      tlsH <- client params g h 
      handshake tlsH --the handshake is failling 

फिर भी, मैं यह नहीं समझ सकता कि टीएलएस हैंडशेक पर बातचीत कैसे करें।

मुझे कहना है, मैं काफी जवाब की कमी से हैरान हूं। दूसरों को कुछ बार मुझे कोई समस्या थी, समुदाय मदद करने के लिए काफी जल्दी था। लेकिन यह interess (बस एक कब्ज) प्रतीत नहीं होता है। यहां SO या यहां तक ​​कि #haskell या developpez.com पर भी।

वैसे भी Google और tls के बारे में कुछ पॉइंटर्स का स्वागत होगा। मैंने msmtp क्लाइंट कोड पर एक नज़र डाली है लेकिन स्पष्ट रूप से मेरे पास आवश्यक स्तर नहीं है।

+0

मुझे एक ही समस्या है। क्या आप समझने में कामयाब रहे? – Salil

+0

आपके प्रश्न के लिए वास्तव में प्रासंगिक नहीं है, लेकिन मुझे बताएं कि आधार पुस्तकालयों में 'हमेशा के लिए' परिभाषित किया गया है। [हैकेज] देखें (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Monad.html#v:forever)। –

उत्तर

5

आप कनेक्शन पैकेज जो ग्राहक कनेक्शन को आसान बनाने का उपयोग करें और इस के लिए सभी आवश्यक बिट्स प्रदान कर सकता है। निम्नलिखित कोड smtp.gmail.com से कनेक्ट करने के लिए काम करेगा:

{-# LANGUAGE OverloadedStrings #-} 
import qualified Data.ByteString as B 
import Data.ByteString.Char8() 
import Network.Connection 
import Data.Default 

readHeader con = do 
    l <- connectionGetLine 1024 con 
    putStrLn $ show l 
    if B.isPrefixOf "250 " l 
     then return() 
     else readHeader con 

main = do 
    ctx <- initConnectionContext 
    con <- connectTo ctx $ ConnectionParams 
          { connectionHostname = "smtp.gmail.com" 
          , connectionPort  = 25 
          , connectionUseSecure = Nothing 
          , connectionUseSocks = Nothing 
          } 

    -- read the server banner 
    connectionGetLine 1024 con >>= putStrLn . show 
    -- say ehlo to the smtp server 
    connectionPut con "EHLO\n" 
    -- wait for a reply and print 
    readHeader con 
    -- Tell the server to start a TLS context. 
    connectionPut con "STARTTLS\n" 
    -- wait for a reply and print 
    connectionGetLine 1024 con >>= putStrLn . show 

    -- negociate the TLS context 
    connectionSetSecure ctx con def 

    ------- connection is secure now 
    -- send credential, passwords, ask question, etc. 

    -- then quit politely. 
    connectionPut con "QUIT\n" 
    connectionClose con 
+0

आपके द्वारा पोस्ट किए जाने पर पहले से ही कोडिंग कोड था लेकिन आपका कोड क्लीनर है।वैसे भी यह कहने के लिए एक अद्यतन है कि तब से मैंने किसी देशी कोड समाधान को छोड़ दिया है और एमएसएमटीपी कमांड के आस-पास एक कस्टम रैपर का उपयोग कर रहा हूं जो डॉस और निक्स पर उपलब्ध है और जो भी आप चाहते हैं उससे पहले ही सौदे कर सकते हैं। – Sarfraz

1

मैं वास्तव में क्या समस्या आप (मेरे एसएमटीपी कुछ पुरानी है) हो रही हो, पैदा पता नहीं है, लेकिन मेरा मानना ​​है कि समस्या का एक हिस्सा है कि आप गलत पोर्ट पर कनेक्ट कर रहे है। मुझे लगता है कि Google के साथ एसएमटीपी का उपयोग करने के लिए ये सही पैरामीटर हैं।

Gmail SMTP server address: smtp.gmail.com 
Gmail SMTP user name: Your full Gmail address (e.g. [email protected]) 
Gmail SMTP password: Your Gmail password 
Gmail SMTP port: 465 
Gmail SMTP TLS/SSL required: yes 

संपादित करें: मैं अगर वहाँ किसी SMTP पैकेज है कि आप एक उपयोगकर्ता नाम और पासवर्ड, TLS/SSL का उपयोग कर के साथ प्रवेश करने की अनुमति होगी था देखने के लिए Hackage की एक त्वरित खोज किया था, लेकिन मैं कुछ भी नहीं देखा था। (हालांकि, मैंने कुछ अनदेखा कर सकता था!) ​​सबसे नज़दीक मैंने पाया था simplmtpclient था। मुझे नहीं लगता कि यह एसएसएल का समर्थन करता है, लेकिन शायद आप इसे बढ़ा सकते हैं, या इसे स्वयं लिखने के लिए एक गाइड के रूप में उपयोग कर सकते हैं।

संबंधित मुद्दे