@@ -25,9 +25,9 @@ use strict;
2525use warnings;
2626
2727use Mail::Mailer;
28+ use Mail::Address;
2829use MIME::Base64 qw( encode_base64) ;
2930use EnsEMBL::Web::Exceptions;
30- use Email::Address::XS qw( parse_email_addresses split_address) ;
3131use Encode ' decode' ;
3232use feature ' unicode_strings' ;
3333
@@ -162,7 +162,25 @@ sub send_plain {
162162 return 1;
163163}
164164
165+ sub _parse_email_addresses {
166+ my ($address_string , $type ) = @_ ;
165167
168+ my @addresses = Mail::Address-> parse($address_string );
169+ if (@addresses != 1) {
170+ warn " EnsEMBL/Web/Mailer: Illegal $type : addr: '$address_string '" ;
171+ return 0;
172+ }
173+
174+ if ($type eq ' To' ) {
175+ my $host = $addresses [0]-> host;
176+ if ($host !~ / (ebi\. ac\. uk|ensembl\. org)$ / ) {
177+ warn " EnsEMBL/Web/Mailer: Rcpt addr not within EBI: '$address_string '" ;
178+ return 0;
179+ }
180+ }
181+
182+ return $addresses [0]-> address;
183+ }
166184
167185sub send {
168186 my $self = shift ;
@@ -171,35 +189,15 @@ sub send {
171189
172190 # First validate user-supplied data
173191
174- my @addresses = parse_email_addresses($self -> {' to' });
175- if (@addresses != 1) {
176- warn " EnsEMBL/Web/Mailer: Illegal To: addr: '$self ->{'to'}'" ;
177- return 0;
178- }
179- my $helpdesk_mail = $addresses [0]-> address();
180- my ($user , $host ) = split_address($helpdesk_mail );
181- if ($host !~ / (ebi\. ac\. uk|ensembl\. org)$ / ) {
182- warn " EnsEMBL/Web/Mailer: Rcpt addr not within EBI: '$self ->{'to'}'" ;
183- return 0;
184- }
192+ my $helpdesk_mail = _parse_email_addresses($self -> {' to' }, ' To' );
185193 $valid_params {' To' } = $helpdesk_mail ;
186194
187- @addresses = parse_email_addresses($self -> {' from' });
188- if (@addresses != 1) {
189- warn " EnsEMBL/Web/Mailer: Illegal From: addr: '$self ->{'from'}'" ;
190- return 0;
191- }
192- my $from_mail = $addresses [0]-> address();
195+ my $from_mail = _parse_email_addresses($self -> {' from' }, ' From' );
193196 $valid_params {' From' } = $from_mail ;
194197
195198 $valid_params {' Reply-To' } = undef ;
196199 if ($self -> {' reply' }) {
197- @addresses = parse_email_addresses($self -> {' reply' });
198- if (@addresses != 1) {
199- warn " EnsEMBL/Web/Mailer: Illegal Reply-To: addr: '$self ->{'reply'}'" ;
200- return 0;
201- }
202- $valid_params {' Reply-To' } = $addresses [0]-> address();
200+ $valid_params {' Reply-To' } = _parse_email_addresses($self -> {' reply' }, ' Reply-To' );
203201 }
204202
205203
@@ -213,7 +211,7 @@ sub send {
213211 }
214212
215213 if ($self -> {' base_url' }) {
216- if ($self -> {' base_url' } !~ m { ^http(s)?://[A-Za-z0-9.-/]+$} ){
214+ if ($self -> {' base_url' } !~ m { ^http(s)?://[A-Za-z0-9.\ - /]+$} ){
217215 warn " EnsEMBL/Web/Mailer: Unexpected URL: '$self ->{'base_url'}'" ;
218216 return 0;
219217 }
0 commit comments