JavaRush /وبلاگ جاوا /Random-FA /نحوه ارسال ایمیل از یک برنامه جاوا (به عنوان مثال)
PodoBulge
مرحله
Минск

نحوه ارسال ایمیل از یک برنامه جاوا (به عنوان مثال)

در گروه منتشر شد
ارسال ایمیل از یک برنامه جاوا یک نیاز رایج است. فرقی نمی کند که روی یک برنامه اصلی جاوا کار می کنید، یک برنامه وب یا یک برنامه جاوا سازمانی، ممکن است لازم باشد یک ایمیل برای آگاه کردن کارکنان پشتیبانی در مورد خطاها ارسال کنید، یا به سادگی یک ایمیل برای کاربران پس از ثبت نام ارسال کنید. رمز عبور آنها را بازنشانی کنید یا از آنها بخواهید که آدرس ایمیل را پس از ثبت نام تأیید کنند. سناریوهای زیادی وجود دارد که شما به توانایی ارسال ایمیل از یک برنامه جاوا نیاز دارید. نحوه ارسال ایمیل از یک برنامه جاوا (به عنوان مثال) - 1در برنامه های آماده از قبل ماژول یا کتابخانه ای دارید که با تمام ویژگی های ارسال ایمیل کار می کند، مانند امکان ارسال پیوست ها، تصاویر، از جمله امضا و متن غنی در ایمیل، اما اگر نیاز به نوشتن چیزی از ابتدا دارید، پس Java Mail API یک گزینه عالی است. در این مقاله، نحوه ارسال ایمیل از یک برنامه جاوا را با استفاده از mail API ( javax.mail ) خواهیم آموخت . قبل از نوشتن کد، باید اصول اولیه نحوه کار ایمیل را بدانید، برای مثال به یک سرور SMTP (پروتکل انتقال نامه ساده) نیاز دارید . اگر برنامه جاوا خود را روی لینوکس اجرا می کنید، باید بدانید که دیمون SMTP از پورت 25 استفاده می کند . می توانید از هر سرور ایمیل برای ارسال پیام با استفاده از جاوا استفاده کنید، از جمله سرورهای پست عمومی مانند GMail، Yahoo یا هر ارائه دهنده خدمات دیگر، همه. شما به جزئیات سرور SMTP آنها نیاز دارید ، مانند نام میزبان، پورت، پارامترهای اتصال و غیره. همچنین می توانید از SSL ( لایه سوکت های امنTLS ( امنیت لایه حمل و نقل ) برای اتصال ایمن و ارسال ایمیل استفاده کنید، اما ما این مثال را ساده کردیم و بر منطق حداقلی برای ارسال حروف از یک برنامه جاوا تمرکز کردیم. در مقالات بعدی نحوه ارسال ایمیل با استفاده از فایل های پیوست، نحوه ارسال ایمیل با فرمت HTML، نحوه پیوست کردن تصاویر به ایمیل، نحوه استفاده از احراز هویت SSL برای اتصال به سرور GMail و ارسال ایمیل و غیره را خواهیم آموخت. اکنون، بیایید این مثال ساده Java Mail API را درک کنیم (بحث کنیم) .

نمونه کد جاوا برای ارسال ایمیل

برای ارسال نامه از یک برنامه جاوا، به 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 را دارید، به سادگی مراحل زیر را برای ایجاد و ارسال ایمیل با استفاده از جاوا دنبال کنید.
  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. این یک برنامه جاوا کامل است که بدون احراز هویت به یک سرور استاندارد 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
ایمیل با موفقیت ارسال شد.... همانطور که می بینید، ارسال ایمیل از یک برنامه جاوا بسیار آسان است. هنگامی که شی را ایجاد کردید 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.

خطاها و استثنائات

هنگامی که بسیاری از برنامه نویسان جاوا برای اولین بار شروع به نوشتن برنامه ای برای ارسال ایمیل می کنند، با یک خطا مواجه می شوند زیرا اکثر آنها فکر می کنند که mail.jar و activation.jar برای ارسال ایمیل از یک برنامه جاوا کافی هستند، که اینطور نیست. به خصوص اگر از طریق یک سرور SMTP محلی در لینوکس ایمیل ارسال کنید. اگر این برنامه را فقط با 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 -cp mail-1.4.5.jar:smtp-1.4.4.jar:activation-1.1.jar:. JavaMailSender
ایمیل با موفقیت ارسال شد... لطفاً توجه داشته باشید که دایرکتوری فعلی با یک نقطه در انتهای آرگومان Classpath مشخص شده است. از آنجایی که من برنامه را روی لینوکس اجرا می کردم، به جای نقطه ویرگول (;) (مانند ویندوز) از علامت دونقطه (:) استفاده کردم. همه چیز درباره نحوه ارسال ایمیل از یک برنامه جاوا با استفاده از API ایمیل است. ممکن است این کار را بسیار ساده بیابید، زیرا به چیزی بیش از سه فایل JAR نیاز ندارید. اگر از Gradle یا Maven برای مدیریت وابستگی ها استفاده کنید بسیار ساده تر است. در آموزش‌های بعدی نمونه‌های پیچیده‌تری از Java Mail API برای ارسال ایمیل با پیوست، همراه با تصاویر و ایمیل‌هایی با فرمت زیبا برای ارسال گزارش‌ها و جداول را مشاهده خواهیم کرد. ترجمه مقاله: نحوه ارسال ایمیل از برنامه جاوا با مثال
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION