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. Dalam 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.-
Cipta objek
Session
dengan memanggilSession.getDefaultInstance(properties)
, di manaproperties
- mengandungi semua sifat penting, contohnya, nama hos pelayan SMTP. -
Buat objek
MimeMessage
dengan menghantar objekSession
yang diperolehi dalam langkah sebelumnya. Kami mempunyai satu set sifat yang berbeza dalam objek ini seperti penerima e-mel, subjek, badan mesej, lampiran, dsb. -
Gunakannya
javax.mail.Transport
untuk menghantar e-mel dengan memanggil kaedah statiksend(email)
, di mana e-mel boleh menjadi objekMimeMessage
.
Session
berbeza bergantung pada jenis pelayan SMTP, contohnya, jika anda menggunakan pelayan SMTP yang tidak memerlukan sebarang pengesahan, anda boleh mencipta objek Session
dengan 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 TO
menggunakan Message.RecipientType.TO
, ke medan CC
menggunakan Message.RecipientType.CC
dan 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: connect
Ia 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 dipanggilNoClassDefFoundError
, 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
GO TO FULL VERSION