Shembull JavaMail - Dërgoni Mail në Java duke përdorur SMTP
Sot do të shqyrtojmë Shembullin JavaMail për të dërguar email në programet java. Dërgimi i emaileve është një nga detyrat e zakonshme në aplikacionet e jetës reale dhe kjo është arsyeja pse Java ofron JavaMail API të fuqishme që mund ta përdorim për të dërguar email duke përdorur serverin SMTP. JavaMail API mbështet vërtetimin TLS dhe SSL për dërgimin e emaileve.
Shembull JavaMail
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.5</version>
</dependency>
Programi Java për të dërguar email përmban hapat e mëposhtëm:
- Krijohet objekti
javax.mail.Session
- Duke krijuar objektin
javax.mail.internet.MimeMessage
, ne duhet të vendosim veçori të ndryshme në këtë objekt, si adresën e emailit të marrësit, subjektin e emailit, përgjigjen-e-mail, trupin e emailit, bashkëngjitjet etj.< /li> - Përdorimi i
javax.mail.Transport
për të dërguar mesazhin e emailit.
Logjika për të krijuar sesion ndryshon në bazë të llojit të serverit SMTP, për shembull nëse serveri SMTP nuk kërkon ndonjë vërtetim, ne mund të krijojmë objektin Session me disa veti të thjeshta, ndërsa nëse kërkon vërtetim TLS ose SSL, atëherë logjika për të krijuar do të ndryshojë. . Kështu që unë do të krijoj një klasë të shërbimeve me disa metoda ndihmëse për të dërguar email dhe më pas do ta përdor këtë metodë të shërbimeve me serverë të ndryshëm SMTP.
Program Shembull JavaMail
Klasa jonë EmailUtil që ka një metodë të vetme për të dërguar email duket si më poshtë, kërkon javax.mail.Session dhe disa fusha të tjera të kërkuara si argumente. Për ta mbajtur të thjeshtë, disa nga argumentet janë të koduar me vështirësi, por ju mund ta zgjeroni këtë metodë për t'i kaluar ato ose për ta lexuar atë nga disa skedarë konfigurimi.
package com.journaldev.mail;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
public class EmailUtil {
/**
* Utility method to send simple HTML email
* @param session
* @param toEmail
* @param subject
* @param body
*/
public static void sendEmail(Session session, String toEmail, String subject, String body){
try
{
MimeMessage msg = new MimeMessage(session);
//set message headers
msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
msg.addHeader("format", "flowed");
msg.addHeader("Content-Transfer-Encoding", "8bit");
msg.setFrom(new InternetAddress("no_reply@example.com", "NoReply-JD"));
msg.setReplyTo(InternetAddress.parse("no_reply@example.com", false));
msg.setSubject(subject, "UTF-8");
msg.setText(body, "UTF-8");
msg.setSentDate(new Date());
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
System.out.println("Message is ready");
Transport.send(msg);
System.out.println("EMail Sent Successfully!!");
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Vini re se po vendos disa veti të kokës në MimeMessage, ato përdoren nga klientët e emailit për të dhënë dhe shfaqur siç duhet mesazhin e emailit. Pjesa tjetër e programit është e thjeshtë dhe e kuptueshme vetë. Tani le të krijojmë programin tonë për të dërguar email pa vërtetim.
Dërgoni Mail në Java duke përdorur SMTP pa vërtetim
package com.journaldev.mail;
import java.util.Properties;
import javax.mail.Session;
public class SimpleEmail {
public static void main(String[] args) {
System.out.println("SimpleEmail Start");
String smtpHostServer = "smtp.example.com";
String emailID = "email_me@example.com";
Properties props = System.getProperties();
props.put("mail.smtp.host", smtpHostServer);
Session session = Session.getInstance(props, null);
EmailUtil.sendEmail(session, emailID,"SimpleEmail Testing Subject", "SimpleEmail Testing Body");
}
}
Vini re se po përdor Session.getInstance() për të marrë objektin Session duke kaluar objektin Properties. Duhet të vendosim veçorinë mail.smtp.host me hostin e serverit SMTP. Nëse serveri SMTP nuk funksionon në portën e paracaktuar (25), atëherë do t'ju duhet gjithashtu të vendosni veçorinë mail.smtp.port. Thjesht drejtojeni këtë program me serverin tuaj SMTP pa vërtetim dhe duke vendosur ID-në e emailit të marrësit si ID-në tuaj të emailit dhe do ta merrni emailin brenda një kohe të shkurtër. Programi është i thjeshtë për t'u kuptuar dhe funksionon mirë, por në jetën reale shumica e serverëve SMTP përdorin një lloj vërtetimi të tillë si vërtetimi TLS ose SSL. Pra, tani do të shohim se si të krijojmë objektin Session për këto protokolle vërtetimi.
Dërgo email në Java SMTP me Autentifikimin TLS
package com.journaldev.mail;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
public class TLSEmail {
/**
Outgoing Mail (SMTP) Server
requires TLS or SSL: smtp.gmail.com (use authentication)
Use Authentication: Yes
Port for TLS/STARTTLS: 587
*/
public static void main(String[] args) {
final String fromEmail = "myemailid@gmail.com"; //requires valid gmail id
final String password = "mypassword"; // correct password for gmail id
final String toEmail = "myemail@yahoo.com"; // can be any email id
System.out.println("TLSEmail Start");
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com"); //SMTP Host
props.put("mail.smtp.port", "587"); //TLS Port
props.put("mail.smtp.auth", "true"); //enable authentication
props.put("mail.smtp.starttls.enable", "true"); //enable STARTTLS
//create Authenticator object to pass in Session.getInstance argument
Authenticator auth = new Authenticator() {
//override the getPasswordAuthentication method
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(fromEmail, password);
}
};
Session session = Session.getInstance(props, auth);
EmailUtil.sendEmail(session, toEmail,"TLSEmail Testing Subject", "TLSEmail Testing Body");
}
}
Meqenëse jam duke përdorur serverin GMail SMTP që është i aksesueshëm për të gjithë, mund të vendosni variablat e duhura në programin e mësipërm dhe të ekzekutoni vetë. Më besoni funksionon!! :)
Java SMTP Shembull me Autentifikimin SSL
package com.journaldev.mail;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
public class SSLEmail {
/**
Outgoing Mail (SMTP) Server
requires TLS or SSL: smtp.gmail.com (use authentication)
Use Authentication: Yes
Port for SSL: 465
*/
public static void main(String[] args) {
final String fromEmail = "myemailid@gmail.com"; //requires valid gmail id
final String password = "mypassword"; // correct password for gmail id
final String toEmail = "myemail@yahoo.com"; // can be any email id
System.out.println("SSLEmail Start");
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com"); //SMTP Host
props.put("mail.smtp.socketFactory.port", "465"); //SSL Port
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory"); //SSL Factory Class
props.put("mail.smtp.auth", "true"); //Enabling SMTP Authentication
props.put("mail.smtp.port", "465"); //SMTP Port
Authenticator auth = new Authenticator() {
//override the getPasswordAuthentication method
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(fromEmail, password);
}
};
Session session = Session.getDefaultInstance(props, auth);
System.out.println("Session created");
EmailUtil.sendEmail(session, toEmail,"SSLEmail Testing Subject", "SSLEmail Testing Body");
EmailUtil.sendAttachmentEmail(session, toEmail,"SSLEmail Testing Subject with Attachment", "SSLEmail Testing Body with Attachment");
EmailUtil.sendImageEmail(session, toEmail,"SSLEmail Testing Subject with Image", "SSLEmail Testing Body with Image");
}
}
Programi është pothuajse i njëjtë me vërtetimin TLS, vetëm disa veti janë të ndryshme. Siç mund ta shihni që unë po thërras disa metoda të tjera nga klasa EmailUtil për të dërguar bashkëngjitjen dhe imazhin në email, por nuk i kam përcaktuar ende. Në fakt i mbajta për t'i treguar më vonë dhe për ta mbajtur të thjeshtë në fillim të tutorialit.
Shembull JavaMail - dërgoni postë në java me bashkëngjitje
Për të dërguar një skedar si bashkëngjitje, duhet të krijojmë një objekt të javax.mail.internet.MimeBodyPart
dhe javax.mail.internet.MimeMultipart
. Fillimisht shtoni pjesën e trupit për mesazhin me tekst në email dhe më pas përdorni FileDataSource për të bashkangjitur skedarin në pjesën e dytë të trupit me shumë pjesë. Metoda duket si më poshtë.
/**
* Utility method to send email with attachment
* @param session
* @param toEmail
* @param subject
* @param body
*/
public static void sendAttachmentEmail(Session session, String toEmail, String subject, String body){
try{
MimeMessage msg = new MimeMessage(session);
msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
msg.addHeader("format", "flowed");
msg.addHeader("Content-Transfer-Encoding", "8bit");
msg.setFrom(new InternetAddress("no_reply@example.com", "NoReply-JD"));
msg.setReplyTo(InternetAddress.parse("no_reply@example.com", false));
msg.setSubject(subject, "UTF-8");
msg.setSentDate(new Date());
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
// Create the message body part
BodyPart messageBodyPart = new MimeBodyPart();
// Fill the message
messageBodyPart.setText(body);
// Create a multipart message for attachment
Multipart multipart = new MimeMultipart();
// Set text message part
multipart.addBodyPart(messageBodyPart);
// Second part is attachment
messageBodyPart = new MimeBodyPart();
String filename = "abc.txt";
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
// Send the complete message parts
msg.setContent(multipart);
// Send message
Transport.send(msg);
System.out.println("EMail Sent Successfully with attachment!!");
}catch (MessagingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
Programi mund të duket kompleks në pamje të parë, por është i thjeshtë, thjesht krijoni një pjesë të trupit për mesazhe me tekst dhe një pjesë tjetër të trupit për bashkëngjitje dhe më pas shtoni ato në shumë pjesë. Ju mund ta zgjeroni këtë metodë për të bashkangjitur gjithashtu shumë skedarë.
Shembull JavaMail - dërgoni postë në java me imazh
Meqenëse mund të krijojmë mesazhe trupore HTML, nëse skedari i imazhit ndodhet në ndonjë vendndodhje serveri, mund të përdorim elementin img për t'i shfaqur ato në mesazh. Por ndonjëherë ne duam të bashkangjisim imazhin në email dhe më pas ta përdorim atë në vetë trupin e emailit. Ju duhet të keni parë kaq shumë email që kanë bashkëngjitje imazhesh dhe përdoren gjithashtu në mesazhin e emailit. Truku është të bashkëngjitni skedarin e imazhit si çdo bashkëngjitje tjetër dhe më pas të vendosni titullin Content-ID për skedarin e imazhit dhe më pas të përdorni të njëjtën ID të përmbajtjes në trupin e mesazhit të emailit me .
/**
* Utility method to send image in email body
* @param session
* @param toEmail
* @param subject
* @param body
*/
public static void sendImageEmail(Session session, String toEmail, String subject, String body){
try{
MimeMessage msg = new MimeMessage(session);
msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
msg.addHeader("format", "flowed");
msg.addHeader("Content-Transfer-Encoding", "8bit");
msg.setFrom(new InternetAddress("no_reply@example.com", "NoReply-JD"));
msg.setReplyTo(InternetAddress.parse("no_reply@example.com", false));
msg.setSubject(subject, "UTF-8");
msg.setSentDate(new Date());
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
// Create the message body part
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText(body);
// Create a multipart message for attachment
Multipart multipart = new MimeMultipart();
// Set text message part
multipart.addBodyPart(messageBodyPart);
// Second part is image attachment
messageBodyPart = new MimeBodyPart();
String filename = "image.png";
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
//Trick is to add the content-id header here
messageBodyPart.setHeader("Content-ID", "image_id");
multipart.addBodyPart(messageBodyPart);
//third part for displaying image in the email body
messageBodyPart = new MimeBodyPart();
messageBodyPart.setContent("<h1>Attached Image</h1>" +
"<img src='cid:image_id'>", "text/html");
multipart.addBodyPart(messageBodyPart);
//Set the multipart message to the email message
msg.setContent(multipart);
// Send message
Transport.send(msg);
System.out.println("EMail Sent Successfully with image!!");
}catch (MessagingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
Këshilla për zgjidhjen e problemeve të JavaMail API
-
java.net.UnknownHostException
comes when your system is not able to resolve the IP address for the SMTP server, it might be wrong or not accessible from your network. For example, GMail SMTP server is smtp.google.com, I will get this exception. If the hostname is correct, try to ping the server through command line to make sure it’s accessible from your system.pankaj@Pankaj:~/CODE$ ping smtp.gmail.com PING gmail-smtp-msa.l.google.com (74.125.129.108): 56 data bytes 64 bytes from 74.125.129.108: icmp_seq=0 ttl=46 time=38.308 ms 64 bytes from 74.125.129.108: icmp_seq=1 ttl=46 time=42.247 ms 64 bytes from 74.125.129.108: icmp_seq=2 ttl=46 time=38.164 ms 64 bytes from 74.125.129.108: icmp_seq=3 ttl=46 time=53.153 ms
-
If your program is stuck in Transport send() method call, check that SMTP port is correct. If it’s correct then use telnet to verify that it’s accessible from you machine, you will get output like below.
pankaj@Pankaj:~/CODE$ telnet smtp.gmail.com 587 Trying 2607:f8b0:400e:c02::6d... Connected to gmail-smtp-msa.l.google.com. Escape character is '^]'. 220 mx.google.com ESMTP sx8sm78485186pab.5 - gsmtp HELO 250 mx.google.com at your service
Kjo është e gjitha për shembull JavaMail për të dërguar postë në java duke përdorur serverin SMTP me protokolle të ndryshme vërtetimi, bashkëngjitje dhe imazhe. Shpresoj se do të zgjidhë të gjitha nevojat tuaja për dërgimin e emaileve në programet java.