Guest User

Untitled

a guest
Apr 26th, 2018
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.93 KB | None | 0 0
  1. from email.MIMEText import MIMEText
  2. from email.Header import Header
  3.  
  4. from zope.interface import implements
  5. from twisted.mail import smtp
  6. from twisted.internet import reactor, defer, protocol
  7.  
  8. from twisted.trial.unittest import TestCase
  9.  
  10.  
  11. def buildMessage(fromAddr, toAddr, subject, body):
  12. msg = MIMEText(body)
  13. msg['Subject'] = subject
  14. From = msg['From'] = fromAddr
  15. To = msg['To'] = toAddr
  16. return msg
  17.  
  18.  
  19.  
  20. def sendEmail(fromAddr, toAddr, message, smtpHost='localhost', smtpPort=25):
  21. messageData = message.as_string(unixfrom=False)
  22. return smtp.sendmail(smtpHost, fromAddr, [toAddr], messageData, port=smtpPort)
  23.  
  24.  
  25.  
  26. # This was taken (mostly) from page 124 of the Twisted book.
  27. class CallbackMessageReceiver(object):
  28. implements(smtp.IMessage)
  29.  
  30. def __init__(self, callback):
  31. # We separate the current lines we're using
  32. self.lines = []
  33.  
  34. # from the full messages that we've received.
  35. self.callback = callback
  36.  
  37. def lineReceived(self, line):
  38. print line
  39. self.lines.append(line)
  40.  
  41. def eomReceived(self):
  42. # message is complete, tell everyone about it
  43. self.callback("\n".join(self.lines) + "\n")
  44.  
  45. self.lines = []
  46.  
  47. return defer.succeed(True)
  48.  
  49. def connectionList(self):
  50. del (self.lines)
  51.  
  52.  
  53.  
  54. class CallbackMessageDelivery(object):
  55. implements(smtp.IMessageDelivery)
  56.  
  57. def __init__(self, callback):
  58. self.callback = callback
  59.  
  60. def receivedHeader(self, helo, origin, recipients):
  61. myHostname, clientIP = helo
  62. headerValue = "by %s from %s with ESMTP ; %s" % (
  63. myHostname, clientIP, smtp.rfc822date())
  64. return "Received: %s" % Header(headerValue)
  65.  
  66. def validateTo(self, user):
  67. # Use the CallbackMessageReceiver to append messages to our
  68. # message list.
  69. return lambda: CallbackMessageReceiver(self.callback)
  70.  
  71. def validateFrom(self, helo, originAddress):
  72. # Accept from anywhere.
  73. return originAddress
  74.  
  75.  
  76.  
  77. class DeferredSMTPFactory(protocol.ServerFactory):
  78. def __init__(self):
  79. self.listOfDeferreds = []
  80.  
  81. def informDeferreds(self, result):
  82. # Tell everyone that was interested in knowing about this message
  83. for deferred in self.listOfDeferreds:
  84. deferred.callback(result)
  85.  
  86. # Remove them from the list of listening deferreds.
  87. self.listOfDeferreds = []
  88.  
  89. def messageReceived(self):
  90. d = defer.Deferred()
  91. self.listOfDeferreds.append(d)
  92. return d
  93.  
  94. def buildProtocol(self, addr):
  95. delivery = CallbackMessageDelivery(self.informDeferreds)
  96. smtpProtocol = smtp.SMTP(delivery)
  97. smtpProtocol.factory = self
  98. return smtpProtocol
  99.  
  100.  
  101.  
  102. TEST_SMTP_PORT = 52125
  103. class SMTPTests(TestCase):
  104. def setUp(self):
  105. self.deferredSMTP = DeferredSMTPFactory()
  106. self.smtpServer = reactor.listenTCP(TEST_SMTP_PORT, self.deferredSMTP)
  107.  
  108. def tearDown(self):
  109. return self.smtpServer.stopListening()
  110.  
  111. def test_sendingMessages(self):
  112. messageText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit."
  113. subject = 'b-b-b-b-b-b-b-boilerplate!'
  114. toAddr = 'lakin@etsy.com'
  115. fromAddr = 'tabo@etsy.com'
  116. message = buildMessage(fromAddr, toAddr, subject, messageText)
  117. def finishedSending(receivedMessage):
  118. self.assertTrue(messageText in receivedMessage)
  119. print "Received -\n"
  120. print receivedMessage
  121. return receivedMessage
  122.  
  123. emailSentDeferred = sendEmail(fromAddr, toAddr, message, smtpPort=TEST_SMTP_PORT)
  124.  
  125. emailReceivedDeferred = self.deferredSMTP.messageReceived()
  126. emailReceivedDeferred.addCallback(finishedSending)
  127.  
  128. return defer.DeferredList([emailSentDeferred, emailReceivedDeferred])
Add Comment
Please, Sign In to add comment