وصف المشهد:
عند حفظ تكوين صندوق البريد، يكتشف النظام تلقائيًا ما إذا كانت معلمات تكوين صندوق البريد صحيحة، وقد وجد أنه عند اكتشاف SMTP، يقوم النظام بالإبلاغ عن الاستثناء التالي:
انسخ رمز الكود كما يلي:
javax.mail.MessagingException: 501 يتطلب الأمر "HELO" وسيطة
في com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1363)
في com.sun.mail.smtp.SMTPTransport.helo(SMTPTransport.java:838)
في com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:375)
على javax.mail.Service.connect(Service.java:275)
ومع ذلك، عندما قمت بالتغيير إلى خادم Windows، وجدت أنه لا توجد مشكلة من هذا القبيل، ولا يمكن إعادة إنتاجها إلا على خادم Linux.
خطوات استكشاف الأخطاء وإصلاحها
1. ابحث عن خادم Linux بنفس نظام التشغيل، وتحقق من تكوين البريد الإلكتروني، وموافق، وقم بإزالة المشكلات المتعلقة بخصوصية نظام التشغيل Linux.
2. استخدم telnet مباشرة على خادم Linux للاتصال بمنفذ SMTP لخادم البريد المقابل. حسنًا، قم باستكشاف أخطاء شبكة الخادم وإصلاحها.
3. ابحث عن شرح تعليمات HELO
انسخ رمز الكود كما يلي:
مرحبا
- بدء محادثة مع خادم البريد، عند استخدام هذا الأمر، يمكنك تحديد اسم المجال الخاص بك حتى يعرف خادم البريد من أنت، على سبيل المثال، HELO mailhost2.
لقد وجد أن أمر HELO يجب أن يتبعه اسم المضيف للبادئ لإخبار خادم SMTP بمكان مصدر الرسالة.
بالنظر إلى رسالة الاستثناء "يتطلب الأمر 501 "HELO" وسيطة"، فمن الواضح أن البرنامج لم يمرر اسم مجال المضيف المصدر أثناء التفاعل مع خادم SMTP.
4. عرض كود مصدر بريد جافا
ابحث عن تعليمات HELO كما يلي:
انسخ رمز الكود كما يلي:
/**
* قم بإصدار الأمر <code>HELO</code>.
*
* @param المجال
* مجالنا
*
* @ منذ JavaMail 1.4.1
*/
helo باطلة محمية (مجال السلسلة) تطرح MessagingException {
إذا (المجال! = فارغ)
IssueCommand("HELO" + domain, 250);
آخر
IssueCommand("HELO", 250);
}
ابحث عن مكان استدعاء الأسلوب helo وانظر كيف يتم تمرير المجال
انسخ رمز الكود كما يلي:
إذا (استخدمEhlo)
تنجح = ehlo(getLocalHost());
إذا (! تنجح)
helo(getLocalHost());
بطبيعة الحال، ابحث عن طريقة getLocalHost()، والتي تم تعريفها على النحو التالي:
انسخ رمز الكود كما يلي:
/**
* احصل على اسم المضيف المحلي لاستخدامه في أوامر EHLO وHELO.
* الخاصية mail.smtp.localhost تتجاوز mail.smtp.localaddress، والتي
* يتجاوز ما سيخبرنا به InetAddress.
*/
سلسلة متزامنة عامة getLocalHost() {
يحاول {
// احصل على اسم المضيف الخاص بنا وقم بتخزينه مؤقتًا لاستخدامه في المستقبل
إذا (localHostName == null || localHostName. length() <= 0)
localHostName = session.getProperty("mail." + name + ".localhost");
إذا (localHostName == null || localHostName. length() <= 0)
localHostName = session.getProperty("mail." + name+ ".localaddress");
إذا (localHostName == null || localHostName. length() <= 0) {
InetAddress localHost = InetAddress.getLocalHost();
localHostName = localHost.getHostName();
// إذا لم نتمكن من الحصول على اسمنا، فاستخدم العنوان المحلي الحرفي
إذا (اسم المضيف المحلي == فارغ)
// XXX - غير صحيح لـ IPv6
localHostName = "[" + localHost.getHostAddress() + "]";
}
} قبض على (UnknownHostException uhex) {
}
إرجاع اسم المضيف المحلي؛
}
يمكنك أن ترى أنه يمكن الحصول على اسم المضيف من سمة الجلسة للاتصال الحالي، أو من تكوين المضيفين للخادم الحالي، ومع ذلك، لا يقوم برنامجنا بتعيين اسم المضيف في الجلسة، لذلك يجب أن يكمن السبب في ملف المضيفين تم تعديل خادم Linux، مما تسبب في عدم قدرة برنامج JAVA على الحصول على localhostName تلقائيًا.
5. قم بفحص الملف /etc/hosts، فالوضع كما يلي:
انسخ رمز الكود كما يلي:
127.0.0.1 المضيف المحلي.المجال المحلي
::1 localhost6.localdomain6 localhost6
ما عليك سوى تعديل ملف المضيفين كما يلي:
انسخ رمز الكود كما يلي:
127.0.0.1 المضيف المحلي
::1 localhost6.localdomain6 localhost6
6. أعد الاختبار ويتم حل المشكلة.
في الواقع، يمكن أيضًا تجنب هذا الموقف من خلال البرمجة، أي إضافة سمة اسم المضيف للخادم الحالي إلى مثال برنامج الاتصال:
انسخ رمز الكود كما يلي:
public static void main(String[] args) {
يحاول {
إنت سمتبورت = 25؛
سلسلة smtpserver = "219.147.xxx.xxx";
خصائص الدعامة = System.getProperties();
prop.put("mail.smtp.auth", "true");
prop.put("mail.smtp.localhost", "myMailServer");
جلسة mailSession = Session.getInstance(prop, null);
نقل النقل = mailSession.getTransport("smtp");
Transport.connect(smtpserver,smtpport, "username", "password");
System.out.println("الاتصال موافق");
Transport.Close();
} التقاط (AuthenticationFailedException ar) {
printStackTrace();
System.out.println("فشل اتصال خادم SMTP، يرجى التحقق مما إذا كانت معلومات الإدخال صحيحة");
} التقاط (NoSuchProviderException e) {
printStackTrace();
System.out.println("فشل اتصال خادم SMTP، يرجى التحقق مما إذا كانت معلومات الإدخال صحيحة");
} قبض على (MessagingException ه) {
printStackTrace();
System.out.println("فشل اتصال خادم SMTP، يرجى التحقق مما إذا كانت معلومات الإدخال صحيحة");
}
}