2012-06-25 20 views
6

Khi gửi một thông điệp mà tôi có thể có một cái gì đó như thế này để thiết lập các trường Đến: (trong Perl)Làm cách nào để xác thực (hoặc thoát) trường tên của người dùng để nó không làm hỏng phần mềm gửi email của tôi?

To: "$name" <$email> 

Trong Perl tôi có thể xác nhận các phần $ email với Email :: trị nhưng làm thế nào để đảm bảo $ name part chấp nhận các ký tự Unicode nhưng không thể bị lừa vào việc gửi tới nhiều địa chỉ hoặc làm một số điều khó chịu khác? ví dụ. Đây

$email = '[email protected]'; 
$name = 'Foo" <[email protected]>, "Bar'; 

dường như để tạo ra một trường Đến như thế này:

To: "Foo" <[email protected]>, "Bar" <[email protected]> 

gửi e-mail đến hai địa chỉ.

+0

Đây là lý do tại sao tôi không quan tâm nhiều đến giao diện gửi email phân tích tiêu đề để xác định danh sách người nhận; lập trình viên nên luôn luôn cần cung cấp một danh sách người nhận ngoài tiêu đề thư và nội dung, vì nó gọn gàng loại bỏ các vấn đề như thế này, cũng như giảm sự phức tạp của các thư viện đó. (Xem xét trường hợp Bcc, nơi thư viện phải phân tích cú pháp và sau đó loại bỏ tiêu đề đó.) – cdhowie

Trả lời

8
use Email::Address qw(); 
use Encode qw(encode); 

s{\R}{}g for $email, $name; # newlines be-gone 
my $to = Email::Address->new($name => $email)->format; 
print encode 'MIME-Header', $to; 
+1

Đảm bảo rằng không có ký tự nào có thể được chuyển bởi máy chủ SMTP dưới dạng trả về/dòng mới, nếu không người dùng độc hại có thể gửi tin nhắn tùy ý. – Cheekysoft

2

Có thể không có giải pháp đơn giản cho điều này. Tôi muốn giới thiệu một giải pháp bảo thủ bằng tay.

/\p{L}/ 

khớp với bất kỳ chữ cái unicode nào bằng bất kỳ ngôn ngữ nào. Vui lòng thêm dấu chấm hoặc dấu gạch ngang, tùy thuộc vào nền tảng văn hóa của phần mềm của bạn.

Các vấn đề liên quan