اليوم، واجه أحد الزملاء مشكلة. عند استخدام JAVA MAIL لتلقي رسائل البريد الإلكتروني، إذا كان المستلم عبارة عن قائمة وكانت قائمة المستلمين مفصولة بفواصل منقوطة، فسيحدث استثناء في JAVA MAIL ولا يمكن تحليله بشكل طبيعي نظرة، كتبت عرضًا توضيحيًا بسيطًا، بسيطًا جدًا، على سبيل المثال:
انسخ رمز الكود كما يلي:
@امتحان
اختبار الفراغ العام () {
يحاول {
مضيف السلسلة = "pop3.163.com"؛
خصائص الملوثات العضوية الثابتة = خصائص جديدة ()؛
pops.put("mail.pop3.host"، host);
pops.put("mail.pop.auth", "true");
جلسة الجلسة = Session.getDefaultInstance(pops, null);
متجر المتجر = session.getStore("pop3");
// اتصل بخادم البريد
store.connect(host, "chb_go", "3870359346");
// تلقي البريد الوارد
المجلد الوارد = store.getDefaultFolder().getFolder("INBOX");
// القراءة فقط تكفي
inbox.open(Folder.READ_ONLY);
// احصل على كافة القوائم البريدية
الرسالة[] msg = inbox.getMessages();
ملف تعريف FetchProfile = new FetchProfile();
Profile.add(FetchProfile.Item.ENVELOPE);
inbox.fetch(msg, Profile);
لـ (int i = 0; i < msg.length; i++) {
System.out.println(" ============================ = ====");
System.out.println("الموضوع: "+msg[i].getSubject());
InternetAddress[] toAddress = (InternetAddress[]) msg[i].getRecipients(Message.RecipientType.TO);
ل(عنوان InternetAddress:toAddress){
System.out.println(adress.getAddress());
}
}
// أغلق المورد المفتوح
إذا (البريد الوارد! = فارغ)
inbox.إغلاق(صحيح);
إذا (مخزن! = فارغ)
store. Close();
} التقاط (NoSuchProviderException e) {
printStackTrace();
} قبض على (MessagingException ه) {
printStackTrace();
} قبض (الاستثناء ه) {
printStackTrace();
}
}
الأمر بسيط للغاية. يمكنك تلقي رسائل البريد الإلكتروني بشكل طبيعي وعرض قائمة المستلمين بشكل طبيعي؛ ولكن عند الاتصال بخادم بريد داخلي ويكون المستلمون عبارة عن رسائل بريد إلكتروني تحتوي على فواصل منقوطة كمحددات، لا يمكن عرض المستلمين بشكل طبيعي.
بعد البحث في المواصفات، وجدت أن FRC 822 ينص على ضرورة الفصل بين المستلمين بفواصل، ويبدو أن الفصل بين الفاصلة المنقوطة ليس محددًا قياسيًا، كما يلي:
انسخ رمز الكود كما يلي:
الوجهة = "إلى" ": 1#address ;
/ "المراسل إلى" ": "1#address
/ "cc" ": "1#address ;
/ "Resent-cc" ": "1#address
/ "مخفية" ": #address ;
/ "Resent-bcc" ": #address
يمثل بناء الجملة # قائمة، ويتم فصل المحتويات بين القوائم بفواصل، على سبيل المثال:
انسخ رمز الكود كما يلي:
2.7.# القاعدة: القوائم
يتم تعريف البناء "#"، على غرار "*"، على النحو التالي:
<l>#<m>العنصر
الإشارة إلى عناصر <l> على الأقل و<m> على الأكثر، مفصولة بفاصلة واحدة أو أكثر ("، وهذا يجعل الشكل المعتاد للقوائم سهلًا للغاية؛" ))' يمكن عرضه كـ "1#element". أينما يتم استخدام هذه البنية، يُسمح بالعناصر الفارغة، ولكنها لا تساهم في عدد العناصر الموجودة. وهذا يعني أن "(element)،،(element)" مسموح به ، ولكن يعتبر عنصرين فقط مطلوب عنصر واحد على الأقل، ويجب أن يكون هناك عنصر واحد غير فارغ على الأقل. القيم الافتراضية هي 0 واللانهاية بحيث يسمح "#(element)" بأي رقم، بما في ذلك "1#element" يتطلب واحدًا على الأقل و"1#2element" يسمح بواحد أو اثنين.
يعمل JAVA MAIL بشكل صارم وفقًا لمواصفات RFC 822 ولا يتعامل مع الفواصل المنقوطة. تتبع معظم خوادم البريد مواصفات RFC 822 بدقة، مثل Lotus Notes وgmail (لا يمكن لمستلم Gmail إدخال فاصلة منقوطة، وسيتم استبدالها تلقائيًا بفاصلة، مثلها)، ومع ذلك، ستجد ذلك أيضًا عند الإرسال غالبًا ما يتم فصل رسائل البريد الإلكتروني بفواصل منقوطة، وذلك لأن بعض أدوات البريد الإلكتروني من Microsoft، مثل Outlook وOutlook يستخدم Express أو MAPI الخاص به الفواصل المنقوطة كفواصل، ولأن Outlook يستخدم على نطاق واسع من قبل المستخدمين، يعتقد الكثير من الناس أن الفصل بين الفاصلة المنقوطة هو القاعدة، وهم يحتقرون Microsoft بشدة! هناك الكثير من المخالفات! !
إذا لم تكن محظوظًا بما فيه الكفاية وواجهت مستخدمين اعتادوا على استخدام الفواصل المنقوطة كمحددات، ولا تقوم خوادم البريد الخاصة بهم باستبدال الفواصل المنقوطة بفواصل تلقائيًا، فلا يمكننا تحقيق التوافق إلا من خلال البرامج. يمكنك مراجعة كود مصدر JAVA MAIL
لن يتم عرض الكود المصدري لطريقة التحليل لفئة InternetAddress هنا، ما عليك سوى تعديل معالجة الفواصل المنقوطة لتكون مماثلة للفواصل (ولكن تم تعريف الفواصل المنقوطة أيضًا في FRC 822. قد تسبب مثل هذه التعديلات مخاطر مخفية، لذا يرجى توخي الحذر).