שליחת אימייל מאפליקציית Java היא דרישה נפוצה. זה לא משנה אם אתה עובד על אפליקציית Java ליבה, אפליקציית אינטרנט או אפליקציית Java ארגונית, ייתכן שתצטרך לשלוח דוא"ל כדי להתריע בפני צוות התמיכה על שגיאות, או פשוט לשלוח דוא"ל למשתמשים עם ההרשמה, אפס את הסיסמה שלהם, או בקש מהם לאשר את כתובת הדוא"ל לאחר ההרשמה. ישנם תרחישים רבים שבהם אתה צריך את היכולת לשלוח מיילים מאפליקציית Java. באפליקציות מוכנות כבר יש לך מודול או ספריה שעובדים עם כל התכונות לשליחת מיילים, כמו למשל היכולת לשלוח קבצים מצורפים, תמונות, כולל חתימות וטקסט עשיר במיילים, אבל אם אתה צריך לכתוב משהו מאפס, אז Java Mail API היא אפשרות מצוינת. במאמר זה נלמד כיצד לשלוח מיילים מאפליקציית Java באמצעות ה-API של הדואר ( javax.mail ). לפני כתיבת קוד, עליך לדעת כמה עקרונות בסיסיים של אופן פעולת הדוא"ל, לדוגמה אתה צריך שרת SMTP (Simple Mail Transfer Protocol) . אם אתה מפעיל את אפליקציית Java שלך על לינוקס, אז אתה צריך לדעת שהדמון SMTP משתמש ביציאה 25. אתה יכול להשתמש בכל שרת דואר כדי לשלוח הודעות באמצעות Java, כולל שרתי דואר ציבוריים כגון GMail, Yahoo או כל ספק שירות אחר, הכל אתה צריך זה פרטי שרת ה-SMTP שלהם , כגון שם מארח, יציאה, פרמטרי חיבור וכו'. אתה יכול גם להשתמש ב-SSL ( שכבת שקעים מאובטחת ), TLS ( Transport Layer Security ) כדי להתחבר ולשלוח מיילים בצורה מאובטחת, אבל הפכנו את הדוגמה הזו לפשוטה והתמקדנו בהיגיון מינימלי לשליחת מכתבים מאפליקציית Java. במאמרים הבאים נלמד כיצד לשלוח מייל באמצעות קבצים מצורפים, כיצד לשלוח מייל בפורמט HTML, כיצד לצרף תמונות למייל, כיצד להשתמש באימות SSL כדי להתחבר לשרת ה-GMail ולשלוח מיילים וכו'. כעת, בואו נבין (לדון) את הדוגמה הפשוטה הזו של Java Mail API .
קוד Java לדוגמה לשליחת אימייל
כדי לשלוח מכתב מתוכנית 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.-
צור אובייקט
Session
על ידי קריאהSession.getDefaultInstance(properties)
, כאשרproperties
- מכיל את כל המאפיינים החשובים, למשל, שם המארח של שרת ה-SMTP. -
צור אובייקט
MimeMessage
על ידי העברת האובייקטSession
שהתקבל בשלב הקודם. יש לנו קבוצה של מאפיינים שונים באובייקט זה כגון נמען דוא"ל, נושא, גוף הודעה, קבצים מצורפים וכו'. -
השתמש בו
javax.mail.Transport
כדי לשלוח דוא"ל על ידי קריאה לשיטה סטטיתsend(email)
, שבה דוא"ל יכול להיות אובייקטMimeMessage
.
Session
שונה בהתאם לסוג שרת ה-SMTP, לדוגמה, אם אתה משתמש בשרת SMTP שאינו דורש שום אימות, תוכל ליצור אובייקט Session
עם מאפיין אחד בלבד, לדוגמה, smtp .mail.host, ואין צורך לציין את היציאה כי יש לה יציאה 25 כברירת מחדל. מצד שני, אם אתה מתחבר לשרת SMTP שדורש אימות TLS או SSL, כמו SMTP Host של 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(); }
}
}
פלט: אתה יכול להרכיב ולהפעיל את התוכנית הזו כדי לשלוח דוא"ל פשוט מתוכנת Java:
$ 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 מקומי בלינוקס. אם תפעיל תוכנית זו רק עם 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 שגוי. למרות שהיו לי את כל שלושת ה-JARs הנדרשים, קובץ Java class עבור התוכנית באותה ספרייה, והרצתי את התוכנית משם, Java לא הצליחה להבין את זה. ניסיתי את הפקודות הבאות והתוכנית עבדה מצוין:
java -cp mail-1.4.5.jar:smtp-1.4.4.jar:activation-1.1.jar:. JavaMailSender
דוא"ל נשלח בהצלחה.... שימו לב שהספרייה הנוכחית מסומנת בנקודה בסוף הארגומנט Classpath. מכיוון שהרצתי את התוכנית בלינוקס, השתמשתי בנקודתיים (:) במקום נקודה-פסיק (;) (כמו ב-Windows). זה הכל לגבי איך לשלוח דואר אלקטרוני מאפליקציית Java באמצעות ממשק ה-API של הדואר. אתה עשוי למצוא את זה מאוד פשוט, מכיוון שאתה לא צריך יותר משלושה קבצי JAR. זה הרבה יותר קל אם אתה משתמש ב- Gradle או Maven כדי לנהל תלות. במדריכים הבאים נראה דוגמאות מורכבות יותר של Java Mail API לשליחת מיילים עם קבצים מצורפים, עם תמונות ומיילים מעוצבים להפליא לשליחת דוחות וטבלאות. תרגום המאמר: כיצד לשלוח דואר אלקטרוני מתוכנית Java עם דוגמה
GO TO FULL VERSION