JavaRush /مدونة جافا /Random-AR /كيفية إرسال بريد إلكتروني من تطبيق جافا (مع مثال)
PodoBulge
مستوى
Минск

كيفية إرسال بريد إلكتروني من تطبيق جافا (مع مثال)

نشرت في المجموعة
يعد إرسال بريد إلكتروني من تطبيق Java مطلبًا شائعًا. لا يهم ما إذا كنت تعمل على تطبيق Java أساسي، أو تطبيق ويب، أو تطبيق Java للمؤسسة، فقد تحتاج إلى إرسال بريد إلكتروني لتنبيه موظفي الدعم حول الأخطاء، أو ببساطة إرسال بريد إلكتروني إلى المستخدمين عند التسجيل، إعادة تعيين كلمة المرور الخاصة بهم، أو اطلب منهم تأكيد عنوان البريد الإلكتروني بعد التسجيل. هناك العديد من السيناريوهات عندما تحتاج إلى القدرة على إرسال رسائل البريد الإلكتروني من تطبيق Java. كيفية إرسال بريد إلكتروني من تطبيق جافا (مع مثال) - 1في التطبيقات الجاهزة، لديك بالفعل وحدة نمطية أو مكتبة تعمل مع جميع ميزات إرسال رسائل البريد الإلكتروني، مثل القدرة على إرسال المرفقات والصور، بما في ذلك التوقيعات والنص المنسق في رسائل البريد الإلكتروني، ولكن إذا كنت بحاجة إلى كتابة شيء ما من الصفر، ثم يعد Java Mail API خيارًا رائعًا. في هذه المقالة، سنتعلم كيفية إرسال رسائل البريد الإلكتروني من تطبيق Java باستخدام واجهة برمجة تطبيقات البريد ( javax.mail ). قبل كتابة التعليمات البرمجية، يجب أن تعرف بعض الأساسيات حول كيفية عمل البريد الإلكتروني، على سبيل المثال، تحتاج إلى خادم SMTP (بروتوكول نقل البريد البسيط) . إذا كنت تقوم بتشغيل تطبيق Java الخاص بك على Linux، فيجب أن تعلم أن برنامج SMTP يستخدم المنفذ 25. يمكنك استخدام أي خادم بريد لإرسال رسائل باستخدام Java، بما في ذلك خوادم البريد العامة مثل GMail أو Yahoo أو أي مزود خدمة آخر، كل ذلك ما تحتاجه هو تفاصيل خادم SMTP الخاصة بهم ، مثل اسم المضيف والمنفذ ومعلمات الاتصال وما إلى ذلك. يمكنك أيضًا استخدام SSL ( طبقة المقابس الآمنةوTLS ( Transport Layer Security ) للاتصال وإرسال رسائل البريد الإلكتروني بشكل آمن، ولكننا جعلنا هذا المثال بسيطًا وركزنا على الحد الأدنى من المنطق لإرسال الرسائل من تطبيق Java. سنتعلم في المقالات المستقبلية كيفية إرسال بريد إلكتروني باستخدام المرفقات، وكيفية إرسال بريد إلكتروني بتنسيق HTML، وكيفية إرفاق صور بالبريد الإلكتروني، وكيفية استخدام مصادقة SSL للاتصال بخادم GMail وإرسال رسائل البريد الإلكتروني، وما إلى ذلك. الآن، دعونا نفهم (نناقش) هذا المثال البسيط لـ Java Mail API .

مثال على كود جافا لإرسال البريد الإلكتروني

لإرسال خطاب من برنامج Java، ستحتاج إلى Java Mail API و Java Activation Framework (JAF) ؛ لنكون أكثر دقة، ستحتاج إلى mail-1.4.5.jar و smtp-1.4.4.jar و activation-1.1.jar . تحتاج إلى تنزيل ملفات JAR هذه وتضمينها في Classpath الخاص بك لتشغيل هذا البرنامج. وبدلاً من ذلك، يمكنك استخدام Maven لإدارة التبعيات وتضمين جميع التبعيات هناك. بمجرد حصولك على جميع ملفات JAR هذه، ما عليك سوى اتباع الخطوات الموضحة أدناه لإنشاء بريد إلكتروني وإرساله باستخدام Java.
  1. قم بإنشاء كائن Sessionعن طريق استدعاء Session.getDefaultInstance(properties)حيث properties- يحتوي على كافة الخصائص المهمة، على سبيل المثال، اسم المضيف لخادم SMTP.

  2. قم بإنشاء كائن MimeMessageعن طريق تمرير الكائن Sessionالذي تم الحصول عليه في الخطوة السابقة عليه. لدينا مجموعة من الخصائص المختلفة في هذا الكائن مثل مستلم البريد الإلكتروني والموضوع ونص الرسالة والمرفقات وما إلى ذلك.

  3. استخدمه javax.mail.Transportلإرسال بريد إلكتروني عن طريق استدعاء طريقة ثابتة send(email)، حيث يمكن أن يكون البريد الإلكتروني كائنًا MimeMessage.

يختلف عدد الخصائص التي تمررها لإنشاء كائن Sessionحسب نوع خادم SMTP، على سبيل المثال، إذا كنت تستخدم خادم SMTP لا يتطلب أي مصادقة، فيمكنك إنشاء كائن Sessionبخاصية واحدة فقط، على سبيل المثال، smtp .mail.host، ولا تحتاج إلى تحديد المنفذ لأنه يحتوي على المنفذ 25 بشكل افتراضي. من ناحية أخرى، إذا كنت تتصل بخادم SMTP يتطلب مصادقة TLS أو SSL، مثل مضيف SMTP الخاص بـ GMail، فأنت بحاجة إلى توفير المزيد من الخصائص، مثل mail.smtp.port=547 لـ TLS والبريد. smtp.port= 457 لـ SSL. هذا برنامج Java كامل يتصل بخادم SMTP قياسي دون مصادقة ويرسل رسالة نصية باستخدام Java Mail API.
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
* Java Program to send text mail using default SMTP server and without authentication.
* You need mail.jar, smtp.jar and activation.jar to run this program.
*
* @author Javin Paul
*/

public class EmailSender{
     public static void main(String args[]){

           String to = "receive@abc.om";         // sender email
           String from = "sender@abc.com";       // receiver email
           String host = "127.0.0.1";            // mail server host

           Properties properties = System.getProperties();
           properties.setProperty("mail.smtp.host", host);

           Session session = Session.getDefaultInstance(properties); // default session

           try {
                MimeMessage message = new MimeMessage(session); // email message

                message.setFrom(new InternetAddress(from)); // setting header fields

                message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

                message.setSubject("Test Mail from Java Program"); // subject line

                // actual mail body
                message.setText("You can send mail from Java program by using mail API, but you need" +
                                "couple of more JAR files e.g. smtp.jar and activation.jar");

                // Send message
                Transport.send(message); System.out.println("Email Sent successfully....");
               } catch (MessagingException mex){ mex.printStackTrace(); }

     }

}
الإخراج: يمكنك تجميع وتشغيل هذا البرنامج لإرسال بريد إلكتروني بسيط من برنامج جافا:
$ javac EmailSender.java
$ java EmailSender
تم إرسال البريد الإلكتروني بنجاح.... كما ترى، من السهل جدًا إرسال رسائل البريد الإلكتروني من خلال برنامج Java. بمجرد إنشاء الكائن MimeMessage، تحتاج إلى إضافة مستلمين، يمكن تحديدهم في TO, CC, BCC. بعد الانتهاء من المستلمين، نحتاج إلى تحديد موضوع الرسالة، وأخيرًا، محتوى الرسالة نفسها عن طريق استدعاء الطريقة message.setText()؛ إذا كنت تريد إرسال رسائل بريدية متعددة، فيمكن استخدام الطرق التالية لتحديد المستلمين:
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
يمكنك إضافة أشخاص إلى الحقل TOباستخدام Message.RecipientType.TO، وإلى الحقل CCباستخدام Message.RecipientType.CC، وإلى BCC- Message.RecipientType.BCC.

الأخطاء والاستثناءات

عندما يبدأ العديد من مبرمجي Java لأول مرة في كتابة برنامج لإرسال بريد إلكتروني، يصادفهم خطأ لأن معظمهم يعتقدون أن mail.jar وactivation.jar سيكونان كافيين لإرسال بريد إلكتروني من تطبيق Java، وهو ليس هو الحال، خاصة إذا قمت بإرسال بريد إلكتروني عبر خادم SMTP محلي في Linux. إذا قمت بتشغيل هذا البرنامج باستخدام mail.jar وactivation.jar فقط في CLASSPATH، فمن المرجح أن تحصل على هذا الخطأ.

الاستثناء 1:

com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 25; timeout -1;
        nested exception is:
            java.net.ConnectException: Connection refused: connect
            at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1984)
            at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:656)
            at javax.mail.Service.connect(Service.java:345)
            at javax.mail.Service.connect(Service.java:226)
            at javax.mail.Service.connect(Service.java:175)
            at javax.mail.Transport.send0(Transport.java:253)
            at javax.mail.Transport.send(Transport.java:124)
            at Testing.main(Testing.java:62)
        Caused by: java.net.ConnectException: Connection refused: connect
            at java.net.DualStackPlainSocketImpl.connect0(Native Method)
            at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
            at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
            at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
            at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
            at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
            at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
            at java.net.Socket.connect(Socket.java:579) at java.net.Socket.connect(Socket.java:528)
            at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:301)
            at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:229)
            at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1950)
       ... 7 more
على الرغم من أن حل هذا الخطأ بسيط جدًا، إلا أنه قد يربكك. java.net.ConnectException: Connection refused: connectعادةً ما يتعطل عندما لا يعمل الخادم أو يتم تحديد المنفذ الذي تتصل به بشكل غير صحيح. الحل: بالإضافة إلى mail-1.4.5.jar، تحتاج أيضًا إلى smtp-1.4.4.jar وactivation-1.1.jar.

الاستثناء 2:

هذا خطأ آخر يسمى NoClassDefFoundError، والذي يشير عادةً إلى ملف JAR مفقود في Classpath
Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/MessagingException
           at java.lang.Class.getDeclaredMethods0(Native Method)
           at java.lang.Class.privateGetDeclaredMethods(Class.java:2521)
           at java.lang.Class.getMethod0(Class.java:2764)
           at java.lang.Class.getMethod(Class.java:1653)
           at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
           at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: javax.mail.MessagingException
           at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
           at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
           at java.security.AccessController.doPrivileged(Native Method)
           at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
           at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
           at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
           at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
الحل: تمكنت من حل مشكلتي، وكان ذلك بسبب Classpath غير صحيح. على الرغم من أنني أملك ملفات JAR الثلاثة المطلوبة، وملف فئة Java للبرنامج في نفس الدليل، وقمت بتشغيل البرنامج من هناك، إلا أن Java لم تتمكن من اكتشاف ذلك. حاولت إدخال الأوامر التالية وكان البرنامج يعمل بشكل جيد:
java -cp mail-1.4.5.jar:smtp-1.4.4.jar:activation-1.1.jar:. JavaMailSender
تم إرسال البريد الإلكتروني بنجاح.... يرجى ملاحظة أنه تم وضع علامة على الدليل الحالي بنقطة في نهاية وسيطة Classpath. نظرًا لأنني كنت أقوم بتشغيل البرنامج على Linux، فقد استخدمت النقطتين (:) بدلاً من الفاصلة المنقوطة (؛) (كما هو الحال في Windows). يتعلق الأمر كله بكيفية إرسال بريد إلكتروني من تطبيق Java باستخدام واجهة برمجة تطبيقات البريد. قد تجد هذا الأمر بسيطًا للغاية، نظرًا لأنك لا تحتاج إلى أكثر من ثلاثة ملفات JAR. يكون الأمر أسهل بكثير إذا كنت تستخدم Gradle أو Maven لإدارة التبعيات. في البرامج التعليمية التالية، سنرى أمثلة أكثر تعقيدًا لـ Java Mail API لإرسال رسائل البريد الإلكتروني مع المرفقات والصور ورسائل البريد الإلكتروني المنسقة بشكل جميل لإرسال التقارير والجداول. ترجمة المقال: كيفية إرسال بريد إلكتروني من برنامج جافا مع مثال
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION