JavaRush /Блоги Java /Random-TG /Чӣ тавр фиристодани почтаи электронӣ аз барномаи Java (бо...
PodoBulge
Сатҳи
Минск

Чӣ тавр фиристодани почтаи электронӣ аз барномаи Java (бо мисол)

Дар гурӯҳ нашр шудааст
Фиристодани почтаи электронӣ аз барномаи Java як талаботи маъмулист. Фарқ надорад, ки шумо дар як замимаи асосии Java, веб-барнома ё барномаи корпоративии Java кор карда истодаед, ба шумо лозим меояд, ки почтаи электронӣ фиристед, то кормандони дастгирииро дар бораи хатогиҳо огоҳ созед ё танҳо ҳангоми бақайдгирӣ ба корбарон паёми электронӣ фиристед, пароли худро аз нав танзим кунед ё аз онҳо хоҳиш кунед, ки суроғаи почтаи электрониро пас аз бақайдгирӣ тасдиқ кунанд. Сенарияҳои зиёде мавҷуданд, ки ба шумо қобorяти фиристодани паёмҳои электронӣ аз барномаи Java лозим аст. Чӣ тавр фиристодани почтаи электронӣ аз барномаи Java (бо мисол) - 1Дар замимаҳои омода шумо аллакай модул ё китобхона доред, ки бо тамоми хусусиятҳои ирсоли паёмҳои электронӣ кор мекунад, ба монанди қобorяти фиристодани замимаҳо, тасвирҳо, аз ҷумла имзоҳо ва матни бой дар почтаи электронӣ, АММО агар ба шумо лозим аст, ки чизе аз сифр нависед, пас Java Mail API як варианти олӣ аст. Дар ин мақола мо мефаҳмем, ки чӣ тавр фиристодани паёмҳои электронӣ аз барномаи Java бо истифода аз API mail ( javax.mail ). Пеш аз навиштани code шумо бояд баъзе асосҳои кори почтаи электрониро донед, масалан ба шумо serverи SMTP (Protocol Simple Mail Transfer Protocol) лозим аст . Агар шумо барномаи Java-и худро дар Linux иҷро карда истода бошед, пас шумо бояд бидонед, ки демони SMTP порти 25-ро истифода мебарад . Шумо метавонед ҳама гуна serverи почтаро барои ирсоли паёмҳо бо истифода аз Java истифода баред, аз ҷумла serverҳои почтаи ҷамъиятӣ ба монанди GMail, Yahoo ё ягон провайдери хидматрасон, ҳама ба шумо тафсилоти serverи SMTP-и онҳо лозим аст , ба монанди номи мизбон, порт, параметрҳои пайвастшавӣ ва ғайра. Шумо инчунин метавонед SSL ( қабати розеткаҳои бехатар ), TLS ( Қабати Амнияти Нақлиёт ) -ро барои пайваст шудан ва фиристодани мактубҳои электронӣ истифода баред, аммо мо ин мисолро содда кардем ва ба мантиқи ҳадди ақал барои фиристодани мактубҳо аз барномаи Java тамаркуз кардем. Дар мақолаҳои оянда мо мефаҳмем, ки чӣ тавр фиристодани почтаи электронӣ бо истифода аз замимаҳо, чӣ гуна фиристодани почтаи электронии формати HTML, чӣ гуна замима кардани тасвирҳо ба почтаи электронӣ, чӣ гуна истифода бурдани аутентификатсияи SSL барои пайвастшавӣ ба serverи 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 паёми электронӣ эҷод ва ирсол кунед.
  1. SessionТавассути занг задан an object эҷод кунед Session.getDefaultInstance(properties), ки дар он properties- дорои тамоми хосиятҳои муҳим, масалан, номи асосии serverи SMTP.

  2. Объектро MimeMessageтавассути интиқол додани an objectи Sessionдар қадами қаблӣ гирифташуда эҷод кунед. Мо дар ин an object маҷмӯи хосиятҳои гуногун дорем, ба монанди қабулкунандаи почтаи электронӣ, мавзӯъ, матни паём, замимаҳо ва ғайра.

  3. Онро javax.mail.Transportбарои фиристодани паёми электронӣ тавассути занг задан ба усули статикӣ истифода баред send(email), ки дар он почтаи электронӣ an object буда метавонад MimeMessage.

Миқдори хосиятҳое, ки шумо барои сохтани an object мегузаред, Sessionвобаста ба намуди serverи SMTP фарқ мекунад, масалан, агар шумо serverи SMTP-ро истифода баред, ки ягон аутентификатсияро талаб намекунад, шумо метавонед an objectро Sessionтанҳо бо як хосият эҷод кунед, масалан, smtp .mail.host, ва ба шумо лозим нест, ки портро муайян кунед, зеро он бо нобаёнӣ порти 25 дорад. Аз тарафи дигар, агар шумо ба serverи SMTP пайваст шуда бошед, ки тасдиқи TLS ё SSL-ро талаб мекунад, ба монанди хости SMTP-и GMail, шумо бояд хосиятҳои каме бештареро пешниҳод кунед, ба монанди mail.smtp.port=547 барои TLS ва почта. smtp.port= 457 барои SSL. Ин як барномаи мукаммали Java мебошад, ки ба serverи стандартии 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 хеле осон аст. Вақте ки шумо an objectро эҷод кардед 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 кифоя хоҳанд буд, ки ин тавр нест. хусусан агар шумо тавассути serverи маҳаллии 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Он одатан ҳангоми кор накардани server ё бандаре, ки шумо ба он пайваст мешавед, нодуруст нишон дода шудааст, вайрон мешавад. Ҳалли: Илова ба 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)
Ҳалли: Ман тавонистам мушкor худро ҳал кунам, ин аз сабаби нодурусти 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 бо истифода аз почтаи API мебошад. Шумо метавонед инро хеле содда ёбед, зеро ба шумо зиёда аз се файли JAR чизе лозим нест. Агар шумо барои идоракунии вобастагӣ Gradle ё Maven истифода баред, ин хеле осонтар аст. Дар дарсҳои зерин мо намунаҳои мураккаби Java Mail API-ро барои ирсоли паёмҳои электронӣ бо замимаҳо, тасвирҳо ва почтаи зебо форматонидашуда барои ирсоли гузоришҳо ва ҷадвалҳо мебинем. Тарҷумаи мақола: Чӣ тавр фиристодани почтаи электронӣ аз барномаи Java бо мисол
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION