iro/offer/smtp.py
author Sandro Knauß <knauss@netzguerilla.net>
Fri, 24 Aug 2012 01:05:06 +0200
branchdevel
changeset 294 0e75bd39767d
parent 291 84eb5a7a715a
permissions -rw-r--r--
adding LICENSE to all files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
294
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
     1
# Copyright (c) 2012 netzguerilla.net <iro@netzguerilla.net>
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
     2
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
     3
# This file is part of Iro.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
     4
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
     5
# Permission is hereby granted, free of charge, to any person obtaining a copy of
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
     6
# this software and associated documentation files (the "Software"), to deal in
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
     7
# the Software without restriction, including without limitation the rights to use,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
     8
# copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
     9
# #Software, and to permit persons to whom the Software is furnished to do so,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
    10
# subject to the following conditions:
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
    11
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
    12
# The above copyright notice and this permission notice shall be included in
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
    13
# all copies or substantial portions of the Software.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
    14
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
    15
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
    16
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
    17
# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
    18
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
    19
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
    20
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 291
diff changeset
    21
0
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    22
# -*- coding: utf-8 -*-
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    23
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    24
import smtplib
68
85fc1e5dea79 Massenmails werden nun an eine Mailadresse verschickt
Sandro Knauß <knauss@netzguerilla.net>
parents: 58
diff changeset
    25
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
    26
from functools import partial
68
85fc1e5dea79 Massenmails werden nun an eine Mailadresse verschickt
Sandro Knauß <knauss@netzguerilla.net>
parents: 58
diff changeset
    27
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
    28
from ..validate import vInteger, vEmail,vBool
166
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 68
diff changeset
    29
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
    30
from ..config import Option
180
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    31
from .provider import Provider, providers
0
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    32
166
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 68
diff changeset
    33
class SMTP(Provider):
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    34
    """A SMTP Provider to send emails.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    35
    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
    36
    
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    37
    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
    38
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    39
    """
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
    40
    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
    41
        options = [
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 253
diff changeset
    42
                ("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
    43
                ("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
    44
                ("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
    45
                ("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
    46
                ("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
    47
                ("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
    48
                ("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
    49
                ]
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 253
diff changeset
    50
        Provider.__init__(self,name,{"mail":[None]},options)
0
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    51
218
91f87ad13540 integration tests for smtp
Sandro Knauß <knauss@netzguerilla.net>
parents: 186
diff changeset
    52
    def send(self, recipient, mail):   
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    53
        """sends a mail to recipient
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    54
        
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    55
        :param string recipient: A valid email address.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    56
        :param `iro.model.message.Mail` mail: Mail to send.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    57
        :return: 
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    58
            - All went ok -- :class:`iro.model.status.Status` object
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    59
            - otherwise -- an exception
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    60
        """
169
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    61
        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
    62
            if self.SSL:
169
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    63
                smtp = smtplib.SMTP_SSL(self.host,self.port)
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    64
            else:
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    65
                smtp = smtplib.SMTP(self.host,self.port)
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    66
            
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
    67
            if self.TLS:
169
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    68
                smtp.starttls()
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    69
           
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    70
            if not self.user == "":
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    71
                smtp.login(self.user,self.password)
166
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 68
diff changeset
    72
        try:
169
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    73
            frm=self.send_from
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    74
            
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    75
            if mail.getFrom():
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    76
                frm = mail.getFrom()
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    77
            
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    78
            tmpmail=copy.deepcopy(mail)
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    79
            tmpmail.content['From'] = frm 
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    80
            tmpmail.content['To'] = recipient
166
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 68
diff changeset
    81
            if not self.testmode:
169
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    82
                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
    83
            return Status(self, None)
169
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    84
        finally:
aabc04843d25 complete offer.smtp tests
Sandro Knauß <knauss@netzguerilla.net>
parents: 168
diff changeset
    85
            smtp.quit()
68
85fc1e5dea79 Massenmails werden nun an eine Mailadresse verschickt
Sandro Knauß <knauss@netzguerilla.net>
parents: 58
diff changeset
    86
166
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 68
diff changeset
    87
    def getSendFunc(self, typ, route):
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    88
        """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
    89
171
5619596a0053 getSendFunc logic from smtp to Provider(offer.provider)
Sandro Knauß <knauss@netzguerilla.net>
parents: 169
diff changeset
    90
        Provider.getSendFunc(self, typ, route)
166
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 68
diff changeset
    91
        return self.send
0
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    92
166
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 68
diff changeset
    93
providers["smtp"]=SMTP
0
a3b6e531f0d2 [svn r93] creating iro package branch
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    94