تقدم هذه المقالة رمز تنفيذ Java لبرنامج مرسل البريد الإلكتروني البسيط. تتم مشاركتها معك للرجوع إليها. المحتوى المحدد كما يلي
في هذا الرمز ، هناك عدة نقاط من الاهتمام للتأكيد :
1. استخدم المقبس للحصول على اتصال مع SMTP Mail Server ، انتبه إلى اسم المضيف لخادم SMTP ؛
2. عند استخدام أمر البيانات ، إذا تم كتابة الموضوع ، فيجب أن يكون هناك سطر فارغ بين جسم البريد الإلكتروني والموضوع ، أي "Enter + Line Break" ، وهو /r /n في الكود ؛
3. من الضروري أيضًا ترميز اسم المستخدم وكلمة المرور عبر البريد الإلكتروني للمرسل قبل نقله إلى خادم SMTP ؛
4. لا يزال البرنامج لديه تحذير عند التجميع. وذلك لأن فئة sun.misc.base64encoder موجودة في حزمة RT.JAR. نظرًا لأن JDK سيتم تحديثه وترقيته ، فقد تتغير بعض الفئات في الحزمة وتكون غير متوفرة ، وبالتالي فإن المترجم سيصدر تحذيرًا.
بالإضافة إلى ذلك ، بعد كتابة هذه الرموز ، تم العثور على بعض المشاكل :
1. خوادم البريد من smtp.qq.com و smtp.sina.com لا يعرفون سبب عدم استخدامهما. وهذا يعني أنه عندما يكون عنوان البريد الإلكتروني للمرسل هو QQ أو Sina ، لم يعد هذا البرنامج مفيدًا ولا يمكن فهم رمز استجابة الحالة. في اختباراتي ، يمكن استخدام SMTP.163.com فقط. من الواضح أنه تم العثور على خوادم SMTP هذه على الموقع الرسمي ، فلماذا لا يمكن استخدامها؟ إنه غريب جدًا. أي شخص يعرف يأمل أن يخبرني ، شكرا لك!
2. في طريقة SendEmail () في فئة SimplEmailsender أدناه ، تكون بعض الرموز المكررة مربكة ، لكن لا توجد طريقة ، ما زلت لا أفهمها ...
3. اكتشاف رئيسي: أنا مندهش من أن البريد الإلكتروني QQ يتلقى رسائل رسائل بسرعة قد تكون عشرات المرات أسرع من 163 رسالة بريد إلكتروني ورسائل بريد إلكتروني Sina. بالإضافة إلى ذلك ، عند استخدام أمر nslookup للاستعلام عن اسم مضيف smtp.qq.com ، وجد أنه يحتوي على العديد من خوادم SMTP ، على الأقل 5 أكثر من 163 3. Tencent قوي حقًا ؛
4. على الرغم من أنني أستطيع إرسال رسائل بريد إلكتروني بشكل ضار إلى عنوان بريد إلكتروني معين بعد كتابة هذا البرنامج ، فقد وجدت أنه عندما أرسل عشرات رسائل البريد الإلكتروني إلى عنوان بريد إلكتروني ثابت آخر على التوالي مع عنوان بريد إلكتروني Sina ، سيتم رفض عنوان البريد الإلكتروني Sina إذا أردت إرسال بريد إلكتروني. احرص.
الرمز كما يلي:
// email class e_mail {string from ؛ سلسلة ل موضوع السلسلة ؛ محتوى السلسلة ؛ اسم المستخدم سلسلة PWD ؛ Public E_Mail (سلسلة من ، سلسلة إلى ، موضوع السلسلة ، محتوى السلسلة ، اسم المستخدم السلسلة ، السلسلة pwd) {this.from = from ؛ this.to = to ؛ this.subject = الموضوع ؛ this.content = المحتوى ؛ this.userName = this.tobase64 (اسم المستخدم) ؛ this.pwd = this.tobase64 (pwd) ؛ } / *** transcode اسم المستخدم وكلمة المرور في فئة e_mail* / سلسلة خاصة tobase64 (String str) {return (new Sun.Misc.base64encoder (). encode (str.getBytes ())) ؛ }} // فئة مرسل البريد البسيطة لتنفيذ وظيفة إرسال الفئة العامة simplemailsender {private string smtpserver ؛ منفذ int الخاص = 25 ؛ مقبس المقبس الخاص ؛ BufferedReader BR ؛ printwriter pw ؛ / *** حدد خادم بريد SMTP استنادًا إلى عنوان البريد الإلكتروني للمرسل*/ private void initserver (سلسلة من) {if (from.contains ("@163")) {this.smtpserver = "smtp.163.com } آخر إذا (من. } آخر إذا (من. } آخر إذا (من. }} public void sendemail (e_mail email) {try {this.initserver (email.from) ؛ this.socket = مقبس جديد (smtpserver ، منفذ) ؛ this.br = this.getReader (Socket) ؛ this.pw = this.getWriter (Socket) ؛ // ابدأ في تجميع تسلسل الأوامر لإرسال رسائل البريد الإلكتروني send_receive (null) ؛ // تلقي الرسالة التي تفيد بأن الاتصال بخادم SMTP SEND_RECEIVE بنجاح ("Ehlo Hao") ؛ send_receive ("تسجيل الدخول") ؛ send_receive (email.username) ؛ send_receive (email.pwd) ؛ send_receive ("البريد من: <" + email.from + ">") ؛ send_receive ("rcpt to: <" + email.to + ">") ؛ send_receive ("البيانات") ؛ // البريد الإلكتروني محتوى pw.println ("من:" + البريد الإلكتروني. من) ؛ pw.println ("to:" + email.to) ؛ // تأكد من تفريغ خط بين الموضوع والنص ، أي إضافة "/r/n" pw.println ("الموضوع:" + email.subject + "/r/n") ؛ // اطبع محتوى البريد الإلكتروني على نظام وحدة التحكم. System.out.println ("to:" + email.to) ؛ System.out.println ("الموضوع:" + email.subject + "/r/n") ؛ system.out.println (email.content) ؛ // البريد الإلكتروني body pw.println (البريد الإلكتروني. content) ؛ // تذكر أن تنهي النص بـ "." send_receive (".") ؛ send_receive ("quit") ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } أخيرًا {try {if (socket! = null) socket.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}}/** * في كل مرة يتم إرسال أمر ، "/r/n" يجب إضافة بعد الأمر ، * سيتم طباعة رمز الحالة المقابل لخادم بريد SMTP في نفس الوقت * param command */private void send_receive (command string) ioException {if (command! = null) pw.print (command + "/r/n") ؛ pw.flush () ؛ System.out.println ("user >>" + command) ؛ } char [] response = new Char [1024] ؛ Br.Read (استجابة) ؛ system.out.println (response) ؛ } / *** احصل على دفق الإخراج من المقبس* / printwriter printwriter getWriter (مقبس المقبس) يلقي ioException {outputStream SocketOut = socket.getOutputStream () ؛ إرجاع New PrintWriter (SocketOut ، True) ؛ } / *** احصل على دفق الإدخال من المقبس* / خاص bufferrederer getReader (مقبس المقبس) يلقي ioException {inputStream socketin = socket.getInputStream () ؛ إرجاع BufferedReader جديد (New InputStreamReader (Socketin)) ؛ } // اختبار الفراغ الثابت العام (سلسلة [] args) {new MailSenderGui () ؛ }} // برنامج مرسل البريد واجهة الفئة mailsendergui يمتد jframe actionlistener {private jlabel usernamelabel ؛ الخاص jtextfield usernamefield ؛ خاص Jlabel Pwdlabel ؛ Private JPasswordfield PWDfield ؛ خاص Jlabel FromLabel ؛ jtextfield الخاص من Fromfield ؛ خاص Jlabel Tolabel ؛ خاص JTextfield Tofield ؛ خاص Jlabel thisplabel ؛ jlabel private contentLabel ؛ jtextarea المحتوى الخاص ؛ خاص jbutton sendbtn ؛ خاص jbutton cancelbtn ؛ البريد الإلكتروني الخاص E_Mail ؛ SimplEmailsender Simplsender ؛ Public MailSenderGui () {this.init () ؛ this.mailsender = new SimplEmailsender () ؛ } private void init () {this.fromlabel = new JLabel ("عنوان البريد الإلكتروني المرسل:") ؛ this.fromfield = New JTextfield (25) ؛ this.usernamelabel = new Jlabel ("اسم المستخدم:") ؛ this.usernamefield = New JTextfield (25) ؛ this.pwdlabel = new jlabel ("كلمة المرور:") ؛ this.pwdfield = New JPasswordfield (25) ؛ this.tolabel = new JLabel ("عنوان البريد الإلكتروني المستلم:") ؛ this.tofield = New JTextfield (25) ؛ this.subjectLabel = New JLabel ("البريد الإلكتروني موضوع:") ؛ this.subjectfield = New JTextfield (20) ؛ this.contentLabel = New JLabel ("البريد الإلكتروني:") ؛ this.contentarea = new jtextarea (15 ، 20) ؛ this.settitle ("Ant-> Simple Mail Sender") ؛ this.setBounds (200 ، 30 ، 500 ، 500) ؛ this.setLayout (New BorderLayout ()) ؛ this.setDefaultCloseOperation (jframe.exit_on_close) ؛ this.setVisible (صحيح) ؛ this.sendbtn = new jbutton ("send") ؛ this.cancelbtn = new jbutton ("reset") ؛ this.sendbtn.addActionListener (هذا) ؛ this.cancelbtn.addActionListener (this) ؛ jpanel uppanel = new jpanel (new GridLayout (6 ، 2 ، 5 ، 5)) ؛ uppanel.add (fromlabel) ؛ uppanel.add (fromfield) ؛ uppanel.add (usernamelabel) ؛ uppanel.add (pwdlabel) ؛ uppanel.add (pwdfield) ؛ uppanel.add (tolabel) ؛ uppanel.add (tofield) ؛ uppanel.add (tofield) ؛ uppanel.add (thisionLabel) ؛ Uppanel.add (ThinfberField) ؛ uppanel.add (contentLabel) ؛ this.add (Uppanel ، borderlayout.north) ؛ this.add (contentarea ، borderlayout.center) ؛ jpanel downpanel = new jpanel (flowlayout new (flowlayout.center)) ؛ downpanel.add (sendbtn ، borderlayout.south) ؛ DownPanel.add (CancelBtn ، BorderLayout.south) ؛ this.add (downpanel ، borderlayout.south) ؛ } Override public void actionperformed (ActionEvent e) {if ( String (this.pwdfield.getPassword ())) ؛ this.mailsender.sendemail (this.email) ؛ } if if ( this.tofield.settext (null) ؛ this.subjectfield.settext (null) ؛ this.contentarea.settext (null) ؛ }}}ما سبق هو كل رمز لكتابة برامج إرسال بريد إلكتروني بسيطة في جافا ، على أمل أن يكون مفيدًا لتعلم الجميع.