Maison  >  Article  >  Java  >  Explication détaillée sur la façon d'envoyer des images et des pièces jointes et de recevoir des e-mails à l'aide de JavaMail

Explication détaillée sur la façon d'envoyer des images et des pièces jointes et de recevoir des e-mails à l'aide de JavaMail

黄舟
黄舟original
2017-10-16 09:56:311844parcourir

Cet article présente principalement en détail la mise en œuvre de l'envoi et de la réception d'e-mails avec des images et des pièces jointes dans JavaMail. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

D'accord, entrez ceci C'est le plus important. étape de la série de tutoriels. Nous comprenons tous les connaissances théoriques sur les e-mails dans l'article précédent, donc dans ce blog nous utiliserons du code pour compléter l'envoi d'e-mails. Ceci est largement utilisé dans les projets réels. Par exemple, l'inscription nécessite l'envoi d'un e-mail pour l'activation du compte. Un autre exemple est l'utilisation d'e-mails pour les rappels de tâches dans les projets OA. Ce dont nous parlons ici, c'est d'utiliser JavaMail pour compléter les fonctions d'envoi et de réception d'e-mails.

PS : Lien de téléchargement du code source de ce blog : https://github.com/YSOcean/cnblogs

1.Introduction à JavaMail

JavaMail est Sun Corporation (maintenant acquis par Oracle) qui fournit un ensemble de kits de développement standard pour permettre aux développeurs Java d'implémenter des fonctions d'envoi et de réception d'e-mails dans les applications. Il prend en charge certains protocoles de messagerie couramment utilisés, tels que SMTP et POP3 mentionnés précédemment. , MIME, etc. Lorsque nous utilisons l'API JavaMail pour écrire des e-mails, nous n'avons pas besoin de prendre en compte les détails d'implémentation sous-jacents de l'e-mail. Il nous suffit d'appeler la classe API correspondante dans le kit de développement JavaMail.

Adresse de téléchargement JavaMail : https://github.com/javaee/javamail/releases 

Téléchargez cette version de JavaMail, y compris SMTP, IMAP et mise en œuvre du protocole POP3.

2. API JavaMail

L'API JavaMail peut être divisée en trois catégories suivantes selon ses fonctions :

 ①, API de création et d'analyse. emails

 ②、API pour l'envoi d'e-mails

 ③、API pour la réception d'e-mails

  Les trois types d'API ci-dessus sont composés de plusieurs classes dans JavaMail, mais il y en a principalement quatre classes principales , lorsque nous écrivons un programme, nous pouvons facilement écrire un programme de traitement de courrier Java en nous souvenant de ces quatre classes principales.

 ①, Classe Message : javax.mail.La classe Message est l'API principale pour la création et l'analyse des e-mails. Il s'agit d'une classe abstraite, et sa sous-classe javax.mail est généralement. utilisé.classe .internet.MimeMessage. Son objet instance représente un e-mail. Lorsque le programme client envoie un e-mail, il utilise d'abord l'API JavaMail qui crée l'e-mail pour créer un objet Message qui encapsule les données de l'e-mail, puis transmet cet objet à l'API d'envoi d'e-mail (classe Transport) pour l'envoi. Lorsque le programme client reçoit du courrier, l'API de réception de courrier encapsule les données de courrier reçues dans une instance de la classe Message. Le programme client utilise l'API d'analyse du courrier pour analyser les données de courrier reçues à partir de cet objet.

 ②. Classe de transport : la classe javax.mail.Transport est la classe API principale pour l'envoi de courrier. Son objet d'instance représente l'objet d'envoi de courrier qui implémente un certain protocole d'envoi de courrier, tel que le protocole SMTP. crée Après avoir obtenu l'objet Message, il vous suffit d'utiliser l'API d'envoi de courrier pour obtenir l'objet Transport, puis de transmettre l'objet Message à l'objet Transport et d'appeler sa méthode d'envoi pour envoyer le courrier au serveur SMTP spécifié.

 ③.Classe Store : la classe javax.mail.Store est la classe API principale pour la réception du courrier. Son objet d'instance représente un objet de réception de courrier qui implémente un certain protocole de réception de courrier, tel que le protocole POP3. reçoit Lors de la réception du courrier, il vous suffit d'utiliser l'API de réception de courrier pour obtenir l'objet Store, puis d'appeler la méthode de réception de l'objet Store pour obtenir les données de courrier du serveur POP3 spécifié et d'encapsuler les données de courrier dans l'objet Message représentant le courrier.

 ④. Classe de session : la classe javax.mail.Session est utilisée pour définir les informations d'environnement requises par l'ensemble de l'application et pour collecter des informations de session pour que le client établisse une connexion réseau avec le serveur de messagerie, telles que le nom d'hôte du serveur de messagerie, le numéro de port, le protocole d'envoi et de réception d'e-mails utilisé, etc. L'objet Session crée des objets Transport et Store pour l'envoi et la réception d'e-mails en fonction de ces informations, et fournit une prise en charge des informations lors de la création d'objets Message pour le client.

3. Utilisez JavaMail pour envoyer des e-mails simples en texte brut

En comprenant le code suivant pour envoyer des e-mails, nous pouvons imaginer envoyer des e-mails comme une fusée transportant l'envoi satellite. Parmi eux, Message est un satellite et Transport est une fusée. La construction de satellites et de fusées nécessite l'aide de Session. Cette relation est plus facile à retenir.


package com.ys.mail;
 
import java.io.ObjectInputStream.GetField;
import java.util.Date;
import java.util.Properties;
 
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.swing.text.html.MinimalHTMLWriter;
 
public class SendMailText {
 //发件人地址
 public static String senderAddress = "xxx@163.com";
 //收件人地址
 public static String recipientAddress = "xxx@qq.com";
 //发件人账户名
 public static String senderAccount = "xxx";
 //发件人账户密码
 public static String senderPassword = "xxx";
 
 public static void main(String[] args) throws Exception {
 //1、连接邮件服务器的参数配置
 Properties props = new Properties();
 //设置用户的认证方式
 props.setProperty("mail.smtp.auth", "true");
 //设置传输协议
 props.setProperty("mail.transport.protocol", "smtp");
 //设置发件人的SMTP服务器地址
 props.setProperty("mail.smtp.host", "smtp.163.com");
 //2、创建定义整个应用程序所需的环境信息的 Session 对象
 Session session = Session.getInstance(props);
 //设置调试信息在控制台打印出来
 session.setDebug(true);
 //3、创建邮件的实例对象
 Message msg = getMimeMessage(session);
 //4、根据session对象获取邮件传输对象Transport
 Transport transport = session.getTransport();
 //设置发件人的账户名和密码
 transport.connect(senderAccount, senderPassword);
 //发送邮件,并发送到所有收件人地址,message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
 transport.sendMessage(msg,msg.getAllRecipients());
  
 //如果只想发送给指定的人,可以如下写法
 //transport.sendMessage(msg, new Address[]{new InternetAddress("xxx@qq.com")});
  
 //5、关闭邮件连接
 transport.close();
 }
 
 /**
 * 获得创建一封邮件的实例对象
 * @param session
 * @return
 * @throws MessagingException
 * @throws AddressException
 */
 public static MimeMessage getMimeMessage(Session session) throws Exception{
 //创建一封邮件的实例对象
 MimeMessage msg = new MimeMessage(session);
 //设置发件人地址
 msg.setFrom(new InternetAddress(senderAddress));
 /**
  * 设置收件人地址(可以增加多个收件人、抄送、密送),即下面这一行代码书写多行
  * MimeMessage.RecipientType.TO:发送
  * MimeMessage.RecipientType.CC:抄送
  * MimeMessage.RecipientType.BCC:密送
  */
 msg.setRecipient(MimeMessage.RecipientType.TO,new InternetAddress(recipientAddress));
 //设置邮件主题
 msg.setSubject("邮件主题","UTF-8");
 //设置邮件正文
 msg.setContent("简单的纯文本邮件!", "text/html;charset=UTF-8");
 //设置邮件的发送时间,默认立即发送
 msg.setSentDate(new Date());
  
 return msg;
 }
 
}

Le code ci-dessus contient des commentaires détaillés. Si vous ne comprenez pas, vous pouvez laisser un message. Remarque : Veuillez modifier le destinataire, l'expéditeur et d'autres informations par les vôtres lors de l'exécution.

Après avoir exécuté le code ci-dessus, nous vérifions ensuite la boîte de réception :

Ensuite, un simple fichier texte brut a été envoyé.

4. Problèmes d'envoi d'e-mails

 ① : certains e-mails ont des mots de passe distincts et d'autres doivent se connecter avec un code d'autorisation. (qq mailbox), qui est présenté dans le blog Expérience manuelle des protocoles SMTP et pop3.

  ②、发件人的SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。

  ③、有可能你收件人地址,发件人地址等信息都正确了,控制台也打印了正确的信息,但是在收件箱就是收不到信息。这是因为可能收件箱服务器拒收了你发的邮件(比如认为你的邮件是广告),这时候可能在垃圾箱里能找到,可能找不到。解决办法是重复的邮件内容不要多次发送,或者更换收件箱试试。

  ④、本实例使用的是JavaMail1.6版本,支持的JDK必须是jdk1.7版本!!!

 5、使用 JavaMail 接收邮件

  由于接收邮件的用处不多,这里我们就简单的给出一个实例:


package com.ys.mail;
 
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;
 
public class RecipientMail {
 //收件人地址
 public static String recipientAddress = "xxx@163.com";
 //收件人账户名
 public static String recipientAccount = "xxx";
 //收件人账户密码
 public static String recipientPassword = "xxx";
 
 public static void main(String[] args) throws Exception {
 //1、连接邮件服务器的参数配置
 Properties props = new Properties();
 //设置传输协议
 props.setProperty("mail.store.protocol", "pop3");
 //设置收件人的POP3服务器
 props.setProperty("mail.pop3.host", "pop3.163.com");
 //2、创建定义整个应用程序所需的环境信息的 Session 对象
 Session session = Session.getInstance(props);
 //设置调试信息在控制台打印出来
 //session.setDebug(true);
  
 Store store = session.getStore("pop3");
 //连接收件人POP3服务器
 store.connect("pop3.163.com", recipientAccount, recipientPassword);
 //获得用户的邮件账户,注意通过pop3协议获取某个邮件夹的名称只能为inbox
 Folder folder = store.getFolder("inbox");
 //设置对邮件账户的访问权限
 folder.open(Folder.READ_WRITE);
  
 //得到邮件账户的所有邮件信息
 Message [] messages = folder.getMessages();
 for(int i = 0 ; i < messages.length ; i++){
  //获得邮件主题
  String subject = messages[i].getSubject();
  //获得邮件发件人
  Address[] from = messages[i].getFrom();
  //获取邮件内容(包含邮件内容的html代码)
  String content = (String) messages[i].getContent();
 }
  
 //关闭邮件夹对象
 folder.close();
 //关闭连接对象
 store.close();
 }
 
}

6、使用 JavaMail 发送带图片、附件的邮件

我们先看项目结构,在src目录下包含图片和附件:

然后看代码:


package com.ys.mail;
 
import java.util.Date;
import java.util.Properties;
 
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
 
public class SendMailText_Picture_Enclosure {
 //发件人地址
 public static String senderAddress = "xxx@163.com";
 //收件人地址
 public static String recipientAddress = "xxx@qq.com";
 //发件人账户名
 public static String senderAccount = "xxx";
 //发件人账户密码
 public static String senderPassword = "xxx";
 
 public static void main(String[] args) throws Exception {
 //1、连接邮件服务器的参数配置
 Properties props = new Properties();
 //设置用户的认证方式
 props.setProperty("mail.smtp.auth", "true");
 //设置传输协议
 props.setProperty("mail.transport.protocol", "smtp");
 //设置发件人的SMTP服务器地址
 props.setProperty("mail.smtp.host", "smtp.163.com");
 //2、创建定义整个应用程序所需的环境信息的 Session 对象
 Session session = Session.getInstance(props);
 //设置调试信息在控制台打印出来
 session.setDebug(true);
 //3、创建邮件的实例对象
 Message msg = getMimeMessage(session);
 //4、根据session对象获取邮件传输对象Transport
 Transport transport = session.getTransport();
 //设置发件人的账户名和密码
 transport.connect(senderAccount, senderPassword);
 //发送邮件,并发送到所有收件人地址,message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
 transport.sendMessage(msg,msg.getAllRecipients());
  
 //5、关闭邮件连接
 transport.close();
 }
 
 /**
 * 获得创建一封邮件的实例对象
 * @param session
 * @return
 * @throws MessagingException
 * @throws AddressException
 */
 public static MimeMessage getMimeMessage(Session session) throws Exception{
 //1.创建一封邮件的实例对象
 MimeMessage msg = new MimeMessage(session);
 //2.设置发件人地址
 msg.setFrom(new InternetAddress(senderAddress));
 /**
  * 3.设置收件人地址(可以增加多个收件人、抄送、密送),即下面这一行代码书写多行
  * MimeMessage.RecipientType.TO:发送
  * MimeMessage.RecipientType.CC:抄送
  * MimeMessage.RecipientType.BCC:密送
  */
 msg.setRecipient(MimeMessage.RecipientType.TO,new InternetAddress(recipientAddress));
 //4.设置邮件主题
 msg.setSubject("邮件主题(包含图片和附件)","UTF-8");
  
 //下面是设置邮件正文
 //msg.setContent("简单的纯文本邮件!", "text/html;charset=UTF-8");
  
 // 5. 创建图片"节点"
 MimeBodyPart image = new MimeBodyPart();
 // 读取本地文件
 DataHandler dh = new DataHandler(new FileDataSource("src\\mailTestPic.png"));
 // 将图片数据添加到"节点"
 image.setDataHandler(dh);
 // 为"节点"设置一个唯一编号(在文本"节点"将引用该ID)
 image.setContentID("mailTestPic"); 
  
 // 6. 创建文本"节点"
 MimeBodyPart text = new MimeBodyPart();
 // 这里添加图片的方式是将整个图片包含到邮件内容中, 实际上也可以以 http 链接的形式添加网络图片
 text.setContent("这是一张图片<br/><a href=&#39;http://www.cnblogs.com/ysocean/p/7666061.html&#39;><img src=&#39;cid:mailTestPic&#39;/></a>", "text/html;charset=UTF-8");
  
 // 7. (文本+图片)设置 文本 和 图片"节点"的关系(将 文本 和 图片"节点"合成一个混合"节点")
 MimeMultipart mm_text_image = new MimeMultipart();
 mm_text_image.addBodyPart(text);
 mm_text_image.addBodyPart(image);
 mm_text_image.setSubType("related"); // 关联关系
  
 // 8. 将 文本+图片 的混合"节点"封装成一个普通"节点"
 // 最终添加到邮件的 Content 是由多个 BodyPart 组成的 Multipart, 所以我们需要的是 BodyPart,
 // 上面的 mailTestPic 并非 BodyPart, 所有要把 mm_text_image 封装成一个 BodyPart
 MimeBodyPart text_image = new MimeBodyPart();
 text_image.setContent(mm_text_image);
  
 // 9. 创建附件"节点"
 MimeBodyPart attachment = new MimeBodyPart();
 // 读取本地文件
 DataHandler dh2 = new DataHandler(new FileDataSource("src\\mailTestDoc.docx"));
 // 将附件数据添加到"节点"
 attachment.setDataHandler(dh2);
 // 设置附件的文件名(需要编码)
 attachment.setFileName(MimeUtility.encodeText(dh2.getName())); 
  
 // 10. 设置(文本+图片)和 附件 的关系(合成一个大的混合"节点" / Multipart )
 MimeMultipart mm = new MimeMultipart();
 mm.addBodyPart(text_image);
 mm.addBodyPart(attachment); // 如果有多个附件,可以创建多个多次添加
 mm.setSubType("mixed");  // 混合关系
 
 // 11. 设置整个邮件的关系(将最终的混合"节点"作为邮件的内容添加到邮件对象)
 msg.setContent(mm);
 //设置邮件的发送时间,默认立即发送
 msg.setSentDate(new Date());
  
 return msg;
 }
 
}

执行程序后,我们查看邮箱:

那么一封包含图片(点击图片跳转到指定超链接),和附件的邮件就生成了。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn