Hari ini, seorang rekan mengalami masalah saat menggunakan JAVA MAIL untuk menerima email, jika penerima adalah sebuah daftar dan daftar penerima dipisahkan dengan titik koma, pengecualian akan terjadi di JAVA MAIL dan tidak dapat diurai secara normal lihat., saya menulis demo sederhana, sangat sederhana, misalnya:
Copy kode kodenya sebagai berikut:
@Tes
kekosongan publik testReceiveMail() {
mencoba {
String host = "pop3.163.com";
Properti muncul = Properti baru();
pops.put("mail.pop3.host", tuan rumah);
pops.put("mail.pop.auth", "benar");
Sesi sesi = Session.getDefaultInstance(pops, null);
Toko toko = session.getStore("pop3");
//Hubungkan ke server email
toko.connect(host, "chb_go", "3870359346");
//Terima kotak masuk
Kotak masuk folder = store.getDefaultFolder().getFolder("INBOX");
//Baca saja sudah cukup
kotak masuk.terbuka(Folder.READ_ONLY);
//Dapatkan semua milis
Pesan[] pesan = kotak masuk.getMessages();
Profil FetchProfile = FetchProfile baru();
profile.add(FetchProfile.Item.ENVELOPE);
inbox.fetch(pesan, profil);
for (int i = 0; i < pesan.panjang; i++) {
System.out.println("============= = ====");
System.out.println("Subjek: "+pesan[i].getSubject());
InternetAddress[] toAddress = (InternetAddress[]) pesan[i].getRecipients(Message.RecipientType.TO);
for(AlamatInternetalamat:keAlamat){
System.out.println(alamat.getAddress());
}
}
//Tutup sumber daya yang terbuka
jika (kotak masuk!= null)
kotak masuk.close(true);
jika (simpan!= null)
toko.tutup();
} tangkapan (NoSuchProviderException e) {
e.printStackTrace();
} tangkapan (MessagingException e) {
e.printStackTrace();
} tangkapan (Pengecualian e) {
e.printStackTrace();
}
}
Ini sangat sederhana. Anda dapat menerima email secara normal dan menampilkan daftar penerima secara normal; tetapi saat menyambung ke server email internal dan penerimanya adalah email dengan titik koma sebagai pembatas, penerima tidak dapat ditampilkan secara normal.
Setelah menelusuri spesifikasinya, saya menemukan bahwa FRC 822 mengatur bahwa penerima harus dipisahkan dengan koma. Tampaknya pemisahan titik koma bukanlah pembatas standar, sebagai berikut:
Copy kode kodenya sebagai berikut:
tujuan = "Ke" ":" 1#alamat ;
/ "Dikirim Ulang Ke" ":" 1#alamat
/ "cc" ":" 1#alamat ;
/ "Dikirim ulang-cc" ":" 1#alamat
/ "bcc" ":" #address ;
/ "Dikirim ulang-bcc" ":" #address
Sintaks # mewakili sebuah daftar, dan isi antar daftar dipisahkan dengan koma, misalnya:
Copy kode kodenya sebagai berikut:
2.7.#ATURAN: DAFTAR
Konstruk "#" didefinisikan, mirip dengan "*", sebagai berikut:
<l>#<m>elemen
menunjukkan setidaknya elemen <l> dan paling banyak <m>, masing-masing dipisahkan dengan satu atau lebih koma (","). Hal ini membuat bentuk daftar yang biasa menjadi sangat mudah; ))' dapat ditampilkan sebagai "1#elemen". Di mana pun konstruksi ini digunakan, elemen nol diperbolehkan, namun tidak berkontribusi pada jumlah elemen yang ada. Artinya, "(elemen),,(elemen)" diperbolehkan , tetapi hanya dihitung sebagai dua elemen setidaknya satu elemen diperlukan, setidaknya satu elemen bukan nol harus ada. Nilai defaultnya adalah 0 dan tak terhingga sehingga "#(elemen)" mengizinkan angka apa pun, termasuk nol; ; dan "1#2element" mengizinkan satu atau dua.
JAVA MAIL beroperasi secara ketat sesuai dengan spesifikasi RFC 822 dan tidak berurusan dengan titik koma. Sebagian besar server email secara ketat mengikuti spesifikasi RFC 822, seperti Lotus Notes dan gmail (penerima gmail tidak dapat memasukkan titik koma, dan bahkan akan secara otomatis diganti dengan koma, namun Anda juga akan menemukannya saat mengirim); Email sering kali dipisahkan dengan titik koma. Hal ini karena beberapa alat email Microsoft, seperti Outlook, Outlook Express atau MAPI-nya menggunakan titik koma sebagai pemisah, dan karena Outlook banyak digunakan oleh pengguna, banyak orang bahkan berpikir bahwa pemisahan titik koma adalah hal yang biasa, dan mereka sangat membenci Microsoft! Terlalu banyak kejanggalan! !
Jika Anda kurang beruntung dan menemui pengguna yang terbiasa menggunakan titik koma sebagai pembatas, dan server email mereka tidak secara otomatis mengganti titik koma dengan koma, maka kami hanya dapat membuat kompatibilitas melalui program. Anda dapat mempertimbangkan untuk merevisi kode sumber JAVA MAIL
Kode sumber metode parse kelas InternetAddress tidak akan ditampilkan di sini. Anda hanya perlu mengubah pemrosesan titik koma menjadi sama dengan koma (tetapi titik koma juga ditentukan di FRC 822. Modifikasi tersebut dapat menyebabkan bahaya tersembunyi, jadi harap berhati-hati).