2012-04-01 15 views
8

Tôi đã có một kịch bản mà sẽ gửi e-mail tựa hồ như thế này:Tôi nên sử dụng Mã hóa-Chuyển-Mã hóa nào khi gửi một thư PHP() chứa một liên kết http dài?

$headers = "From: [email protected]\r\n"; 
$headers .= "Reply-To: [email protected]\r\n"; 
$headers .= "MIME-Version: 1.0\r\n"; 
$headers .= "Content-type: text/plain; charset=utf-8\r\n"; 
$headers .= "Content-Transfer-Encoding: 8bit"; 
$orgsubject = "A subject with some swedish characters like å, ä and ö"; 
$newsubject='=?UTF-8?B?'.base64_encode($orgsubject).'?='; 
$body = 'A lot of text. 

Some more text. 

A long URL: 
http://example.com/subpage/?id=1234&hash=23jh4lk2j3h4lkjh674598xzxlk2j34h&anotherhash=h2k3j4h23kh42kj34h2lk3'; 

Nó kiểm tra kỹ lưỡng nhưng một số người dùng, tôi nghĩ rằng người dùng Outlook, có được một URL tìm kiếm như thế này: http://example.com/subpage/?id=3D1234&hash=3D3D23jh4lk2j3h4lkjh674598xzxlk2j34h&anotherhash=3Dh2k3j4h23kh42kj34h2lk3 Các bình đẳng dấu hiệu bây giờ được theo sau bởi '3D' làm cho URL vô dụng trong trường hợp của tôi. Tôi đoán điều này có liên quan đến Content-Transfer-Encoding hoặc có thể là Content-type, tôi có cần mã hóa thông điệp cơ thể thành base64 hay gì đó không?

Cập nhật

Chỉ cần tìm thấy diễn đàn bài này: https://stackoverflow.com/a/7289434/513321 Vì vậy, tôi loại bỏ các Content-Transfer-Encoding và có vẻ như để làm việc tốt nhưng mặt khác tôi không bao giờ có thể sao chép các lỗi nơi URL chứa '3D 'văn bản, vì vậy tôi không thể chắc chắn rằng điều này sẽ làm việc. Có ai biết nếu loại bỏ các Content-Transfer-Encoding sẽ giải quyết vấn đề của tôi?

Trả lời

3

Không có đề cập đến điều này trong câu hỏi của bạn, nhưng =3D là chuỗi thoát của mã hóa chuyển quoted printable; nó được sử dụng để chuyển dữ liệu 8 bit một cách an toàn bằng cách sử dụng mã hóa 7 bit.

Hiện tại vẫn còn các máy chủ thư không giống như dòng dài hơn 76 cột và máy chủ trung gian CÓ thể làm xáo trộn thư của bạn mà không cập nhật tiêu đề thư, dẫn đến hành vi được quan sát.

Kể từ 5.3.0, bạn có thể sử dụng quoted_printable_encode() để mã hóa thông điệp của bạn và đặt tiêu đề Content-Transfer-Encoding cho phù hợp:

Content-Transfer-Encoding: quoted-printable 

Thiết lập một bảng mã truyền rõ ràng là một thực hành tốt, bạn nên áp dụng chứ không phải là một cách tiếp cận ngây thơ “bằng cách nào đó nó hoạt động” :)

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