JavaRush /Blog Java /Random-MS /Cara menghantar e-mel daripada aplikasi Java (dengan cont...
PodoBulge
Tahap
Минск

Cara menghantar e-mel daripada aplikasi Java (dengan contoh)

Diterbitkan dalam kumpulan
Menghantar e-mel daripada aplikasi Java adalah keperluan biasa. Tidak kira sama ada anda sedang mengusahakan aplikasi Java teras, aplikasi web atau aplikasi Java perusahaan, anda mungkin perlu menghantar e-mel untuk memaklumkan kakitangan sokongan tentang ralat, atau hanya menghantar e-mel kepada pengguna semasa pendaftaran, tetapkan semula kata laluan mereka, atau minta mereka mengesahkan alamat e-mel selepas pendaftaran. Terdapat banyak senario apabila anda memerlukan keupayaan untuk menghantar e-mel daripada aplikasi Java. Cara menghantar e-mel daripada aplikasi Java (dengan contoh) - 1Dalam aplikasi siap sedia, anda sudah mempunyai modul atau perpustakaan yang berfungsi dengan semua ciri untuk menghantar e-mel, seperti keupayaan untuk menghantar lampiran, imej, termasuk tandatangan dan teks kaya dalam e-mel, TETAPI jika anda perlu menulis sesuatu dari awal, maka Java Mail API ialah pilihan yang bagus. Dalam artikel ini, kita akan belajar cara menghantar e-mel daripada aplikasi Java menggunakan API mel ( javax.mail ). Sebelum menulis kod anda harus mengetahui beberapa asas tentang cara e-mel berfungsi, contohnya anda memerlukan pelayan SMTP (Simple Mail Transfer Protocol) . Jika anda menjalankan aplikasi Java anda di Linux, maka anda harus tahu bahawa daemon SMTP menggunakan port 25. Anda boleh menggunakan mana-mana pelayan mel untuk menghantar mesej menggunakan Java, termasuk pelayan mel awam seperti GMail, Yahoo atau mana-mana pembekal perkhidmatan lain, semuanya yang anda perlukan ialah butiran pelayan SMTP mereka , seperti nama hos, port, parameter sambungan, dsb. Anda juga boleh menggunakan SSL ( lapisan soket selamat ), TLS ( Transport Layer Security ) untuk menyambung dan menghantar e-mel dengan selamat, tetapi kami menjadikan contoh ini mudah dan memfokuskan pada logik minimum untuk menghantar surat daripada aplikasi Java. Dalam artikel akan datang kita akan belajar cara menghantar e-mel menggunakan lampiran, cara menghantar e-mel berformat HTML, cara melampirkan imej pada e-mel, cara menggunakan pengesahan SSL untuk menyambung ke pelayan GMail dan menghantar e-mel, dsb. Sekarang, mari kita fahami (bincang) contoh Java Mail API yang mudah ini .

Contoh kod Java untuk menghantar e-mel

Untuk menghantar surat daripada program Java, anda memerlukan Java Mail API dan Java Activation Framework (JAF) ; untuk menjadi lebih tepat, anda memerlukan mail-1.4.5.jar , smtp-1.4.4.jar , dan activation-1.1.jar . Anda perlu memuat turun fail JAR ini dan memasukkannya ke dalam Classpath anda untuk menjalankan program ini. Sebagai alternatif, anda boleh menggunakan Maven untuk pengurusan kebergantungan dan memasukkan semua kebergantungan di sana. Sebaik sahaja anda mempunyai semua fail JAR ini, ikuti langkah di bawah untuk membuat dan menghantar e-mel menggunakan Java.
  1. Cipta objek Sessiondengan memanggil Session.getDefaultInstance(properties), di mana properties- mengandungi semua sifat penting, contohnya, nama hos pelayan SMTP.

  2. Buat objek MimeMessagedengan menghantar objek Sessionyang diperolehi dalam langkah sebelumnya. Kami mempunyai satu set sifat yang berbeza dalam objek ini seperti penerima e-mel, subjek, badan mesej, lampiran, dsb.

  3. Gunakannya javax.mail.Transportuntuk menghantar e-mel dengan memanggil kaedah statik send(email), di mana e-mel boleh menjadi objek MimeMessage.

Bilangan sifat yang anda lalui untuk mencipta objek Sessionberbeza bergantung pada jenis pelayan SMTP, contohnya, jika anda menggunakan pelayan SMTP yang tidak memerlukan sebarang pengesahan, anda boleh mencipta objek Sessiondengan hanya satu sifat, contohnya smtp. mail.host, dan anda tidak perlu menentukan port kerana ia mempunyai port 25 secara lalai. Sebaliknya, jika anda menyambung ke pelayan SMTP yang memerlukan pengesahan TLS atau SSL, seperti Hos SMTP GMail, maka anda perlu menyediakan lebih sedikit sifat, contohnya mail.smtp.port=547 untuk TLS dan mel. smtp.port= 457 untuk SSL. Ini ialah program Java lengkap yang menyambung ke pelayan SMTP standard tanpa pengesahan dan menghantar mesej teks menggunakan 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(); }

     }

}
Output: Anda boleh menyusun dan menjalankan program ini untuk menghantar e-mel ringkas daripada program Java:
$ javac EmailSender.java
$ java EmailSender
Menghantar e-mel berjaya.... Seperti yang anda lihat, sangat mudah untuk menghantar e-mel daripada program Java. Sebaik sahaja anda telah mencipta objek MimeMessage, anda perlu menambah penerima, yang boleh ditentukan dalam TO, CC, BCC. Setelah selesai dengan penerima, kita perlu menentukan subjek surat, dan, akhirnya, kandungan surat itu sendiri dengan memanggil kaedah message.setText(); Jika anda ingin melakukan berbilang mel, kaedah berikut boleh digunakan untuk menentukan penerima:
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
Anda boleh menambah orang ke medan TOmenggunakan Message.RecipientType.TO, ke medan CCmenggunakan Message.RecipientType.CCdan ke BCC- Message.RecipientType.BCC.

Ralat dan Pengecualian

Apabila ramai pengaturcara Java mula-mula mula menulis atur cara untuk menghantar e-mel, mereka menemui ralat kerana kebanyakan mereka berpendapat bahawa mail.jar dan activation.jar akan mencukupi untuk menghantar e-mel daripada aplikasi Java, yang tidak begitu, terutamanya jika anda menghantar e-mel melalui pelayan SMTP tempatan di Linux. Jika anda menjalankan program ini dengan hanya mail.jar dan activation.jar dalam CLASSPATH anda, kemungkinan besar anda akan mendapat ralat ini.

Pengecualian 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
Walaupun penyelesaian kepada ralat ini sangat mudah, ia boleh mengelirukan anda. java.net.ConnectException: Connection refused: connectIa biasanya ranap apabila pelayan tidak berfungsi atau port yang anda sambungkan tidak dinyatakan dengan betul. Penyelesaian: sebagai tambahan kepada mail-1.4.5.jar, anda juga memerlukan smtp-1.4.4.jar dan activation-1.1.jar.

Pengecualian 2:

Ini adalah satu lagi ralat yang dipanggil NoClassDefFoundError, yang biasanya merujuk kepada fail JAR yang hilang dalam 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)
Penyelesaian: Saya berjaya menyelesaikan masalah saya, ia disebabkan oleh Classpath yang salah. Walaupun saya mempunyai ketiga-tiga JAR yang diperlukan, fail kelas Java untuk program dalam direktori yang sama, dan menjalankan program dari sana, Java tidak dapat memikirkannya. Saya cuba memasukkan arahan berikut dan program ini berfungsi dengan baik:
java -cp mail-1.4.5.jar:smtp-1.4.4.jar:activation-1.1.jar:. JavaMailSender
Berjaya menghantar e-mel.... Sila ambil perhatian bahawa direktori semasa ditandakan dengan titik di hujung argumen Classpath. Memandangkan saya menjalankan program di Linux, saya menggunakan titik bertindih (:) dan bukannya koma bertitik (;) (seperti dalam Windows). Itu sahaja tentang cara menghantar e-mel daripada aplikasi Java menggunakan API mel. Anda mungkin mendapati ini sangat mudah, kerana anda tidak memerlukan apa-apa lebih daripada tiga fail JAR. Ia lebih mudah jika anda menggunakan Gradle atau Maven untuk mengurus kebergantungan. Dalam tutorial berikut, kami akan melihat contoh yang lebih kompleks bagi Java Mail API untuk menghantar e-mel dengan lampiran, dengan gambar dan e-mel berformat indah untuk menghantar laporan dan jadual. Terjemahan artikel: Cara Menghantar E-mel dari Program Java dengan Contoh
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION