Mercurial > kallithea
annotate rhodecode/lib/rcmail/smtp_mailer.py @ 3407:6354556781ef beta
update unionrepo for Mercurial 2.5.1
author | Mads Kiilerich <madski@unity3d.com> |
---|---|
date | Wed, 27 Feb 2013 01:26:38 +0100 |
parents | 9766f0baf5c5 |
children | 63e58ef80ef1 |
rev | line source |
---|---|
981
c45c910714e4
fixed smtp_mailer with Johan Walles suggestion, and made some patches according to
Marcin Kuzminski <marcin@python-works.com>
parents:
952
diff
changeset
|
1 # -*- coding: utf-8 -*- |
c45c910714e4
fixed smtp_mailer with Johan Walles suggestion, and made some patches according to
Marcin Kuzminski <marcin@python-works.com>
parents:
952
diff
changeset
|
2 """ |
1717
7ff304d3028f
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1716
diff
changeset
|
3 rhodecode.lib.rcmail.smtp_mailer |
7ff304d3028f
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1716
diff
changeset
|
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
1203
6832ef664673
source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents:
1169
diff
changeset
|
5 |
981
c45c910714e4
fixed smtp_mailer with Johan Walles suggestion, and made some patches according to
Marcin Kuzminski <marcin@python-works.com>
parents:
952
diff
changeset
|
6 Simple smtp mailer used in RhodeCode |
1203
6832ef664673
source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents:
1169
diff
changeset
|
7 |
984
ccd323bfa121
Added limit option for revision ranges
Marcin Kuzminski <marcin@python-works.com>
parents:
981
diff
changeset
|
8 :created_on: Sep 13, 2010 |
1824
89efedac4e6c
2012 copyrights
Marcin Kuzminski <marcin@python-works.com>
parents:
1717
diff
changeset
|
9 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com> |
1532
2afe9320d5e6
updated docstrings
Marcin Kuzminski <marcin@python-works.com>
parents:
1417
diff
changeset
|
10 :license: GPLv3, see COPYING for more details. |
981
c45c910714e4
fixed smtp_mailer with Johan Walles suggestion, and made some patches according to
Marcin Kuzminski <marcin@python-works.com>
parents:
952
diff
changeset
|
11 """ |
1532
2afe9320d5e6
updated docstrings
Marcin Kuzminski <marcin@python-works.com>
parents:
1417
diff
changeset
|
12 # This program is free software: you can redistribute it and/or modify |
2afe9320d5e6
updated docstrings
Marcin Kuzminski <marcin@python-works.com>
parents:
1417
diff
changeset
|
13 # it under the terms of the GNU General Public License as published by |
2afe9320d5e6
updated docstrings
Marcin Kuzminski <marcin@python-works.com>
parents:
1417
diff
changeset
|
14 # the Free Software Foundation, either version 3 of the License, or |
2afe9320d5e6
updated docstrings
Marcin Kuzminski <marcin@python-works.com>
parents:
1417
diff
changeset
|
15 # (at your option) any later version. |
2afe9320d5e6
updated docstrings
Marcin Kuzminski <marcin@python-works.com>
parents:
1417
diff
changeset
|
16 # |
2afe9320d5e6
updated docstrings
Marcin Kuzminski <marcin@python-works.com>
parents:
1417
diff
changeset
|
17 # This program is distributed in the hope that it will be useful, |
2afe9320d5e6
updated docstrings
Marcin Kuzminski <marcin@python-works.com>
parents:
1417
diff
changeset
|
18 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
2afe9320d5e6
updated docstrings
Marcin Kuzminski <marcin@python-works.com>
parents:
1417
diff
changeset
|
19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
2afe9320d5e6
updated docstrings
Marcin Kuzminski <marcin@python-works.com>
parents:
1417
diff
changeset
|
20 # GNU General Public License for more details. |
2afe9320d5e6
updated docstrings
Marcin Kuzminski <marcin@python-works.com>
parents:
1417
diff
changeset
|
21 # |
2afe9320d5e6
updated docstrings
Marcin Kuzminski <marcin@python-works.com>
parents:
1417
diff
changeset
|
22 # You should have received a copy of the GNU General Public License |
2afe9320d5e6
updated docstrings
Marcin Kuzminski <marcin@python-works.com>
parents:
1417
diff
changeset
|
23 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
2452
d95ef6587bca
fixes #481 rhodecode emails are sent without Date header
Marcin Kuzminski <marcin@python-works.com>
parents:
1846
diff
changeset
|
24 import time |
474
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
25 import logging |
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
26 import smtplib |
981
c45c910714e4
fixed smtp_mailer with Johan Walles suggestion, and made some patches according to
Marcin Kuzminski <marcin@python-works.com>
parents:
952
diff
changeset
|
27 from socket import sslerror |
2452
d95ef6587bca
fixes #481 rhodecode emails are sent without Date header
Marcin Kuzminski <marcin@python-works.com>
parents:
1846
diff
changeset
|
28 from email.utils import formatdate |
1717
7ff304d3028f
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1716
diff
changeset
|
29 from rhodecode.lib.rcmail.message import Message |
2495
9766f0baf5c5
Use local_hostname in mailer
Marcin Kuzminski <marcin@python-works.com>
parents:
2452
diff
changeset
|
30 from rhodecode.lib.rcmail.utils import DNS_NAME |
1307 | 31 |
1824
89efedac4e6c
2012 copyrights
Marcin Kuzminski <marcin@python-works.com>
parents:
1717
diff
changeset
|
32 |
474
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
33 class SmtpMailer(object): |
981
c45c910714e4
fixed smtp_mailer with Johan Walles suggestion, and made some patches according to
Marcin Kuzminski <marcin@python-works.com>
parents:
952
diff
changeset
|
34 """SMTP mailer class |
1203
6832ef664673
source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents:
1169
diff
changeset
|
35 |
1583
8e77c75bd65a
made auth type optional in constructor
Marcin Kuzminski <marcin@python-works.com>
parents:
1581
diff
changeset
|
36 mailer = SmtpMailer(mail_from, user, passwd, mail_server, smtp_auth |
1307 | 37 mail_port, ssl, tls) |
1203
6832ef664673
source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents:
1169
diff
changeset
|
38 mailer.send(recipients, subject, body, attachment_files) |
6832ef664673
source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents:
1169
diff
changeset
|
39 |
474
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
40 :param recipients might be a list of string or single string |
1203
6832ef664673
source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents:
1169
diff
changeset
|
41 :param attachment_files is a dict of {filename:location} |
6832ef664673
source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents:
1169
diff
changeset
|
42 it tries to guess the mimetype and attach the file |
6832ef664673
source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents:
1169
diff
changeset
|
43 |
474
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
44 """ |
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
45 |
1583
8e77c75bd65a
made auth type optional in constructor
Marcin Kuzminski <marcin@python-works.com>
parents:
1581
diff
changeset
|
46 def __init__(self, mail_from, user, passwd, mail_server, smtp_auth=None, |
8e77c75bd65a
made auth type optional in constructor
Marcin Kuzminski <marcin@python-works.com>
parents:
1581
diff
changeset
|
47 mail_port=None, ssl=False, tls=False, debug=False): |
689
ecc566f8b69f
fixes #59, notifications for user registrations + some changes to mailer
Marcin Kuzminski <marcin@python-works.com>
parents:
604
diff
changeset
|
48 |
474
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
49 self.mail_from = mail_from |
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
50 self.mail_server = mail_server |
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
51 self.mail_port = mail_port |
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
52 self.user = user |
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
53 self.passwd = passwd |
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
54 self.ssl = ssl |
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
55 self.tls = tls |
1169
f6dca275c5a8
control mailer debug with the .ini file
Marcin Kuzminski <marcin@python-works.com>
parents:
1029
diff
changeset
|
56 self.debug = debug |
1581
67377fd685be
applied smth_auth options update patch
Les Peabody <lpeabody@ccom.unh.edu>
parents:
1532
diff
changeset
|
57 self.auth = smtp_auth |
689
ecc566f8b69f
fixes #59, notifications for user registrations + some changes to mailer
Marcin Kuzminski <marcin@python-works.com>
parents:
604
diff
changeset
|
58 |
1717
7ff304d3028f
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1716
diff
changeset
|
59 def send(self, recipients=[], subject='', body='', html='', |
7ff304d3028f
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1716
diff
changeset
|
60 attachment_files=None): |
474
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
61 |
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
62 if isinstance(recipients, basestring): |
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
63 recipients = [recipients] |
2452
d95ef6587bca
fixes #481 rhodecode emails are sent without Date header
Marcin Kuzminski <marcin@python-works.com>
parents:
1846
diff
changeset
|
64 headers = { |
d95ef6587bca
fixes #481 rhodecode emails are sent without Date header
Marcin Kuzminski <marcin@python-works.com>
parents:
1846
diff
changeset
|
65 'Date': formatdate(time.time()) |
d95ef6587bca
fixes #481 rhodecode emails are sent without Date header
Marcin Kuzminski <marcin@python-works.com>
parents:
1846
diff
changeset
|
66 } |
1846
349a0ca30a75
Changed default recipients separator for mails to ', '
Marcin Kuzminski <marcin@python-works.com>
parents:
1824
diff
changeset
|
67 msg = Message(subject, recipients, body, html, self.mail_from, |
2452
d95ef6587bca
fixes #481 rhodecode emails are sent without Date header
Marcin Kuzminski <marcin@python-works.com>
parents:
1846
diff
changeset
|
68 recipients_separator=", ", extra_headers=headers) |
1717
7ff304d3028f
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1716
diff
changeset
|
69 raw_msg = msg.to_message() |
7ff304d3028f
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1716
diff
changeset
|
70 |
474
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
71 if self.ssl: |
2495
9766f0baf5c5
Use local_hostname in mailer
Marcin Kuzminski <marcin@python-works.com>
parents:
2452
diff
changeset
|
72 smtp_serv = smtplib.SMTP_SSL(self.mail_server, self.mail_port, |
9766f0baf5c5
Use local_hostname in mailer
Marcin Kuzminski <marcin@python-works.com>
parents:
2452
diff
changeset
|
73 local_hostname=DNS_NAME.get_fqdn()) |
474
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
74 else: |
2495
9766f0baf5c5
Use local_hostname in mailer
Marcin Kuzminski <marcin@python-works.com>
parents:
2452
diff
changeset
|
75 smtp_serv = smtplib.SMTP(self.mail_server, self.mail_port, |
9766f0baf5c5
Use local_hostname in mailer
Marcin Kuzminski <marcin@python-works.com>
parents:
2452
diff
changeset
|
76 local_hostname=DNS_NAME.get_fqdn()) |
474
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
77 |
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
78 if self.tls: |
981
c45c910714e4
fixed smtp_mailer with Johan Walles suggestion, and made some patches according to
Marcin Kuzminski <marcin@python-works.com>
parents:
952
diff
changeset
|
79 smtp_serv.ehlo() |
474
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
80 smtp_serv.starttls() |
689
ecc566f8b69f
fixes #59, notifications for user registrations + some changes to mailer
Marcin Kuzminski <marcin@python-works.com>
parents:
604
diff
changeset
|
81 |
ecc566f8b69f
fixes #59, notifications for user registrations + some changes to mailer
Marcin Kuzminski <marcin@python-works.com>
parents:
604
diff
changeset
|
82 if self.debug: |
474
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
83 smtp_serv.set_debuglevel(1) |
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
84 |
952
beabd452f08b
fixed ehlo command for mailing.
Marcin Kuzminski <marcin@python-works.com>
parents:
689
diff
changeset
|
85 smtp_serv.ehlo() |
1581
67377fd685be
applied smth_auth options update patch
Les Peabody <lpeabody@ccom.unh.edu>
parents:
1532
diff
changeset
|
86 if self.auth: |
67377fd685be
applied smth_auth options update patch
Les Peabody <lpeabody@ccom.unh.edu>
parents:
1532
diff
changeset
|
87 smtp_serv.esmtp_features["auth"] = self.auth |
474
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
88 |
1583
8e77c75bd65a
made auth type optional in constructor
Marcin Kuzminski <marcin@python-works.com>
parents:
1581
diff
changeset
|
89 # if server requires authorization you must provide login and password |
8e77c75bd65a
made auth type optional in constructor
Marcin Kuzminski <marcin@python-works.com>
parents:
1581
diff
changeset
|
90 # but only if we have them |
981
c45c910714e4
fixed smtp_mailer with Johan Walles suggestion, and made some patches according to
Marcin Kuzminski <marcin@python-works.com>
parents:
952
diff
changeset
|
91 if self.user and self.passwd: |
c45c910714e4
fixed smtp_mailer with Johan Walles suggestion, and made some patches according to
Marcin Kuzminski <marcin@python-works.com>
parents:
952
diff
changeset
|
92 smtp_serv.login(self.user, self.passwd) |
c45c910714e4
fixed smtp_mailer with Johan Walles suggestion, and made some patches according to
Marcin Kuzminski <marcin@python-works.com>
parents:
952
diff
changeset
|
93 |
1717
7ff304d3028f
Notification fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1716
diff
changeset
|
94 smtp_serv.sendmail(msg.sender, msg.send_to, raw_msg.as_string()) |
474
a3d9d24acbec
Implemented password reset(forms/models/ tasks) and mailing tasks.
Marcin Kuzminski <marcin@python-works.com>
parents:
diff
changeset
|
95 logging.info('MAIL SEND TO: %s' % recipients) |
981
c45c910714e4
fixed smtp_mailer with Johan Walles suggestion, and made some patches according to
Marcin Kuzminski <marcin@python-works.com>
parents:
952
diff
changeset
|
96 |
c45c910714e4
fixed smtp_mailer with Johan Walles suggestion, and made some patches according to
Marcin Kuzminski <marcin@python-works.com>
parents:
952
diff
changeset
|
97 try: |
c45c910714e4
fixed smtp_mailer with Johan Walles suggestion, and made some patches according to
Marcin Kuzminski <marcin@python-works.com>
parents:
952
diff
changeset
|
98 smtp_serv.quit() |
c45c910714e4
fixed smtp_mailer with Johan Walles suggestion, and made some patches according to
Marcin Kuzminski <marcin@python-works.com>
parents:
952
diff
changeset
|
99 except sslerror: |
c45c910714e4
fixed smtp_mailer with Johan Walles suggestion, and made some patches according to
Marcin Kuzminski <marcin@python-works.com>
parents:
952
diff
changeset
|
100 # sslerror is raised in tls connections on closing sometimes |
2495
9766f0baf5c5
Use local_hostname in mailer
Marcin Kuzminski <marcin@python-works.com>
parents:
2452
diff
changeset
|
101 smtp_serv.close() |