@@ -0,0 +1,37 | |||
|
1 | # redMine - project management software | |
|
2 | # Copyright (C) 2006-2008 Jean-Philippe Lang | |
|
3 | # | |
|
4 | # This program is free software; you can redistribute it and/or | |
|
5 | # modify it under the terms of the GNU General Public License | |
|
6 | # as published by the Free Software Foundation; either version 2 | |
|
7 | # of the License, or (at your option) any later version. | |
|
8 | # | |
|
9 | # This program is distributed in the hope that it will be useful, | |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
12 | # GNU General Public License for more details. | |
|
13 | # | |
|
14 | # You should have received a copy of the GNU General Public License | |
|
15 | # along with this program; if not, write to the Free Software | |
|
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
|
17 | ||
|
18 | desc <<-END_DESC | |
|
19 | Read an email from standard input. | |
|
20 | ||
|
21 | Available options: | |
|
22 | * project => identifier of the project the issue should be added to | |
|
23 | ||
|
24 | Example: | |
|
25 | rake redmine:email:receive project=foo RAILS_ENV="production" | |
|
26 | END_DESC | |
|
27 | ||
|
28 | namespace :redmine do | |
|
29 | namespace :email do | |
|
30 | task :receive => :environment do | |
|
31 | options = {} | |
|
32 | options[:project] = ENV['project'] if ENV['project'] | |
|
33 | ||
|
34 | MailHandler.receive(STDIN.read, options) | |
|
35 | end | |
|
36 | end | |
|
37 | end |
@@ -0,0 +1,41 | |||
|
1 | Return-Path: <jsmith@somenet.foo> | |
|
2 | Received: from osiris ([127.0.0.1]) | |
|
3 | by OSIRIS | |
|
4 | with hMailServer ; Sun, 22 Jun 2008 12:28:07 +0200 | |
|
5 | Message-ID: <000501c8d452$a95cd7e0$0a00a8c0@osiris> | |
|
6 | From: "John Smith" <jsmith@somenet.foo> | |
|
7 | To: <redmine@somenet.foo> | |
|
8 | Subject: New ticket on a given project | |
|
9 | Date: Sun, 22 Jun 2008 12:28:07 +0200 | |
|
10 | MIME-Version: 1.0 | |
|
11 | Content-Type: text/plain; | |
|
12 | format=flowed; | |
|
13 | charset="iso-8859-1"; | |
|
14 | reply-type=original | |
|
15 | Content-Transfer-Encoding: 7bit | |
|
16 | X-Priority: 3 | |
|
17 | X-MSMail-Priority: Normal | |
|
18 | X-Mailer: Microsoft Outlook Express 6.00.2900.2869 | |
|
19 | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869 | |
|
20 | ||
|
21 | Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas imperdiet | |
|
22 | turpis et odio. Integer eget pede vel dolor euismod varius. Phasellus | |
|
23 | blandit eleifend augue. Nulla facilisi. Duis id diam. Class aptent taciti | |
|
24 | sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In | |
|
25 | in urna sed tellus aliquet lobortis. Morbi scelerisque tortor in dolor. Cras | |
|
26 | sagittis odio eu lacus. Aliquam sem tortor, consequat sit amet, vestibulum | |
|
27 | id, iaculis at, lectus. Fusce tortor libero, congue ut, euismod nec, luctus | |
|
28 | eget, eros. Pellentesque tortor enim, feugiat in, dignissim eget, tristique | |
|
29 | sed, mauris. Pellentesque habitant morbi tristique senectus et netus et | |
|
30 | malesuada fames ac turpis egestas. Quisque sit amet libero. In hac habitasse | |
|
31 | platea dictumst. | |
|
32 | ||
|
33 | Nulla et nunc. Duis pede. Donec et ipsum. Nam ut dui tincidunt neque | |
|
34 | sollicitudin iaculis. Duis vitae dolor. Vestibulum eget massa. Sed lorem. | |
|
35 | Nullam volutpat cursus erat. Cras felis dolor, lacinia quis, rutrum et, | |
|
36 | dictum et, ligula. Sed erat nibh, gravida in, accumsan non, placerat sed, | |
|
37 | massa. Sed sodales, ante fermentum ultricies sollicitudin, massa leo | |
|
38 | pulvinar dui, a gravida orci mi eget odio. Nunc a lacus. | |
|
39 | ||
|
40 | Project: onlinestore | |
|
41 |
@@ -0,0 +1,73 | |||
|
1 | Return-Path: <jsmith@somenet.foo> | |
|
2 | Received: from osiris ([127.0.0.1]) | |
|
3 | by OSIRIS | |
|
4 | with hMailServer ; Sat, 21 Jun 2008 18:41:39 +0200 | |
|
5 | Message-ID: <006a01c8d3bd$ad9baec0$0a00a8c0@osiris> | |
|
6 | From: "John Smith" <jsmith@somenet.foo> | |
|
7 | To: <redmine@somenet.foo> | |
|
8 | References: <485d0ad366c88_d7014663a025f@osiris.tmail> | |
|
9 | Subject: Re: [Cookbook - Feature #2] (New) Add ingredients categories | |
|
10 | Date: Sat, 21 Jun 2008 18:41:39 +0200 | |
|
11 | MIME-Version: 1.0 | |
|
12 | Content-Type: multipart/alternative; | |
|
13 | boundary="----=_NextPart_000_0067_01C8D3CE.711F9CC0" | |
|
14 | X-Priority: 3 | |
|
15 | X-MSMail-Priority: Normal | |
|
16 | X-Mailer: Microsoft Outlook Express 6.00.2900.2869 | |
|
17 | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869 | |
|
18 | ||
|
19 | This is a multi-part message in MIME format. | |
|
20 | ||
|
21 | ------=_NextPart_000_0067_01C8D3CE.711F9CC0 | |
|
22 | Content-Type: text/plain; | |
|
23 | charset="utf-8" | |
|
24 | Content-Transfer-Encoding: quoted-printable | |
|
25 | ||
|
26 | This is reply | |
|
27 | ------=_NextPart_000_0067_01C8D3CE.711F9CC0 | |
|
28 | Content-Type: text/html; | |
|
29 | charset="utf-8" | |
|
30 | Content-Transfer-Encoding: quoted-printable | |
|
31 | ||
|
32 | =EF=BB=BF<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> | |
|
33 | <HTML><HEAD> | |
|
34 | <META http-equiv=3DContent-Type content=3D"text/html; charset=3Dutf-8"> | |
|
35 | <STYLE>BODY { | |
|
36 | FONT-SIZE: 0.8em; COLOR: #484848; FONT-FAMILY: Verdana, sans-serif | |
|
37 | } | |
|
38 | BODY H1 { | |
|
39 | FONT-SIZE: 1.2em; MARGIN: 0px; FONT-FAMILY: "Trebuchet MS", Verdana, = | |
|
40 | sans-serif | |
|
41 | } | |
|
42 | A { | |
|
43 | COLOR: #2a5685 | |
|
44 | } | |
|
45 | A:link { | |
|
46 | COLOR: #2a5685 | |
|
47 | } | |
|
48 | A:visited { | |
|
49 | COLOR: #2a5685 | |
|
50 | } | |
|
51 | A:hover { | |
|
52 | COLOR: #c61a1a | |
|
53 | } | |
|
54 | A:active { | |
|
55 | COLOR: #c61a1a | |
|
56 | } | |
|
57 | HR { | |
|
58 | BORDER-RIGHT: 0px; BORDER-TOP: 0px; BACKGROUND: #ccc; BORDER-LEFT: 0px; = | |
|
59 | WIDTH: 100%; BORDER-BOTTOM: 0px; HEIGHT: 1px | |
|
60 | } | |
|
61 | .footer { | |
|
62 | FONT-SIZE: 0.8em; FONT-STYLE: italic | |
|
63 | } | |
|
64 | </STYLE> | |
|
65 | ||
|
66 | <META content=3D"MSHTML 6.00.2900.2883" name=3DGENERATOR></HEAD> | |
|
67 | <BODY bgColor=3D#ffffff> | |
|
68 | <DIV><SPAN class=3Dfooter><FONT face=3DArial color=3D#000000 = | |
|
69 | size=3D2>This is=20 | |
|
70 | reply</FONT></DIV></SPAN></BODY></HTML> | |
|
71 | ||
|
72 | ------=_NextPart_000_0067_01C8D3CE.711F9CC0-- | |
|
73 |
@@ -0,0 +1,248 | |||
|
1 | Return-Path: <jsmith@somenet.foo> | |
|
2 | Received: from osiris ([127.0.0.1]) | |
|
3 | by OSIRIS | |
|
4 | with hMailServer ; Sat, 21 Jun 2008 15:53:25 +0200 | |
|
5 | Message-ID: <002301c8d3a6$2cdf6950$0a00a8c0@osiris> | |
|
6 | From: "John Smith" <jsmith@somenet.foo> | |
|
7 | To: <redmine@somenet.foo> | |
|
8 | Subject: Ticket created by email with attachment | |
|
9 | Date: Sat, 21 Jun 2008 15:53:25 +0200 | |
|
10 | MIME-Version: 1.0 | |
|
11 | Content-Type: multipart/mixed; | |
|
12 | boundary="----=_NextPart_000_001F_01C8D3B6.F05C5270" | |
|
13 | X-Priority: 3 | |
|
14 | X-MSMail-Priority: Normal | |
|
15 | X-Mailer: Microsoft Outlook Express 6.00.2900.2869 | |
|
16 | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869 | |
|
17 | ||
|
18 | This is a multi-part message in MIME format. | |
|
19 | ||
|
20 | ------=_NextPart_000_001F_01C8D3B6.F05C5270 | |
|
21 | Content-Type: multipart/alternative; | |
|
22 | boundary="----=_NextPart_001_0020_01C8D3B6.F05C5270" | |
|
23 | ||
|
24 | ||
|
25 | ------=_NextPart_001_0020_01C8D3B6.F05C5270 | |
|
26 | Content-Type: text/plain; | |
|
27 | charset="iso-8859-1" | |
|
28 | Content-Transfer-Encoding: quoted-printable | |
|
29 | ||
|
30 | This is a new ticket with attachments | |
|
31 | ------=_NextPart_001_0020_01C8D3B6.F05C5270 | |
|
32 | Content-Type: text/html; | |
|
33 | charset="iso-8859-1" | |
|
34 | Content-Transfer-Encoding: quoted-printable | |
|
35 | ||
|
36 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> | |
|
37 | <HTML><HEAD> | |
|
38 | <META http-equiv=3DContent-Type content=3D"text/html; = | |
|
39 | charset=3Diso-8859-1"> | |
|
40 | <META content=3D"MSHTML 6.00.2900.2883" name=3DGENERATOR> | |
|
41 | <STYLE></STYLE> | |
|
42 | </HEAD> | |
|
43 | <BODY bgColor=3D#ffffff> | |
|
44 | <DIV><FONT face=3DArial size=3D2>This is a new ticket with=20 | |
|
45 | attachments</FONT></DIV></BODY></HTML> | |
|
46 | ||
|
47 | ------=_NextPart_001_0020_01C8D3B6.F05C5270-- | |
|
48 | ||
|
49 | ------=_NextPart_000_001F_01C8D3B6.F05C5270 | |
|
50 | Content-Type: image/jpeg; | |
|
51 | name="Paella.jpg" | |
|
52 | Content-Transfer-Encoding: base64 | |
|
53 | Content-Disposition: attachment; | |
|
54 | filename="Paella.jpg" | |
|
55 | ||
|
56 | /9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcU | |
|
57 | FhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgo | |
|
58 | KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCACmAMgDASIA | |
|
59 | AhEBAxEB/8QAHQAAAgMBAQEBAQAAAAAAAAAABQYABAcDCAIBCf/EADsQAAEDAwMCBQIDBQcFAQAA | |
|
60 | AAECAwQABREGEiExQQcTIlFhcYEUMpEVI0Kh0QhSYrHB4fAWJCUzQ3L/xAAaAQADAQEBAQAAAAAA | |
|
61 | AAAAAAADBAUCAQYA/8QAKhEAAgIBBAICAgIDAAMAAAAAAQIAAxEEEiExIkEFE1FhMnFCkaEjwdH/ | |
|
62 | 2gAMAwEAAhEDEQA/ACTUdSsdhRCNE54GTRaBaXHiBtNOVo0wEpSt8BKfmpWCZRPHcVbdZ3X1J9Jx | |
|
63 | Tla9OBpIU8Noo7Gjx4qdrCBkfxGupUSck13GJjeT1ObEdthOG04/zpX8SNXjR1njym46ZMmQ+llp | |
|
64 | pStuc9T9hRq/X22afhKl3iazEYHdxWCfgDqT9K83eKfiFG1RfIEi3tuC3W9KlNh0YLqyeuO3QV0D | |
|
65 | MznM9O2uai4QI8psYQ8gLA9virY615P034xX+zNNslLDsMKOG1J5HuAa3nQPiBZ9WtpUy4lmcE4U | |
|
66 | ypXP2rmMHmcI/EealD7te7ZZ2S7dLhGiN9cvOBP+dIF18btHw3C1DkSbi7nATGZJBPwTitTIyZp9 | |
|
67 | SsCun9oJaEFUDTy0oyQFyXSOfoB/rQOL466huE9LIagxW1A48tkuKJxwBlQrm4YzNhGPE9Mmua8Y | |
|
68 | JrzsrXPiQ42y7+KtsZt4kpS8ltK0p91J5IzXGFr3xFef8pMqE4vJABZT6se3FDNyEZzNCh89Tfbv | |
|
69 | aoV2iKj3GO2+0eyh0+h7VkWq/CqTDUqXpp0uJHPkKOFj6HofvQRzxZ1bbwFTG7c+jO0lKeh+cGi8 | |
|
70 | bxrebZZVMtjDqljKgw4Rt9uuea5vEIEceoL09ZnHQoyGy3KaOFhxO0j6g0J8QNPr3tzorHmsJSUv | |
|
71 | NgdQeprTIuqbfqdtD7MRxh7HO/H6ZHWlnW0e5tQnv2WgupAyEg8p9xUl7WGowpzKCoDXyJ5nvMdK | |
|
72 | Uuho4bSv057CqK2stIWrgEZp2kWtE+O5+MC0OKUchHFCbnaWVNeW1KU3tTtwtAUkj6jkfpXoK7gQ | |
|
73 | AZLsqYEmJ0mUBlLeCfeqHKl5PqJopNhriupQWyoqPpKeQfpTXYPDW+3ZlEhTTcVpXI8w+oj6Cmty | |
|
74 | qMxTazHAi1ZLG/PXuKClv3Ip7t2n4yI3lKZSsEc7hmicXwfu5ThN22fCUH+tXB4QX1KdzN6WVjth | |
|
75 | Q/1oDuG/yjCIV/xgWLouQFfiLK/5LqejbnKT9D1FStX05DRaYrTN8K232wEl1aMJV856VKF9hPc3 | |
|
76 | 9QPM32HEjxEjykBSh/ERSd4s61uGjLbBnQrcie2t4pfClEFKAM8Y704uvtsMrdfcQ20gZUtZAAHu | |
|
77 | SawHxt8V7PKt/wCytPp/aLrToW7JAPlNkAjAPfOfpQ0JY4E42B3Nf09ruwXvTQvjM9lmGkfvvOWE | |
|
78 | llXdKvn/ADrONZeNwU28zo2Ml1tHpXc5Y2spP+EHlR/5ivOzYkPPKdjMechRDjrCUHy1Ec9Aa1Lw | |
|
79 | l0VF10pcy4XJC0RlbTFTgKbHwnokfSibFXkzAJbiJ0tN81jc1yHXplzkEEqkPA7UjvtR2H1/SrOl | |
|
80 | rGu6NvP7Q8yhaWkDruVj/n616Lvl20n4Z2cpeS02tSfRHbAU69/t8nivOGoNXzNQSVRbFAbtsFal | |
|
81 | FESEjBOepUR1rBs3D8CFVMHjmXNYW+wWtsMrlMvyyOW4h3FB9irpn70lx7k9AeDttW4w70DgWd3+ | |
|
82 | 1NmlvDi7XpL0iShcWG0dqllO5SlHsB35NG7l4PSRG823z0YbGFqkDaFK+MZx7d6XOu09Z2M8MKHb | |
|
83 | OBM1vBuAkJcuUgyHXRu3KfDp+5ycVTaeU36kKUlYOQQcEVrehvC5l1Mh/VClISHFMttIVgL45VnH | |
|
84 | TkEH4rQbjpHTbyGWVQIzL7bYabc2AnaMfYnAxk0K35Smo7e/2IRdC7eXUwfT5m6pfbtC/wARIlLW | |
|
85 | VNu7yoN9MlQ9h3NO+n9Cwo8rzZU1Sm2Mlx9YLaUkHjaOv3Nc7zd7FoyY5D07HR56SfMl7961ZGNo | |
|
86 | 9gKXrtd77dnkssoSwt7K9rZG8jHU44Tkc9q0rvbyvipnNgT9kTRLvqKy2JDgS/8AiH3hjecKXjv2 | |
|
87 | /SkG8akmRyhqG+hKSQ4dpyofBxxV2w+Hkuda27pMW5tcSpWxati1HJGQTkYp70xoS2MW1pp+ImXN | |
|
88 | koJLi+UtfP1FAt1dFPHcPXQ9nPUy+/3pu4usrYZS16MOKCAkuLJypRxX5aG5ExX4VlfC/Vt98e3z | |
|
89 | WvL8M9NsNMtyFyVyGx6h5uPMPyMcV9Q9HQbbdWwzHQGFHKVhStw+uTQTr6tu1IQad85M46baVarV | |
|
90 | uVkJ/mDVCVqWUll59t4FxlW0ocOA4k+1P8uLGU35UgAhQ2kgdRWUeIMi2WyKqASFLJJbWchQI7Ul | |
|
91 | pWWyw5GSYZ1IXA4Ez7U12mR7q95jCWgTuCQeoPsaGqntylbCpIdxnaSM/wBK56lujtydZS4UkNIw | |
|
92 | CBzQO4RURywWnUupcQF7knoT1BHYg5r0lFY2DIwZKvYq5x1DjUo26WzJKEuIQoFSFDIP+9bzaL0x | |
|
93 | +HZcZcQpC0ggewIrzYzNJQGpGVt+/cUw2PU8+0vqWEJnW8q/9KzgpHslXb6UV6yw4gBZg8z1NZbj | |
|
94 | Ek43LQDjkZFMLbkMcJW3+orKvDq86T1SUssrEef3iPq2rz8f3vtTZrtizaR0pOvD8XephOG2959a | |
|
95 | ycJH60HBBxDBhjMB+L9/RY7WpT7jam3kkNNJwSs+/NSss0Bpi4+Jmpfxl7kPOQ2k7iCfyI/hQOwz | |
|
96 | /vUroqrUnceZ8LnIG2Cdaa61Dq54i7SVJi5ymGwdjSf/ANe/86s6W0TLvkNySp5pcVjBUy0oAD5x | |
|
97 | 1P1NbDbPALTQjp/aC5bj+OS27tH+VOmjPDqw6QEv9lNPFcpIQ4p5zeSB0A/WtNYoXCwK1nOWgjwk | |
|
98 | sFrg2wuJjtKl5IJUBwPakLxDXbNI6/alaGW6b87uL1vjJCmAogjcvHTrnb8DpVnxj1q1oOS7b9PP | |
|
99 | j9qSEErA58gHuf8AF7CsStOurpBjKZioQqS6sqU+vlayepPvQytu3cgz/fEPWaXfFjYEfLlo5+bM | |
|
100 | /aurr+X33vW6lIJUD/dyen2p80zboMNG6NBEGOygJLy04cdAGRjjn5NYRD1NcjMMme8XpST6Q4Mp | |
|
101 | H0HStstF4kO2lMS5vAlTfq9O04PQZ+KifILaqg3PnPodS5o0S3I0q4x2T3Kr+obzH1HsjuFFpeUU | |
|
102 | B5s5Snck4ST0z0p502w5HZW86qW5lXLbpSeMfHFZH4gpFutbDlrmNtujlxvzc705HAHfB5qknVSI | |
|
103 | VliuWK7STcHVBL7Ticc8c8f70IaMaipWq4z+oo6jT2sr8ma3qCfBky48be4zvcAOB6gR/CMd6EXF | |
|
104 | m9EPKhx3Vx92EJdADmOmQKJ2y5xVpiJlW+OzPSj1LbSBtURyoGjFzWqPbHljClFBLbiBnHHUmpeT | |
|
105 | WdqiPISuDM/e0bark4YzkEJkJ9RebGF7u+T/AKVeg6DbVdXHJ6U/hi35KAlRGU44zj/WrtpdfSlt | |
|
106 | D7m54jKznr/WnOAVKa9Y7cGtDVWodhaH1WnVlD7cZxPhq3NMobbeBeZQnalKlZ47cUQDSGtvlqwn | |
|
107 | GEp7AVQdbddWQHkp2dOea6qWHQlPmJSscEE9aET/AJCK/X+JFxUtuKecHnKxx8VXRKiBSkuKII55 | |
|
108 | PSvq4yUQmf3qspxwc8is71fqZMeKtTO0AHn3V8UaitrDgdmcdtoyZ215q1USShq0bZClghTYPqFL | |
|
109 | Vr0xH1otbt1XKZkpT6cccfOaF6SZkz7q7dZYWHjz0ykJp2Yvi4YaYVHdUXjs2eSUlR7HPt89KoW5 | |
|
110 | p8af5D3OVLldz9GLmsNLR1WZiI+oJlRB5aHgBuKe2cdaxd5tVsuy0OJbdWwvkKGUq+or0PqiyXVy | |
|
111 | IJ7za1NlIJbz6m/fgdv61lN000qWJ09EWQ8++6lqM01k8geokY5p/wCK1RXK2Nn/AOz75PS1vStt | |
|
112 | Y594iCUnOauWi5SLXMDzIQ4g8ONOp3IcT7KHcVduWn7nbWg5OgSI6SopBcQUjPtzXK1RX1OqkMtb | |
|
113 | 0xcPO9PSkHrzV0WKRkHM86a2BwZqFm0da9c2pdw0asM3JgBT9qdd2uNH+8y51x7A/rSjrXUmq129 | |
|
114 | Om9TuyvKhu70NyUYd4GBlX8QofG1hcLbrBF/tZ/DvtqGEDhJQONpA6gjrXq61f8AS/jDo9mXNhNu | |
|
115 | nGxxPR2O5jkBXX+tY3bcFhPtoPAin4H6gsMTQgLEhtM7eoyGioBYI4Tx7Yx+pqUr668ILjZXDOtS | |
|
116 | XZsdvlMiGkJlND/GgYDg+Rg1KwUDHIM2r7Bgiei5NwiQo635cllllAypbiwAPvWO678c4UJuRH0y | |
|
117 | gSHkDBkrHpz2CR3+prHbXJ1L4o6matwkKaYP7xzkhthsdVEf8NLWrzbo94fh2RKjAjqLSHFnKniO | |
|
118 | Cs/X/KuLSAcN3OfYW5HUD3SXJutxfnTnVOyn1lbi1HJJNPnh9otyfbJF5lLabjpJQ0FjlZHUis9C | |
|
119 | lDOO9bdHkS4WkbXBlIMdaGUnyhwkjqFfU5pf5K566gqe+I98TpBqb9pnB/Q9wu7kdyOGUNNp3oWp | |
|
120 | Owq7+3P1r9uQmqllqS+S+ghClFWR+vtT/Z7goWGOopbjodwEltQOcdR16/WrcrTFmW4tyYZHmuDc | |
|
121 | dhwkDHSvNvq2BC2+up6PThdIzDvMypelJN2lI8+M9JKxsZS1/Cfcn2+tF9K6Oh6ZeW5fYS5VwKgl | |
|
122 | locpR3Cvk0+zJTdtioi2htDe5OVL/KAPcn3r5j3ZtdmkrKFTFJ3EDG7BAzgH9a+XX2sNi8CJXaZW | |
|
123 | c3GIN7u0u931+KwhaGGspKQMKcKepVV5UmU1DZZtzspMVKQXm3F5B+gHIH0zQCBImKuiJMeCuEH1 | |
|
124 | YCfVkjv+bqSKr6t1U7a7uxEgurS0yMLBASc/arlenBULiSGtOSSY6WKJKXckJU2tplSt6FA7gfvW | |
|
125 | gxA/sUBggDGSayGya5ed8tkNqSlXVYOVVpEZydIablRFF6ORgjGFJPyKga3Tuj5Il2rVC6sKT1L9 | |
|
126 | tiuPTnDI3eSfc/lqrqWOuHFK4qlF1HIX7j2NWIkyQ8XEApSUcD/Ea5TmZj2SggqUMKSrp9KUByQM | |
|
127 | T45U5mSS9UzJMtMZ93GFcqJ7UL8Q3UOOww24Bx6h3V8/Sqev0sx7u4IqkB5w8tJ4KFfNBXG3Fuo/ | |
|
128 | FPqLxA3FXXHtXp9PQiBXXiTGZrmIjTo68qh+Y2ygPhYSAlXIBz1rYHp04RkNRnWDOA5KyEgDrgVh | |
|
129 | mmSmPcCfQpWCACnINFdRXOW3GQ4+60GgcJKDgr+R70lqdP8AZaAvuUK3woDY4mqyrjeFWppZZUXW | |
|
130 | lnzUlYCVp+K+LLeYEoLLG5lGdxQk4wcfyrOourlyIzbDhcKVNhHB7e9XYlxatbam0dVDOAOT96Rf | |
|
131 | TEDBHMMpU9dTQpVxiTWXGUqDy1n0hxCSAPvXnfWVtnWO9TI8lpLHnZOGxhKkE54+K1K1XhLj4S4j | |
|
132 | GOnxX5qiNZ7wlpd1Di30ZS0hKtu4kdCaN8fqG0luxhwYtrdOtqZXsTA1dTWh+B+unNG6tbTIWTap | |
|
133 | hDUhGeE56L+oP8qSbtBXDnyWSB+7WUnadwH3rgYT6IQmEpS0VbU5WNyj8DrXr/F1/ueXIZT1P6Hh | |
|
134 | aVoSpJBSoZBB4IqVjPgP4ii72eHZLsSJrCPKadP8YA4B+cfrUpMgg4jK8jMybw5vUfT/AIXatujD | |
|
135 | iRc5S24DX95KVAkn/P8ASstODk9asPSXvwZbUEoQpzhtIwkYHt9z1q3NZiO2uNMhFLbif3chkryc | |
|
136 | 9lAHsabbAbP5i6DI/qctPSokW9w3p0cvsIcBLY7+2fituuVxYvDbAMZ2VIUkeX5I5x3Tgdqznwz0 | |
|
137 | xbb/ADZQuy3w2y2FISycHJz3+MVtWnNLwNMb3G0SZDvlgb3DlWPgf86V5/5e+oOAc7l/9y18WLK/ | |
|
138 | IdH/AHB+l23bLPLMl0RkyQS22r1eWQO/tR178NEju3GS8ZahyVIc7ewA4qpKKfxzTMOGHCsBZSob | |
|
139 | ueveitut+XGo8tpDacEp2DAP69ahNYHO4yo1rMxJgt22RLy0l5bYQ04jckLWfM+o7frVPUMpdg0a | |
|
140 | 65EfXvaX5XOArnp9hTtGgRbcyhL6PPbaG1ClnJAPvWeeMl0FogwnWGYkqKHSFxnUkpSojgkD79aJ | |
|
141 | pQbblr9ZgNRcAhMzli9zZYfS27NkPBIKAFKVnnkn2pf1PaZbMNm4PpkDzeV+c0UEK+p6/WtX8H5M | |
|
142 | GXDm3OS22Jq3P/W2AlIHwOgFVPF+VBfjqKi4sEHBKSAVfFegXWsmo+pV4zJZ0wareTFbw71Y1Ab/ | |
|
143 | AAjbcNh1Q/8Ae9yaYU33VESW5KdK1wucuMpwgj3FYq4S456E7VDjimGHqa6wYqIS5HmMq42LOQBT | |
|
144 | Wo0AYll5z+YCjV7MA+puVmuDkgh7evZt3bsdK46s1uiNZSY6iHwSj82CPnFC7PcbdbdOxkPTiqaB | |
|
145 | 5iQlXCf61mV9uC79dn39oDIVztGAajafRK9pPoSrZezKAOzKclyXcLgue8VLUo7sHrUaVIfeCloG | |
|
146 | T0Uo9qstKdbcBLZUg9DiuzkbY4VDIBGQkdBVkuBxOrRtAwf7naKlyMoqQ4pRI9RHH2qtc1/i/KS+ | |
|
147 | p3yWchtKwcIzX7HnoQv1nbgYUR7+9NESXCmR1xdjexxOXCTg9ODSzO1bBiJvCsCBFu3eahwltCnA | |
|
148 | O6ATj6082K2rlltyXGSsIGEhzPP1xQa1QJNngLmMuNPMrPKE5BwKuzrw6Yu6JJVGWkZSkHIXn274 | |
|
149 | pe8m0+H+51G2DBlu4J/DzFKbWhICiS2EgH7H2FD3JTMuclt7B2ArBzgJPvQNF1lSUFoON5JyST1P | |
|
150 | tmgEu5yY0wgJ2uoUd27nPtRKdEzHk8xezVLUnHudtXsRYc4rt8pxZdKvMSpWcH60M07a03W5JZcW | |
|
151 | UtgFSj8Dt96orKnVKUQVK6nv966R5b0dCksLLe4gkp68dOatKjBNgPMiM4Z9xHE1fwCkQx4pqYdC | |
|
152 | vJcC1RwT0WkZH8s1KVPDm+Psa208ogAtysqWOqyo4JP2qUtanPM2jDEL+OWn49u8R5UK0MbGClDg | |
|
153 | bSOApYyQPvSzM0rKt9qiXCRs8uSSlCeQoHnII+1aJ/aAZWjxImL3FILTSwR/+RX7bhqJ561XC5Jj | |
|
154 | O20pSnyFYJWMZypJ6djWLdSa1BzxDUaYWnaOzH/RlmZ0nYWPJab9SQqS5t/eLV2+wzj7UfZmouM8 | |
|
155 | MNtlsNoKlFZAV8H4FULPfmrmtyCtwJfQjKggFIVx2orHsbUZ1TzCktFwfvVKJJUB05968jqHaxyz | |
|
156 | y3t+sBeiJJTLSXA6hAWscFSTjke561yfkAlte4h88BIJwB3q5Hjx297RUpWfUD+YYqs5Gjx3HJJK | |
|
157 | ywRylIGM+/vShBMIrDMtpKiyVKcWtvaP3aRnn3HevOfi9eZM/UEiEv8A7eOHgkhfT0jg4+5r0JJu | |
|
158 | ENLad0plpWM9c8dqUtTaMtGoJS37gyXH3UANyEHH6iqXx99entD2CK31m1CqmZZomd+HjORbXte8 | |
|
159 | hOVLSk4USeTRm4xrvqbTjseUGmozTmVPLH5fgfNNNhYtWmJardbw3tf59XqIwepNM2poyJVpdKEt | |
|
160 | +SRuCR/EfemLdWou3oO/cJXVmsI08z3BiFp7UakMuonR0jk47+31oG7iTM/dkNoWvCdx/KCe9P8A | |
|
161 | dIzR1PAZfjtI3gx3QsAJHznFKOqbfbbXKSzbriZrwJ8390UJRjpgnrXpdNeLAM9kSDqKDWT+AYcu | |
|
162 | 1ivcK2x1KdiyYSejrCgSnPZXehTLqou7cghKRkgd6Px9SWp2xsMT23HF7QgpaOCFDoaCxFee4UKC | |
|
163 | gCT14P3oKs5B+xccx+kIpG0wlaJKZLB9KglB5Uo9KsLeDj2GzjI+1AjmPLH4ZzCVEApPAIopGCFR | |
|
164 | 1rSpW4naaFbWB5DqUabMnaYEuTGyc40le4deO1fMZam17krwAOua7yYjyZCiG8hZ65ya57WW3W2y | |
|
165 | lS3FDkFW0CmgdygdydZ4MT1HezzUy4iCwVKLKcFtSuD74r9uVtRJabLZ8obckpTlP60ItSLXOeDT | |
|
166 | KlR1spG9W7clw/ejN4mXa0MDYA9FLn7olIxtxyFCprVkWbU7/cY+0FNx6/UU70GYDBQw6FrUcAgH | |
|
167 | ke9Lq3FHkkk980xXedHuYWt6D5L4A2rQrCQO4xV+yaaiTrW5JL29GRgflUCOoJ5wPmqaOKUy/cl3 | |
|
168 | Zufw6itbriuAJHloSVPNlvJ/hB61RCwVAKPHc1YubQZmvNpSlKUqIACtwH371Tzk/FOKAeR7ibEj | |
|
169 | g+o06QWy7riziG2pDf4lsJCjknnrUrv4TtIe1/ZQ50Q+Fk/TkfzxUpW7ggQ1a7xmbF/aGsKEX83N | |
|
170 | U4IU8wFJZWMbtvBwf04pOieITadOMxXmWRJR6CsD1HHTH2xWx/2irAu9aJTIjJJkQXgsYHJSrg/6 | |
|
171 | V5os1rjsynVXOQY8uMsER1t8r+M9j0pSymu1P/J6j+ktatxtE23QtvmwYar3cX0JjyE+hhQ9ROeC | |
|
172 | a0CJJaLTe+Uhfm/l7/YUhWKUxfbKxCztdQkJStWdySf7o/rTHZLC7bW3g5M819Y2pLiPy/TmvLak | |
|
173 | AsSeCPUp7i1hB6h+Ytbnl+US2AfVx/nXyWg4kpeOQ4CPT2FVX0JacS6qWpASnC0qIINDLlKKGyGp | |
|
174 | QaLmADgYA74xzSY7zDpWW4Eq2e0N2yXMdmKS6twlCUO4IQj3+po86RGWzGjtNgO4AATwlPXNAmPK | |
|
175 | dLanH15K04SEE5x7GrsGWLnclJ9SHGuCrOCU+1E2s5zNfSE/7mJniFFciyHJ6XEktoIylWBjPPHv | |
|
176 | SnC1HKlFK25Kls7cBpSvy4PtWwXHSsCXIUqUt15Tg2qStfpx7kUIc0JZIqHlpGwqTgFJxgZzx809 | |
|
177 | XfWE22DJgwQD49TGr0pN2nlL7i2JKjvC1DCc9qUtRR47sjLQWiYkYdbX0PyDWwax09bZpcZtpdbl | |
|
178 | FJO5aztJxkD46Vl83TclMT8SlDjh28lIJwfY/NXdDqK8Ag4iGsosYHK8QVKiRIztv/BqccWUhT6l | |
|
179 | jASruBVpEoKkOAYLhJO0D9KGIUoqQ2vucYPaidptb0i6lCMNt8lSlq/N8VRcDblz1J9Tbf4CEGYb | |
|
180 | rzbjiEBLqQQAtQAzUs7jrqnGFNJy0fUMcA/WjlutUySrLT0dLGw5C08hQ6fbNCrTBuVlubjjkJ58 | |
|
181 | pJwU5Lef72B1pQMLFYZGY0bHQggS7KYUw35ivUlXU9xSfdCp5QWltSUp/iPfNaBLtv4KGiVOkYcf | |
|
182 | X5imS2dyE9uM8DvjrQc2hyYsg+WGSfSQKxRatfJMLepvXA7iilxtKmlMJcQ4nlSlKzn7U4wbou7Y | |
|
183 | RK9SGeUpzjJPciuLmi5ayDF8t3nsrHFfFx0lcbeSptYWhKUlS0EjBP8ADR2votx5DMSFF1eRjiGF | |
|
184 | OWuK4mO+y2lTyFIWpw5SCeivgZpNuCzBU4zEmBbTnUtq4UP+ZoxaNIXG6So5ebX5C3NillXQd/pV | |
|
185 | zWlmYtEJmEiARLz6XEerf78jrXy3VK4XO4mDsSzbwMYiQI8iQlx5tpa2kfmWBwK4BKVdDiicpq5t | |
|
186 | NGItl1DbbYdUgDgAjO40JZSpxwBA5zVBDnn1EnGD+5rn9n+1pXeZlzcQFIYbCEEjoo9x9galN/hp | |
|
187 | BFn06wwQA89+9cPfJ7fpUpG072zHql2Libtf225NukRX+WnWyhX0Iry9drM3ar2i4XN0h6BKS28r | |
|
188 | O5TiByleD8Yr0ldJyHWtyOD0UKzHW9taloXM8jzkhBbkN4yVt+4HunqPvQXBxkTqH1E2dck2u5wp | |
|
189 | 9rUW0yiVPKCdwQgkYJx361pca9NSGG3C5kIR6nkD0g/Ws5uMMT4DJtFyZTCdSlAjlsJKTnHpP+hr | |
|
190 | hapk+yxP2fNW7+DeSrAIyN3uP0qJfQtij8/9lPTlkznmPNwdh3FgILzgcK/3bqSfUfZQpW1BMuNr | |
|
191 | hKeeQlCyrCWeu0DjdXL9oW2NAadjuLbdj4UFBQIWoe6Scg/NEo5cu81h+5JAQtvcgdE++Tmlvr+o | |
|
192 | 5YZEbpvstyvRlPSGtFvNJjzox4JKHknHP0pq03c2GlTAp5j8Spw7d5CVEYHANL9xsrTbMibHUCUJ | |
|
193 | IKEt8JPvxSey4ZylLX/8yOSMbqIK67stXwIT0NxyZubSDKUX1lbawkAZ9u+KHXeez5ja3HwhpPxy | |
|
194 | D2HNZu1rG7W5zeqS0EgbUggHA+nvVaNqOXdr5HVNcQhCV71BKQNx7ZzxQxoW7PUIgGcmNs6SqW+W | |
|
195 | 2hvdc53qRgkHgc0YsdpVGgluSGygrUdqQClJ+TXVu2sSSu4x3PxD20qDa14yccAe2KruPvNw23Lg | |
|
196 | z+HDytqh1Chjoo9utAJ9LC22h0CqMRc15omyXhCnLc0mLc0c7mcBKiBnCk/PuKy646YvkCU0qLuL | |
|
197 | iWylQUPyE9cH5/WtkRLs0VhTLzqW22sEqLm5xXPTjtV2bLt88sttrCSpQxsOSCPeqGn191ACnyH7 | |
|
198 | k27RI/K8TFdFOOYcTcAWENqIcUpJBz23DvTqvWMRElm3uQiUpIQ08BgJV259qdFWjzorsd8RXQ7k | |
|
199 | KJHCh7E9yBWWatszVpmsKRuCRgJTn0g5P9KKt9WrtJYYM+q07IgQGWpsNN/lsTH5W7yF7H22+Nqc | |
|
200 | ZJz84r8sMda284IRztBHal19yRbslgltMjKVA01abvCmLamK6AprbtGeoo1ysKwF5Eao0TsxK9xu | |
|
201 | 03BS6hS9gU4DzkUWj26G4osKbSpRysBQJGaE2W822NHDbyngM7s4wM/avmZqdhrelhorSoEbxknn | |
|
202 | 5qVtctnEOdLZnkQvKjIhuNojNZyraQMYTx1PtXzeYMZtDS30IS4lQWhWMkH4+tIxvz8GT5iQt1Bz | |
|
203 | vSoHBPbNVjPvGo33HWnSEsgqTgcE9NtMJpWyGJwJ9dQVGOxAGt9QruazbYxQGMAOOjBUo9hn4pf0 | |
|
204 | vYiu7AvEKQ0rcQOh9hX47bJMW5qjlrCyohKSoEgfOKboflWmIhhsb5S+Sfk16SsCmsLX1PLWoXsz | |
|
205 | Z2I6QZ3kBKc5dPGPapSw28qMn1q3PK/Mc9PipQ4YVMwyJt2oHV2uZuGVML/mKoKWlwbkHchQ4qkN | |
|
206 | ZaevsQxzcmQsj0byUkH71TgOvRVqbeG6Ks+l5PqSD9RXxBioihqTS8Vm7JlNyHGIqlZWWujDmQQr | |
|
207 | H9339q/bihUVLqVvh1ak7S6g8KHwO1OshQIIUAoHg96z7VdpkxIEw2chTDqTmOr/AOZ90Ht9KWv0 | |
|
208 | 7WkYMf0Oqr075sXIgLTkZl7Uy1zZCQhpsuDOOuQOa05NvYkS0J8h1UUDd5w5UOOAfisK026yJZj3 | |
|
209 | YOR3i56XRzkn+EitUsN4uEvEeCpDCGlEOL67ldMikfk6HUg54Ef02pS9i6jEcLpcGUMLSW9iU43J | |
|
210 | 6EjH+VZ9NuLDmQqCIsdxR7e30rQWNPKaebmOTVrdXysq5C+OhFfcm129Y/7ptghJ3JKU8j6VLqtS | |
|
211 | rvmNFNx4mNXGMy6jEQqeUF5V8D2oS63JalpaQdrhxjdyQK2O6Ls8SOGm0hO7ohKeVH2FIl205Pdd | |
|
212 | cmMskrICkNg+pIz0IqrptWGGDwP3M3VhFye4w2hmVGYaUmUUsrwcpOSn5xTpcpUJu1vOmQpwObUK | |
|
213 | S6njfnjjtzWOu6iu3luRnIhQGTtJHBB/pRq1u3G5hhKFlIVneVdz9+lKXaRgdzkCdRxYMg9S9qB+ | |
|
214 | A/MS0tpYIVudaZTgOqwAPtUdjTkORXGmhHbKgltKVBJSMd+9Mtv/ABrcWRFLUdxATl0lGFlWOx7/ | |
|
215 | AAaEOJhuLZipYdksr6BokraVnnd7VhbOl7xBfWwctnj8T9m39strVFa9aMggZKlK+lLGpXLhc47d | |
|
216 | smsKjlSgpJWg5A65B7dfrWk2vTdus8p+clS1vYyEurB2H+pqs9erVc32zJIbeZXtS2oZO8fH+tap | |
|
217 | sVH3VrnHucXftIeZf/0zdZDYbKlPlpJWVnkZ7D704WLRhTbkOzg6XVpxsB2+Wfr3p0hzIylPPtth | |
|
218 | KEr2uFQxuI7ChV61IhaTGay24okBST0J6GutrLLPACMJY6DxMze/Ldtdzcik7gnlJ+DVJF2KTlVO | |
|
219 | 0O2M3WK8mQ0h5/HoIOFdepPalq5aTuapziQhptrPUkHA609VZW3i3cbHyRVfKU03RLishXIpfVqe | |
|
220 | Q2lyJC/dZWQpfzmqF5f/AGdcSw08hwJxnb3V7CqcNl5qWp6U2lKRnYnOefeqlOjQDcw4kX5D5g2Y | |
|
221 | Wn13GOKsQklxR8yU51UecUSt+5GX3vU8rue1CbeypxfnO/YUWB9jRGIHAiVNZc72lgLJVzzUrmg1 | |
|
222 | KFiOjjqIwUpPKSR96KWnUl1tLoXCmOt+4CuD9qFlOe9fm3nrT5wexPN5I6msWHxHjzili+Nhlw4A | |
|
223 | faGBn5HSmicCI6X2loeiufkeb5Sf6GvPqknrTJpPVs2wPbMh+EvhxhzlKh9KA1XtYZbM9xj1Laos | |
|
224 | /K1ICHv74/1qnbryuwBtCIYQgDatbayQv5wehpnu8NiXaBebK6X7csgOIPK4yj/Cr49jSbJXwQel | |
|
225 | BesWLseGrsNTbkjx/wBWQ4FvYfdntLW8NwZC8qT9RQ9Gq3bo8ERlBDajgrJ/KPekB1ltLqZCAlK0 | |
|
226 | HcCUgjP0NfIuy1Tg+yw2y4kEL8kYSv52nj9KSPxNQ/jyZRr+UYfyGJt+nm7Kje95pflEAFxR6H/C | |
|
227 | DQW+OSocpBjL/EFZOHmzyR7GkzSl9ZLr5uE2LFBOPLWlWSPccYFaxpS8WZlP4aEpDri8OKO4KBP+ | |
|
228 | lTL9NZQ/kMxg21agBi3MXo9ulOvB1uC8p0j1LV0PH86JQ7QpiSh94mO3tUFBSeMn2zTsJjKFrde8 | |
|
229 | g8DbsIJA78VzbuEd6MVLaSWFZSCUZI985pRnJjCviI2nbncJNzXDUhL7aSU5C8J2/OKcbTaodsU7 | |
|
230 | K8hLL6zuUndkA/GaU7tM/ZUlQjBlu3bdzbkdHKTnkE+59qU77q+4zISmGY8lbyVH96hKjlPHHFGG | |
|
231 | me0+HAM7bcmMxv1V/wCQkLFvcdxzktd6RbNDC71lDgbS2dy3F9sHmh8PVF5ZQtEdteFDar0eof0o | |
|
232 | 8q7abXHYNxdDEhgYUUnYpffkdxmqFelspGMZz+Io2qQ+51v9/wDw7KkwZflxlElIKgTnPJNcH7mz | |
|
233 | Asjbi1smU8QouE/PBH2pd1DreyOwnojMGPIK8+tLe3HGAfrSE9cVrjtJjFfozwv1bfpnj+VOaf40 | |
|
234 | so3DETv+RReF5m53LUNis0Bp9ExK3QkAoQ5nPfisq1druXd3CmMVtsDITlXOPn3pcMGS/HW84VKd | |
|
235 | zwF9SKFKCs7T27U/pvjqaju7Mm6jW2uMdCE4tsukyI5cmY77sdtYSt4DICuoBNMFoWiapJcVhY6o | |
|
236 | V7138N9XK0/JWw42l+BIT5cmMv8AK6jv9COxpi1XpBtE2LctJvfi7bOBdbAI8xrH5krHYj370zaf | |
|
237 | R4gqCQwxzOCMJGE9K6A4rm20ttnDysuJ4OBxmq0uWllv08rNIjyOBPRsCg5GJLnODDZQg+s/yqUs | |
|
238 | zJKlqUVHJNSmkqGOZOt1TBvGfZIxkVwWsg1KlaEmT8DhxX7u3dqlStTka/D3Ur2nrylKkfiIEr9z | |
|
239 | IjK/K4g9fvR/xBsyLDqF+IwsrjqSl5rd1CFjcAfkZqVKHYIZOonyclpZz0oeygoUpWetSpWVmz1O | |
|
240 | c6Ol9o9lDoaBIkPMOZS4obTg4URUqUzWAeDE7SVPEYrXrSZb30ORGwhwDG4rUr/M0SXri+SpYcYu | |
|
241 | EiMMcJbVx9alSgtpad27aMw6ai0pjdKFz1nqJuSn/wAtIJIznj+lfQu11VueVdJm9weohwjNSpWj | |
|
242 | UigYAmfsck8wPPlPKz5jzyz33LJoOt1SieSB7VKlGQQDk5n2w35qwCaYLbEQEBwgY7CpUrlphaAC | |
|
243 | 3MIkBKc0DuUUKC5CcJIPI96lSh18GH1AyINiI8x9CM4x3Fat4f6okWOY0qKkFv8AKpCgCFp75qVK | |
|
244 | xqfUY+MUENmMmv7bHbDV5tqPJjTFcsK6pVgE4+Kz68xy41vZUEKPvUqUovDyufKjmfrVmYbiHd6n | |
|
245 | cbis+/WpUqUcMZKdF44n/9k= | |
|
246 | ||
|
247 | ------=_NextPart_000_001F_01C8D3B6.F05C5270-- | |
|
248 |
@@ -16,25 +16,119 | |||
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class MailHandler < ActionMailer::Base |
|
19 | ||
|
20 | class UnauthorizedAction < StandardError; end | |
|
21 | class MissingInformation < StandardError; end | |
|
22 | ||
|
23 | attr_reader :email, :user | |
|
24 | ||
|
25 | def self.receive(email, options={}) | |
|
26 | @@handler_options = options | |
|
27 | super email | |
|
28 | end | |
|
19 | 29 | |
|
20 | 30 | # Processes incoming emails |
|
21 | # Currently, it only supports adding a note to an existing issue | |
|
22 | # by replying to the initial notification message | |
|
23 | 31 | def receive(email) |
|
24 | # find related issue by parsing the subject | |
|
25 | m = email.subject.match %r{\[.*#(\d+)\]} | |
|
26 |
|
|
|
27 | issue = Issue.find_by_id(m[1]) | |
|
32 | @email = email | |
|
33 | @user = User.find_active(:first, :conditions => {:mail => email.from.first}) | |
|
34 | unless @user | |
|
35 | # Unknown user => the email is ignored | |
|
36 | # TODO: ability to create the user's account | |
|
37 | logger.info "MailHandler: email submitted by unknown user [#{email.from.first}]" if logger && logger.info | |
|
38 | return false | |
|
39 | end | |
|
40 | User.current = @user | |
|
41 | dispatch | |
|
42 | end | |
|
43 | ||
|
44 | private | |
|
45 | ||
|
46 | ISSUE_REPLY_SUBJECT_RE = %r{\[[^\]]+#(\d+)\]} | |
|
47 | ||
|
48 | def dispatch | |
|
49 | if m = email.subject.match(ISSUE_REPLY_SUBJECT_RE) | |
|
50 | receive_issue_update(m[1].to_i) | |
|
51 | else | |
|
52 | receive_issue | |
|
53 | end | |
|
54 | rescue ActiveRecord::RecordInvalid => e | |
|
55 | # TODO: send a email to the user | |
|
56 | logger.error e.message if logger | |
|
57 | false | |
|
58 | rescue MissingInformation => e | |
|
59 | logger.error "MailHandler: missing information from #{user}: #{e.message}" if logger | |
|
60 | false | |
|
61 | rescue UnauthorizedAction => e | |
|
62 | logger.error "MailHandler: unauthorized attempt from #{user}" if logger | |
|
63 | false | |
|
64 | end | |
|
65 | ||
|
66 | # Creates a new issue | |
|
67 | def receive_issue | |
|
68 | project = target_project | |
|
69 | # TODO: make the tracker configurable | |
|
70 | tracker = project.trackers.find(:first) | |
|
71 | # check permission | |
|
72 | raise UnauthorizedAction unless user.allowed_to?(:add_issues, project) | |
|
73 | issue = Issue.new(:author => user, :project => project, :tracker => tracker) | |
|
74 | issue.subject = email.subject.chomp | |
|
75 | issue.description = email.plain_text_body.chomp | |
|
76 | issue.save! | |
|
77 | add_attachments(issue) | |
|
78 | logger.info "MailHandler: issue ##{issue.id} created by #{user}" if logger && logger.info | |
|
79 | Mailer.deliver_issue_add(issue) if Setting.notified_events.include?('issue_added') | |
|
80 | issue | |
|
81 | end | |
|
82 | ||
|
83 | def target_project | |
|
84 | # TODO: other ways to specify project: | |
|
85 | # * parse the email To field | |
|
86 | # * specific project (eg. Setting.mail_handler_target_project) | |
|
87 | identifier = if @@handler_options[:project] | |
|
88 | @@handler_options[:project] | |
|
89 | elsif email.plain_text_body =~ %r{^Project:[ \t]*(.+)$}i | |
|
90 | $1 | |
|
91 | end | |
|
92 | ||
|
93 | target = Project.find_by_identifier(identifier.to_s) | |
|
94 | raise MissingInformation.new('Unable to determine target project') if target.nil? | |
|
95 | target | |
|
96 | end | |
|
97 | ||
|
98 | # Adds a note to an existing issue | |
|
99 | def receive_issue_update(issue_id) | |
|
100 | issue = Issue.find_by_id(issue_id) | |
|
28 | 101 | return unless issue |
|
29 | ||
|
30 | # find user | |
|
31 | user = User.find_active(:first, :conditions => {:mail => email.from.first}) | |
|
32 | return unless user | |
|
33 | 102 | # check permission |
|
34 |
r |
|
|
35 | ||
|
103 | raise UnauthorizedAction unless user.allowed_to?(:add_issue_notes, issue.project) || user.allowed_to?(:edit_issues, issue.project) | |
|
36 | 104 | # add the note |
|
37 | issue.init_journal(user, email.body.chomp) | |
|
38 | issue.save | |
|
105 | journal = issue.init_journal(user, email.plain_text_body.chomp) | |
|
106 | add_attachments(journal) | |
|
107 | issue.save! | |
|
108 | logger.info "MailHandler: issue ##{issue.id} updated by #{user}" if logger && logger.info | |
|
109 | Mailer.deliver_issue_edit(journal) if Setting.notified_events.include?('issue_updated') | |
|
110 | journal | |
|
111 | end | |
|
112 | ||
|
113 | def add_attachments(obj) | |
|
114 | if email.has_attachments? | |
|
115 | email.attachments.each do |attachment| | |
|
116 | Attachment.create(:container => obj, | |
|
117 | :file => attachment, | |
|
118 | :author => user, | |
|
119 | :content_type => attachment.content_type) | |
|
120 | end | |
|
121 | end | |
|
39 | 122 | end |
|
40 | 123 | end |
|
124 | ||
|
125 | class TMail::Mail | |
|
126 | # Returns body of the first plain text part found if any | |
|
127 | def plain_text_body | |
|
128 | return @plain_text_body unless @plain_text_body.nil? | |
|
129 | p = self.parts.collect {|c| (c.respond_to?(:parts) && !c.parts.empty?) ? c.parts : c}.flatten | |
|
130 | plain = p.detect {|c| c.content_type == 'text/plain'} | |
|
131 | @plain_text_body = plain.nil? ? self.body : plain.body | |
|
132 | end | |
|
133 | end | |
|
134 |
@@ -39,4 +39,8 enabled_modules_010: | |||
|
39 | 39 | name: wiki |
|
40 | 40 | project_id: 3 |
|
41 | 41 | id: 10 |
|
42 | enabled_modules_011: | |
|
43 | name: issue_tracking | |
|
44 | project_id: 2 | |
|
45 | id: 11 | |
|
42 | 46 | No newline at end of file |
@@ -19,6 +19,7 enumerations_005: | |||
|
19 | 19 | name: Normal |
|
20 | 20 | id: 5 |
|
21 | 21 | opt: IPRI |
|
22 | is_default: true | |
|
22 | 23 | enumerations_006: |
|
23 | 24 | name: High |
|
24 | 25 | id: 6 |
@@ -20,38 +20,52 require File.dirname(__FILE__) + '/../test_helper' | |||
|
20 | 20 | class MailHandlerTest < Test::Unit::TestCase |
|
21 | 21 | fixtures :users, :projects, :enabled_modules, :roles, :members, :issues, :trackers, :enumerations |
|
22 | 22 | |
|
23 | FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures' | |
|
24 | CHARSET = "utf-8" | |
|
25 | ||
|
26 | include ActionMailer::Quoting | |
|
27 | ||
|
23 | FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures/mail_handler' | |
|
24 | ||
|
28 | 25 | def setup |
|
29 |
ActionMailer::Base.deliver |
|
|
30 | ActionMailer::Base.perform_deliveries = true | |
|
31 | ActionMailer::Base.deliveries = [] | |
|
32 | ||
|
33 | @expected = TMail::Mail.new | |
|
34 | @expected.set_content_type "text", "plain", { "charset" => CHARSET } | |
|
35 | @expected.mime_version = '1.0' | |
|
26 | ActionMailer::Base.deliveries.clear | |
|
36 | 27 | end |
|
37 | 28 | |
|
38 |
def test_add_ |
|
|
39 | raw = read_fixture("add_note_to_issue.txt").join | |
|
40 | MailHandler.receive(raw) | |
|
41 | ||
|
42 | issue = Issue.find(2) | |
|
43 | journal = issue.journals.find(:first, :order => "created_on DESC") | |
|
44 | assert journal | |
|
45 |
assert_equal User.find_by_ |
|
|
46 | assert_equal "Note added by mail", journal.notes | |
|
29 | def test_add_issue | |
|
30 | # This email contains: 'Project: onlinestore' | |
|
31 | issue = submit_email('ticket_on_given_project.eml') | |
|
32 | assert issue.is_a?(Issue) | |
|
33 | assert !issue.new_record? | |
|
34 | issue.reload | |
|
35 | assert_equal 'New ticket on a given project', issue.subject | |
|
36 | assert_equal User.find_by_login('jsmith'), issue.author | |
|
37 | assert_equal Project.find(2), issue.project | |
|
38 | assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.') | |
|
39 | end | |
|
40 | ||
|
41 | def test_add_issue_with_attachment_to_specific_project | |
|
42 | issue = submit_email('ticket_with_attachment.eml', :project => 'onlinestore') | |
|
43 | assert issue.is_a?(Issue) | |
|
44 | assert !issue.new_record? | |
|
45 | issue.reload | |
|
46 | assert_equal 'Ticket created by email with attachment', issue.subject | |
|
47 | assert_equal User.find_by_login('jsmith'), issue.author | |
|
48 | assert_equal Project.find(2), issue.project | |
|
49 | assert_equal 'This is a new ticket with attachments', issue.description | |
|
50 | # Attachment properties | |
|
51 | assert_equal 1, issue.attachments.size | |
|
52 | assert_equal 'Paella.jpg', issue.attachments.first.filename | |
|
53 | assert_equal 'image/jpeg', issue.attachments.first.content_type | |
|
54 | assert_equal 10790, issue.attachments.first.filesize | |
|
55 | end | |
|
56 | ||
|
57 | def test_add_issue_note | |
|
58 | journal = submit_email('ticket_reply.eml') | |
|
59 | assert journal.is_a?(Journal) | |
|
60 | assert_equal User.find_by_login('jsmith'), journal.user | |
|
61 | assert_equal Issue.find(2), journal.journalized | |
|
62 | assert_equal 'This is reply', journal.notes | |
|
47 | 63 | end |
|
48 | 64 | |
|
49 | 65 | private |
|
50 | def read_fixture(action) | |
|
51 | IO.readlines("#{FIXTURES_PATH}/mail_handler/#{action}") | |
|
52 | end | |
|
53 | ||
|
54 | def encode(subject) | |
|
55 | quoted_printable(subject, CHARSET) | |
|
56 | end | |
|
66 | ||
|
67 | def submit_email(filename, options={}) | |
|
68 | raw = IO.read(File.join(FIXTURES_PATH, filename)) | |
|
69 | MailHandler.receive(raw, options) | |
|
70 | end | |
|
57 | 71 | end |
|
1 | NO CONTENT: file was removed |
General Comments 0
You need to be logged in to leave comments.
Login now