iro/offer/smtp.py
author Sandro Knauß <knauss@netzguerilla.net>
Fri, 30 Mar 2012 15:55:44 +0200
branchdevel
changeset 269 0d134b173cb1
parent 253 e8d56537c9cc
child 291 84eb5a7a715a
permissions -rw-r--r--
iro.config: using OrderedDict instead of Dict + List for Options.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     1
# -*- coding: utf-8 -*-
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     2
#Copyright (C) 2009  Sandro Knauß <bugs@sandroknauss.de>
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     3
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     4
#This program is free software; you can redistribute it and/or modify it under the terms
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     5
#of the GNU General Public License as published by the Free Software Foundation;
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     6
#either version 3 of the License, or any later version.
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     7
#This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     8
#without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     9
#See the GNU General Public License for more details.
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    10
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    11
#You should have received a copy of the GNU General Public License
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    12
#along with this program; if not, see <http://www.gnu.org/licenses/>.
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    13
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    14
import smtplib
68
85fc1e5dea79 Massenmails werden nun an eine Mailadresse verschickt
Sandro Knauß <knauss@netzguerilla.net>
parents: 58
diff changeset
    15
import copy
183
07ee5543751b offer.provider now handles the options dict and loadConfig is only in Provider class
Sandro Knauß <knauss@netzguerilla.net>
parents: 180
diff changeset
    16
from functools import partial
68
85fc1e5dea79 Massenmails werden nun an eine Mailadresse verschickt
Sandro Knauß <knauss@netzguerilla.net>
parents: 58
diff changeset
    17
183
07ee5543751b offer.provider now handles the options dict and loadConfig is only in Provider class
Sandro Knauß <knauss@netzguerilla.net>
parents: 180
diff changeset
    18
from ..validate import vInteger, vEmail,vBool
166
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 68
diff changeset
    19
from ..model.status import Status
183
07ee5543751b offer.provider now handles the options dict and loadConfig is only in Provider class
Sandro Knauß <knauss@netzguerilla.net>
parents: 180
diff changeset
    20
from ..config import Option
180
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    21
from .provider import Provider, providers
0
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    22
166
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 68
diff changeset
    23
class SMTP(Provider):
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    24
    """A SMTP Provider to send emails.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    25
    This Provider has only one typ ``"mail"`` and one route ``None``. 
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    26
    
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    27
    If :attr:`~iro.offer.provider.Provider.testmode` is **True** no mail will be send, only a connection is created to server.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    28
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    29
    """
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
    30
    def __init__(self, name):
269
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 253
diff changeset
    31
        options = [
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 253
diff changeset
    32
                ("host", Option(lambda x,y: x, long="Hostname of MTA", must=True)),
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 253
diff changeset
    33
                ("port", Option(partial(vInteger,minv=0),long="Port of the MTA", default=25)),
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 253
diff changeset
    34
                ("user", Option(lambda x,y: x, long="username to login into MTA.",default="")),
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 253
diff changeset
    35
                ("password", Option(lambda x,y: x, long="password to login into MTA.",default="")),
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 253
diff changeset
    36
                ("SSL", Option(vBool,long="use SSL for connection to MTA", default=False)),
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 253
diff changeset
    37
                ("TLS", Option(vBool,long="use TLS for connection to MTA", default=False)),
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 253
diff changeset
    38
                ("send_from", Option(vEmail,long="Emailaddress from which mail will be sended.",must=True)),
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 253
diff changeset
    39
                ]
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 253
diff changeset
    40
        Provider.__init__(self,name,{"mail":[None]},options)
0
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    41
218
91f87ad13540 integration tests for smtp
Sandro Knauß <knauss@netzguerilla.net>
parents: 186
diff changeset
    42
    def send(self, recipient, mail):   
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    43
        """sends a mail to recipient
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    44
        
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    45
        :param string recipient: A valid email address.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    46
        :param `iro.model.message.Mail` mail: Mail to send.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    47
        :return: 
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    48
            - All went ok -- :class:`iro.model.status.Status` object
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    49
            - otherwise -- an exception
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    50
        """
169
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    51
        if not self.testmode:
183
07ee5543751b offer.provider now handles the options dict and loadConfig is only in Provider class
Sandro Knauß <knauss@netzguerilla.net>
parents: 180
diff changeset
    52
            if self.SSL:
169
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    53
                smtp = smtplib.SMTP_SSL(self.host,self.port)
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    54
            else:
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    55
                smtp = smtplib.SMTP(self.host,self.port)
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    56
            
183
07ee5543751b offer.provider now handles the options dict and loadConfig is only in Provider class
Sandro Knauß <knauss@netzguerilla.net>
parents: 180
diff changeset
    57
            if self.TLS:
169
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    58
                smtp.starttls()
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    59
           
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    60
            if not self.user == "":
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    61
                smtp.login(self.user,self.password)
166
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 68
diff changeset
    62
        try:
169
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    63
            frm=self.send_from
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    64
            
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    65
            if mail.getFrom():
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    66
                frm = mail.getFrom()
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    67
            
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    68
            tmpmail=copy.deepcopy(mail)
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    69
            tmpmail.content['From'] = frm 
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    70
            tmpmail.content['To'] = recipient
166
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 68
diff changeset
    71
            if not self.testmode:
169
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    72
                smtp.sendmail(frm,  recipient, tmpmail.as_string())
171
5619596a0053 getSendFunc logic from smtp to Provider(offer.provider)
Sandro Knauß <knauss@netzguerilla.net>
parents: 169
diff changeset
    73
            return Status(self, None)
169
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    74
        finally:
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    75
            smtp.quit()
68
85fc1e5dea79 Massenmails werden nun an eine Mailadresse verschickt
Sandro Knauß <knauss@netzguerilla.net>
parents: 58
diff changeset
    76
166
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 68
diff changeset
    77
    def getSendFunc(self, typ, route):
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    78
        """returns :meth:`send` method, if typ and route is valid."""
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    79
171
5619596a0053 getSendFunc logic from smtp to Provider(offer.provider)
Sandro Knauß <knauss@netzguerilla.net>
parents: 169
diff changeset
    80
        Provider.getSendFunc(self, typ, route)
166
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 68
diff changeset
    81
        return self.send
0
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    82
166
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 68
diff changeset
    83
providers["smtp"]=SMTP
0
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    84