Haruskah ditambah dikodekan dalam mailto: hyperlink?


39

Saat menempatkan alamat email dengan tag alamat (alias sub-pengalamatan) dalam hyperlink mailto ...

<a href="mailto:username+foo@example.com">mail us now!</a>

... haruskah nilai tambah dalam email dikodekan URL?

<a href="mailto:username%2Bfoo@example.com">mail us now!</a>

Saya tidak bisa mengetahuinya, dan dokumentasinya saling bertentangan. Tes dunia nyata kami telah menghasilkan hasil yang beragam juga, membuatnya lebih membingungkan.


Bisakah Anda lebih spesifik tentang metode dan hasil tes dunia nyata Anda? Apakah beberapa klien / layanan email memperlakukannya dengan benar dan yang lain tersedak? Bisakah Anda lebih spesifik?
Bryson

1
@ Bryson Saya tahu ekstensi krom "send using gmail" telah mengalami masalah dengan unencoded plus di mailto: misalnya, tapi mungkin itu bug.
Jeff Atwood

2
Cukup gunakan mana saja yang berfungsi dengan chrome.
Hardwareguy

Jawaban:


22

Nilai tambah digunakan untuk menyandikan spasi dalam URL, bukan dalam HTML dan bukan pada SMTP (RFC2821). Namun, karena mailto:address@server.comURI (memiliki protokol, pemisah protokol, dan alamat protokol) maka harus diperlakukan sebagai URI dan harus persen dikodekan .

Oleh karena itu, tergantung pada klien untuk menyelesaikan secara akurat representasi yang disandikan dan mendekodekannya sejauh yang diperlukan. Ini adalah keputusan resmi Microsoft untuk masalah ini .

Anda harus menerapkan penyandian URL pada mailto: URL yang disematkan dalam HTML jika karakter dalam alamat email dilindungi undang-undang. Ini memastikan bahwa Anda melakukan hal yang benar. Terserah klien untuk memecahkan kode URI dari mana ia diterima. Ya, this+address@gmail.comemail yang sangat valid; ya this%2Baddress@gmail.comjuga valid. Ya keduanya berbeda, tetapi apakah mereka akan diperlakukan berbeda terserah klien ...

Seperti yang Anda catat sebelumnya, tidak semua klien memberikan ini dengan benar. Saya sarankan mencari klien yang paling mungkin (gmail? Klien berbasis browser? Outlook?) Yang akan digunakan pengguna Anda dan melakukan apa yang klien lakukan. Anda bilang Anda diuji di GMail? Bagaimana Anda mengujinya? Dengan "mailto: client berbasis browser (seperti add-on untuk firefox dan penawaran gmail), URI kemungkinan besar tidak sedang diterjemahkan (sebagaimana seharusnya).


Apakah ada yang punya data aktual tentang apa yang berfungsi di mana?
Wez Furlong

baik saya memang membuat catatan spesifik tentang apa yang Microsoft tegaskan bekerja ...
jcolebrand

Ini tepat. Gmail tidak menanganinya dengan benar, tetapi karena Google mengabaikan laporan bug pengguna, tidak banyak yang dapat Anda lakukan tentang hal itu.
Matius Baca

5
Jika Anda memiliki encode +di URI, @juga perlu dikodekan karena itu juga karakter yang dilindungi undang-undang. Jika Anda membaca RFC dengan cermat, Anda akan mengetahui bahwa di bagian yang buram, +itu legal.
Eugene Yokota

Saya mungkin salah tetapi bukankah itu disediakan untuk memisahkan nama pengguna dari host (seperti pada example@example.com/path )? Maka itu akan membuat tempatnya di alamat karena memisahkan nama pengguna dari host.
Maciej Piechotka

8

Anda MUNGKIN mengkodekan +, tetapi Anda tidak harus melakukannya.

Pertama, kita perlu setuju bahwa mailtoini adalah contoh dari URI generik, yang ditentukan oleh RFC 2396 . (Inilah yang digunakan XHTML dan HTML 4).

Sekarang mari kita cari tahu daftar karakter yang dipesan di RFC 2396.

reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
              "$" | ","

URI terbagi menjadi absolut dan relatif:

URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]

Dan karena skema mailto:ditentukan ini adalah URI absolut:

absoluteURI   = scheme ":" ( hier_part | opaque_part )

Dan karena kedua pola untuk hier_partmemulai /, mailtoadalah bagian buram.

opaque_part   = uric_no_slash *uric

uric_no_slash = unreserved | escaped | ";" | "?" | ":" | "@" |
                "&" | "=" | "+" | "$" | ","

uric          = reserved | unreserved | escaped

Jadi batasannya adalah bahwa Anda harus melarikan diri /jika menyangkut karakter pertama, tetapi setelah itu Anda dapat memasukkan karakter yang termasuk termasuk +dan @.

Inilah RFC lain untuk mendukung ini. Dalam skema RFC terbaru dari mailto yang diterbitkan pada 2010 yang disebut RFC 6068 , disebutkan:

Perangkat lunak yang membuat 'mailto'URI juga harus berhati-hati untuk menyandikan karakter apa saja yang digunakan. Bentuk HTML adalah salah satu jenis perangkat lunak yang menciptakan 'mailto'URI. Implementasi saat ini menyandikan ruang sebagai '+', tetapi ini menciptakan masalah karena '+'berdiri untuk ruang seperti itu tidak dapat dibedakan dari nyata '+'dalam 'mailto' URI. Saat memproduksi 'mailto'URI, semua ruang HARUS dikodekan sebagai %20, dan '+'karakter DAPAT dikodekan sebagai %2B. Harap perhatikan bahwa '+' karakter sering digunakan sebagai bagian dari alamat email untuk menunjukkan subaddress, seperti misalnya dalam <bill+ietf@example.org>.


Saya tidak sepenuhnya akrab dengan tata bahasa itu, namun, daftar karakter sebagai terpisah dari kumpulan tanpa syarat, yang menunjukkan bahwa + adalah karakter yang dipesan. Itu tidak menunjukkan bahwa itu harus dikodekan. Microsoft mengatakan untuk menyandikannya. C'est la vie, saya menunggu untuk melihat.
jcolebrand

1
Ketika suatu bagian tidak dimulai dengan /, +tidak lagi menjadi karakter pendiam.
Eugene Yokota

Saya tidak setuju. "alamat email" didefinisikan dengan sangat khusus, dan harus diperlakukan dengan hati-hati. Standar itu sangat membingungkan. Untungnya, kita tidak setuju di sini.
jcolebrand

8

Pembacaan ketat RFC yang relevan mengatakan bahwa "+" harus dikodekan.

Bagian 2, bagian atas halaman 2 di http://tools.ietf.org/html/rfc2368 mengatakan:

"Perhatikan bahwa semua karakter yang dilindungi URL di" ke "harus dikodekan: khususnya, tanda kurung, koma, dan tanda persen ("% "), yang biasanya terjadi dalam sintaks" kotak surat "."

RFC untuk URI (http://tools.ietf.org/html/rfc3986#section-2.2) mencantumkan "+" sebagai karakter yang dipesan.

Yang mengatakan, apa yang "benar" belum tentu apa yang akan berfungsi di semua browser. Beberapa browser jelas akan selalu menangani hal-hal yang benar seolah-olah mereka salah dan salah seolah-olah mereka benar.

Sunting: Mengenai RFC6068 dan "MEI", saya akan membacanya sebagai tergantung konteks. Jika Anda menulis URL untuk membaca teks maka "+" akan lebih masuk akal, namun jika Anda menulisnya dalam HTML maka interpretasi yang lebih ketat dari RFC3986 akan lebih sejalan dengan ide "HTML yang valid" dan segala hal yang menggunakan nilai harus berharap itu akan dikodekan.


2
Dalam RFC 3986, mailtoakan diperlakukan sebagai path-rootless, yang memungkinkan urutan pcharditentukan oleh (unreserved / pct-encoded / sub-delims / ":" / "@"). +adalah bagian dari sub-delims. Jadi pembacaan yang ketat mengatakan +tidak memerlukan persen pengkodean.
Eugene Yokota


3

Saya pikir penyandian itu atau tidak, tidak akan membuat perbedaan nyata. Masalahnya adalah klien email. Sebagai contoh, Yahoo Mail hanya menggunakan tanda hubung untuk sub alamat sedangkan gMail menggunakan plus.

Itu 2 sen saya ...

EDIT: Respons di bawah ini memiliki poin yang kuat.


benar, poin bagus bahwa ada beberapa perbedaan pada sub-pengalamatan email - tetapi email dalam hal ini adalah host gmail jadi saya tahu nilai plusnya benar dan akan berfungsi ketika diterima oleh server, dengan asumsi email diterima melalui klien.
Jeff Atwood

Masalahnya adalah aplikasi mem-parsing permintaan URI. Jika mengharapkan menerima data yang di-URLEkodekan maka data akan di-decode, tetapi itu tidak adil bagi Anda (untuk menyandikan secara salah) maupun kepada klien (untuk membuat asumsi). Protokol tidak menentukan pengkodean yang diharapkan, klien melakukannya. Lihat suntingan lebih lanjut yang saya buat ke A oleh @Wez
jcolebrand

3

The RFC1738

3.5. MAILTO

Skema URL mailto digunakan untuk menunjuk alamat surat menyurat Internet dari seseorang atau layanan. Tidak ada informasi tambahan selain alamat surat menyurat yang ada atau tersirat.

URL mailto mengambil bentuk:

    mailto:<rfc822-addr-spec>

di mana (encoding dari) addr-spec, seperti yang ditentukan dalam RFC 822 . Dalam URL mailto, tidak ada karakter yang dipesan.

Perhatikan bahwa tanda persen ("%") biasanya digunakan dalam alamat RFC 822 dan harus dikodekan.

Tidak seperti banyak URL, skema mailto tidak mewakili objek data untuk diakses secara langsung; tidak ada gunanya menunjuk objek. Ini memiliki penggunaan yang berbeda dari jenis pesan / eksternal-tubuh di MIME.

Karena tidak ada karakter yang dipesan, itu harus dikodekan.


namun per tools.ietf.org/html/rfc6068 "Saat memproduksi URI 'mailto', semua spasi HARUS dikodekan sebagai% 20, dan karakter '+' DAPAT dikodekan sebagai% 2B"
Jeff Atwood

1
Since there are no reserved characters it should be encoded.ummmm itu tidak masuk akal.
jcolebrand

@jcolebrand '+' adalah karakter khusus dalam skema URL dan karenanya harus disandikan ketika tidak memiliki peran khusus - yaitu. ketika tidak dicadangkan.
S.Skov

@ Jeff Memang - buruk saya untuk hidup di dunia RFC yang lebih tua. Maka tools.ietf.org/html/rfc2119 pada dasarnya memberitahu Anda untuk melakukan apa yang Anda rasa paling cocok untuk Anda.
S.Skov

itu nampaknya .... mundur dalam semangat dengan cara saya membaca instruksi pada awalnya.
jcolebrand

3

Per RFC 6068 sebagaimana disebutkan dalam jawaban, Anda DAPAT menyandikan tanda tambah sebagai%2B .

Alasan ada kebingungan adalah bahwa mengubah spasi menjadi plus sebenarnya bukan bagian dari pengkodean URL standar, itu bagian dari pengkodean parameter bentuk (yaituapplication/x-www-form-urlencoded )

Ini seperti perbedaan antara PHP rawurlencode()danurlencode() .

Jadi yang dikatakan RFC 6068 adalah bahwa mailto:URL harus menggunakan pengkodean URL standar "mentah" (per RFC 3986 ), dan tanda plus yang muncul di URL harus selalu diperlakukan sebagai tanda plus literal, dan bukan sebagai ruang yang memiliki formulir telah dikodekan.

Jika klien lokal mengubah nilai tambah menjadi spasi, itu rusak.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.