Skip to content

Instantly share code, notes, and snippets.

@mengzhuo
Created July 8, 2014 10:11
Show Gist options
  • Save mengzhuo/884caf0281b5e1faefd1 to your computer and use it in GitHub Desktop.
Save mengzhuo/884caf0281b5e1faefd1 to your computer and use it in GitHub Desktop.
Async Task Queue like base on greenlets
from gevent import monkey
monkey.patch_all()
from dns import resolver
from tuck import tuck
def get_mail_server(receiver=''):
user, domain = receiver.split('@')
dest_list = sorted([x.to_text().strip('.').split(' ')
for x in resolver.query(domain, 'MX')],
key=lambda x:x[0])
return dest_list
@tuck
def test_send_mail():
dest_list = get_mail_server(receiver)
times = 1
for dest in dest_list:
sm = smtplib.SMTP(dest[1])
sm.ehlo()
if sm.does_esmtp and 'starttls' in sm.esmtp_features:
sm.starttls()
try:
sm.sendmail(mail['From'], [receiver], mail.as_string())
break
except Exception as err:
logger.warning(err, exc_info=True)
times += 1
assert times <= len(dest_list), 'Tried all servers for %s' % receiver
import functools
import gevent
from gevent import monkey, event
monkey.patch_all()
import logging
logger = logging.getLogger(__name__)
def tuck(func):
@functools.wraps(func)
def wrap(*args, **kwargs):
result = event.AsyncResult()
try:
gevent.spawn(func, *args, **kwargs).link(result)
except Exception as err:
logger.error(err, exc_info=True)
return
return wrap
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment