>  기사  >  Java  >  JavaMail을 이용하여 사진과 첨부파일을 보내고 이메일을 받는 방법에 대한 자세한 설명

JavaMail을 이용하여 사진과 첨부파일을 보내고 이메일을 받는 방법에 대한 자세한 설명

黄舟
黄舟원래의
2017-10-16 09:56:311840검색

이 글은 주로 JavaMail에서 사진과 첨부 파일이 포함된 이메일을 보내고 받는 방법을 자세히 소개합니다. 관심 있는 친구들이 참고할 수 있습니다.

자, 이 튜토리얼 시리즈의 가장 중요한 단계로 들어가겠습니다. , 우리 모두는 위의 이메일에 대한 이론적 지식을 이해하고 있으므로 이 블로그에서는 코드를 사용하여 이메일 전송을 완료하겠습니다. 이는 실제 프로젝트에서 널리 사용됩니다. 예를 들어 등록하려면 계정 활성화를 위해 이메일을 보내야 하며 다른 예로는 OA 프로젝트에서 작업 알림을 위해 이메일을 사용하는 것이 포함됩니다. 여기서 말하는 것은 JavaMail을 사용하여 이메일 보내기 및 받기 기능을 완료하는 것입니다.

PS: 이 블로그의 소스 코드 다운로드 링크: https://github.com/YSOcean/cnblogs

1. JavaMail 소개

 JavaMail은 Sun 회사(현재 Oracle에 인수됨)입니다. Java 개발자 애플리케이션 이메일 송수신 기능을 구현하기 위해 프로그램에서 제공하는 표준 개발 키트 세트입니다. 앞서 언급한 SMTP, POP3, IMAP 및 MIME과 같이 일반적으로 사용되는 이메일 프로토콜을 지원합니다. JavaMail API를 사용하여 이메일을 작성할 때 이메일의 기본 구현 세부 사항을 고려할 필요는 없으며 JavaMail 개발 키트에서 해당 API 클래스를 호출하기만 하면 됩니다.

 JavaMail 다운로드 주소: https://github.com/javaee/javamail/releases 

SMTP, IMAP 및 POP3 프로토콜 구현이 포함된 이 버전의 JavaMail을 다운로드하세요.

2. JavaMail API

 JavaMail API는 기능에 따라 다음 세 가지 범주로 나눌 수 있습니다.

 ①, 이메일 생성 및 구문 분석용 API

  ②, 이메일 전송용 API

 3, 수신용 API emails

위의 세 가지 유형의 API는 JavaMail에서 여러 클래스로 구성되어 있지만 주로 4개의 핵심 클래스가 있습니다. 프로그램을 작성할 때 이 4가지 핵심 클래스를 기억하면 쉽게 Java 메일 처리 프로그램을 작성할 수 있습니다.

  ①, 메시지 클래스: javax.mail.Message 클래스는 이메일을 생성하고 구문 분석하는 핵심 API이며, 이 클래스의 하위 클래스인 javax.mail.internet.MimeMessage 클래스가 일반적으로 사용됩니다. 해당 인스턴스 개체는 이메일을 나타냅니다. 클라이언트 프로그램이 이메일을 보낼 때 먼저 이메일을 생성하는 JavaMail API를 사용하여 이메일 데이터를 캡슐화하는 메시지 객체를 생성한 다음 이 객체를 이메일 전송 API(전송 클래스)에 전달하여 전송합니다. 클라이언트 프로그램이 메일을 받으면 메일 수신 API는 수신된 메일 데이터를 Message 클래스의 인스턴스에 캡슐화합니다. 클라이언트 프로그램은 메일 구문 분석 API를 사용하여 이 개체에서 받은 메일 데이터를 구문 분석합니다.

 ②. 전송 클래스: javax.mail.Transport 클래스는 이메일 전송을 위한 핵심 API 클래스입니다. 인스턴스 객체는 클라이언트 프로그램이 메시지를 생성한 후 특정 메일 전송 프로토콜을 구현하는 메일 전송 객체를 나타냅니다. object 의 경우 메일 전송 API를 사용하여 Transport 개체를 가져온 다음 Message 개체를 Transport 개체에 전달하고 해당 전송 메서드를 호출하여 지정된 SMTP 서버로 메일을 보내기만 하면 됩니다.

  ③. Store 클래스는 메일 수신을 위한 핵심 API 클래스로, 해당 인스턴스 객체는 클라이언트 프로그램이 메일을 수신할 때 특정 메일 수신 프로토콜을 구현하는 객체를 나타냅니다. 메일 수신 API를 사용하여 Store 개체를 가져온 다음 Store 개체의 수신 메서드를 호출하여 지정된 POP3 서버에서 메일 데이터를 가져와 메일을 나타내는 Message 개체에 메일 데이터를 캡슐화해야 합니다.

 4. 세션 클래스: javax.mail.Session 클래스는 전체 애플리케이션에서 요구하는 환경 정보를 정의하고 클라이언트가 메일 서버와 네트워크 연결을 설정하기 위한 호스트 이름 등의 세션 정보를 수집하는 데 사용됩니다. 포트 번호, 메일 서버 사용 및 이메일 전송 및 수신 프로토콜 등 Session 객체는 이 정보를 기반으로 이메일을 보내고 받기 위한 Transport 및 Store 객체를 구축하고 클라이언트에 대한 Message 객체를 생성할 때 정보 지원을 제공합니다. ​

3. JavaMail을 사용하여 간단한 일반 텍스트 이메일 보내기

이메일을 보내는 다음 코드를 이해하면 이메일을 위성을 운반하는 로켓으로 보내는 것을 상상할 수 있습니다. 그 중 메시지는 위성이고, 운송은 로켓입니다. 위성과 로켓을 만드는 데는 세션의 도움이 필요합니다.


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

  위 코드에 자세한 설명이 있습니다. 이해가 안 되시면 메시지를 남겨주세요. 참고: 실행 시 수신자, 발신자 및 기타 정보를 직접 변경하시기 바랍니다.

 위 코드를 실행한 후 받은 편지함을 확인합니다.

 그러면 간단한 일반 텍스트 파일이 전송되었습니다.

4. 이메일 전송 문제

  ①. 보낸 사람의 이메일 계정 이름과 비밀번호: 일부 이메일에는 독립적인 비밀번호가 설정되어 있고, 다른 이메일에는 로그인하려면 인증 코드를 사용해야 합니다(qq 이메일). 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;
 }
 
}

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

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

위 내용은 JavaMail을 이용하여 사진과 첨부파일을 보내고 이메일을 받는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.