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