Heim  >  Artikel  >  Java  >  Ausführliche Erklärung zum Senden von Bildern und Anhängen sowie zum Empfangen von E-Mails mit JavaMail

Ausführliche Erklärung zum Senden von Bildern und Anhängen sowie zum Empfangen von E-Mails mit JavaMail

黄舟
黄舟Original
2017-10-16 09:56:311838Durchsuche

Dieser Artikel stellt hauptsächlich die Implementierung des Sendens und Empfangens von E-Mails mit Bildern und Anhängen in JavaMail vor. Er hat einen bestimmten Referenzwert.

Okay, geben Sie dies ein. Das ist das Wichtigste Schritt in der Reihe von Tutorials Wir alle verstehen das theoretische Wissen über E-Mails im vorherigen Artikel, daher werden wir in diesem Blog Code verwenden, um das Versenden von E-Mails abzuschließen. Dies wird häufig in tatsächlichen Projekten verwendet. Für die Registrierung ist beispielsweise das Versenden von E-Mails zur Kontoaktivierung erforderlich. Weitere Beispiele sind die Verwendung von E-Mails für Aufgabenerinnerungen in OA-Projekten usw. Wir sprechen hier über die Verwendung von JavaMail, um die Sende- und Empfangsfunktionen von E-Mails zu vervollständigen.

PS: Download-Link für den Quellcode dieses Blogs: https://github.com/YSOcean/cnblogs

1. Einführung in JavaMail

JavaMail ist Sun (jetzt von Oracle übernommen) bietet eine Reihe von Standard-Entwicklungskits, um Java-Entwicklern die Implementierung von E-Mail-Sende- und Empfangsfunktionen in Anwendungen zu erleichtern. Es unterstützt einige häufig verwendete E-Mail-Protokolle, wie z. B. SMTP und POP3. MIME usw. Wenn wir die JavaMail-API zum Schreiben von E-Mails verwenden, müssen wir die zugrunde liegenden Implementierungsdetails der E-Mail nicht berücksichtigen. Wir müssen lediglich die entsprechende API-Klasse im JavaMail-Entwicklungskit aufrufen.

JavaMail-Download-Adresse: https://github.com/javaee/javamail/releases 

Laden Sie diese Version von JavaMail herunter, einschließlich SMTP, IMAP und Implementierung des POP3-Protokolls.

 ①, API zum Erstellen und Parsen E-Mails ②、API zum Senden von E-Mails

 ③、API zum Empfangen von E-Mails

  Die oben genannten drei Arten von APIs bestehen aus mehreren Klassen in JavaMail, es gibt jedoch hauptsächlich vier Kernklassen: Wenn wir ein Programm schreiben, können wir leicht ein Java-Mail-Verarbeitungsprogramm schreiben, indem wir uns diese vier Kernklassen merken.

 ①, Message-Klasse: javax.mail.Message-Klasse ist die Kern-API zum Erstellen und Parsen von E-Mails, und ihre Unterklasse ist normalerweise javax.mail verwendet. .internet.MimeMessage-Klasse. Sein Instanzobjekt repräsentiert eine E-Mail. Wenn das Clientprogramm eine E-Mail sendet, verwendet es zunächst die JavaMail-API, die die E-Mail erstellt, um ein Nachrichtenobjekt zu erstellen, das die E-Mail-Daten kapselt, und übergibt dieses Objekt dann zum Senden an die E-Mail-Versand-API (Transportklasse). Wenn das Client-Programm E-Mails empfängt, kapselt die E-Mail-Empfangs-API die empfangenen E-Mail-Daten in einer Instanz der Message-Klasse. Das Client-Programm verwendet die Mail-Parsing-API, um die empfangenen E-Mail-Daten von diesem Objekt zu analysieren.

 ②. Transportklasse: javax.mail.Transport-Klasse ist die Kern-API-Klasse zum Senden von E-Mails. Ihr Instanzobjekt stellt das E-Mail-Sendeobjekt dar, das ein bestimmtes E-Mail-Sendeprotokoll implementiert, z. B. das Client-Programm erstellt Nach dem Abrufen des Nachrichtenobjekts müssen Sie nur noch die E-Mail-Sende-API verwenden, um das Transportobjekt abzurufen, dann das Nachrichtenobjekt an das Transportobjekt übergeben und dessen Sendemethode aufrufen, um die E-Mail an den angegebenen SMTP-Server zu senden.

 ③. Die Klasse javax.mail.Store ist die Kern-API-Klasse zum Empfangen von E-Mails. Ihr Instanzobjekt stellt ein E-Mail-Empfangsobjekt dar, das ein bestimmtes E-Mail-Empfangsprotokoll implementiert empfängt Beim Empfangen von E-Mails müssen Sie nur die E-Mail-Empfangs-API verwenden, um das Store-Objekt abzurufen, und dann die Empfangsmethode des Store-Objekts aufrufen, um die E-Mail-Daten vom angegebenen POP3-Server abzurufen und die E-Mail-Daten in das darstellende Nachrichtenobjekt zu kapseln die Post.

 ④. Sitzungsklasse: javax.mail.Session-Klasse wird verwendet, um die von der gesamten Anwendung benötigten Umgebungsinformationen zu definieren und Sitzungsinformationen für den Client zu sammeln, um eine Netzwerkverbindung mit dem Mailserver herzustellen, z den Hostnamen des Mailservers, die Portnummer, das verwendete E-Mail-Sende- und Empfangsprotokoll usw. Das Sitzungsobjekt erstellt Transport- und Speicherobjekte zum Senden und Empfangen von E-Mails basierend auf diesen Informationen und bietet Informationsunterstützung beim Erstellen von Nachrichtenobjekten für den Client.

3. Verwenden Sie JavaMail, um einfache Nur-Text-E-Mails zu senden.

Wenn wir den folgenden Code zum Senden von E-Mails verstehen, können wir uns das Senden von E-Mails wie eine Rakete vorstellen, die den Satellitensender trägt. Unter ihnen ist Message ein Satellit und Transport eine Rakete. Der Bau von Satelliten und Raketen erfordert die Hilfe von Session.

Der obige Code enthält detaillierte Kommentare. Wenn Sie ihn nicht verstehen, können Sie eine Nachricht hinterlassen. Hinweis: Bitte ändern Sie beim Ausführen den Empfänger, den Absender und andere Informationen in Ihre eigenen.

Nachdem wir den obigen Code ausgeführt haben, überprüfen wir den Posteingang:

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;
 }
 
}

Anschließend wurde eine einfache Nur-Text-Datei gesendet.

Probleme beim Senden von E-Mails

 ① E-Mail-Kontoname und Passwort: Einige E-Mails haben separate Passwörter, andere müssen sich mit einem Autorisierungscode anmelden. qq-Postfach), das im Blog

Manuelle Erfahrung mit SMTP- und Pop3-Protokollen

vorgestellt wird.

  ②、发件人的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;
 }
 
}

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

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

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung zum Senden von Bildern und Anhängen sowie zum Empfangen von E-Mails mit JavaMail. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn