1
2
3 """TurboMail startup and shutdown interface.
4
5 To start and stop TurboMail in your own applications::
6
7 import turbomail
8
9 turbomail.interface.config = {'mail.on': True, ...}
10 turbomail.interface.start()
11
12 message = turbomail.Message(...)
13 turbomail.interface.send(message)
14
15 turbomail.interface.stop()
16
17 Remember to configure your outbound settings in the config dictionary.
18
19 TurboMail will, by default, immediately delete any messages remaining in
20 the queue and wait on any in-progress deliveries.
21 """
22
23
24 import logging
25 import warnings
26
27 import pkg_resources
28
29 from turbomail.exceptions import MailNotEnabledException
30
31
32 __all__ = ['extension']
33
34 log = logging.getLogger("turbomail.control")
35
36
37
39 """Control TurboMail startup and shutdown."""
40
42 self.running = False
43 self._loaded_extensions = []
44 self.config = dict()
45 self.manager = None
46
47 - def __load_single_entry(self, group, name):
48 for entrypoint in pkg_resources.iter_entry_points(group, name):
49 return entrypoint.load()
50
51 return None
52
54 config_name = "mail.%s.on" % extension_name
55 return self.config.get(config_name, False)
56
58 log.info("Loading extension '%s'." % extension_name)
59
60 if hasattr(extension, 'interface'):
61 extension = extension.interface
62
63 elif hasattr(extension, 'load'):
64 extension = extension.load()
65
66 if hasattr(extension, 'start'):
67 extension.start()
68
69 self._loaded_extensions.append(extension)
70
79
85
91
92 - def start(self, config, extra_classes=None):
93 self.config = config
94 if not self.config.get("mail.on", False):
95 return
96
97 log.info("TurboMail extension starting up.")
98
99 def load(t, default, extra_classes):
100 extension = self.config.get("mail.%s" % t, default)
101 if extra_classes != None and extension in extra_classes:
102 controller = extra_classes[extension]
103 if isinstance(controller, type):
104 controller = controller()
105 else:
106 entry_point = "turbomail.%ss" % t
107 controller = self.__load_single_entry(entry_point, extension)
108 if not controller:
109 self.config.update({"mail.on": False})
110 log.error("Unable to locate %s %s, TurboMail disabled." % (extension, t))
111 self.stop(force=True)
112 return
113 setattr(self, t, controller)
114 if hasattr(getattr(self, t), 'load'):
115 setattr(self, t, getattr(self, t).load())
116 if hasattr(getattr(self, t), 'start'):
117 getattr(self, t).start()
118
119
120 load('manager', 'immediate', extra_classes)
121 load('transport', 'debug', extra_classes)
122
123 self.initialize_enabled_extensions(extra_classes)
124 self.running = True
125
127 for extension in self._loaded_extensions:
128 if hasattr(extension, 'stop'):
129 extension.stop()
130 self._loaded_extensions = []
131
132 - def stop(self, force=False):
133 if not self.running and not force:
134 return
135 log.info("TurboMail extension shutting down.")
136
137 self._stop_all_loaded_extensions()
138 if self.manager and hasattr(self.manager, "stop"):
139 self.manager.stop()
140 self.manager = None
141 self.running = False
142
143 - def send(self, message):
154
155
156 interface = ControlClass()
157