목차
欢迎大家阅读此邮件
Java java지도 시간 JavaMail 시작하기이메일 만들기

JavaMail 시작하기이메일 만들기

Nov 21, 2016 am 11:03 AM

JavaMail API使用javax.mail.Message类来表示一封邮件,Message类是一个抽象类,所以我们需要使用其子类javax.mail.internet.MimeMessage类来创建Message类的实例对象,如果我们创建的是一个简单文本邮件,那么MimeMessage类就可以满足我们的需求了,但是如果需要创建一封包含内嵌资源或者是带附件的复杂邮件,则需要使用到JavaMail API中的MimeMessage、javax.mail.internet.MimeBodyPart和javax.mail.internet.MimeMultipart等类。

1、MimeMessage类表示整封邮件

2、MimeBodyPart类表示邮件的一个MIME消息

3、MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。

这三个类的工作关系如下图所示:

JavaMail 시작하기이메일 만들기

虽然应用程序开发者在使用JavaMailAPI创建邮件内容时,通常只需要使用MimeMessage,MimeBodyPart和MimeMultipart这3个主要的类,但是了解他们的类继承关系也是必要的。下图列出了这三个类的继承关系以及常用方法。

JavaMail 시작하기이메일 만들기

下面用javax.mail.internet.MimeMessage类来创建一封简单的文本邮件,

import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.FileOutputStream;

public class TextMessage {
    public static void main(String[] args) throws Exception {
        String from = "123456@qq.com";
        String to = "123456@163.com";
        String subject = "test";
        String body = "test!!!";

        // 创建Session实例对象
        Session session = Session.getDefaultInstance(new Properties());
        // 创建MimeMessage实例对象
        MimeMessage msg = new MimeMessage(session);
        // 设置发件人
        msg.setFrom(new InternetAddress(from));
        // 设置收件人
        msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
        // 设置发送日期
        msg.setSentDate(new Date());
        // 设置邮件主题
        msg.setSubject(subject);
        // 设置纯文本内容的邮件正文
        msg.setText(body);
        // 保存并生成最终的邮件内容
        msg.saveChanges();
        // 把MimeMessage对象中的内容写入到文件中
        msg.writeTo(new FileOutputStream("c:\\test.eml"));
    }
}
로그인 후 복사

我们用邮件客户端(这里用foxmail)打开C盘下面的test.eml文件,可以看到如下信息,说明我们的邮件创建成功。

JavaMail 시작하기이메일 만들기

下面简单解释一下上面出现的一些类

1、MimeMessage类:上面介绍过MimeMessage是Message类的一个具体实现类,用来创建Message类的实例对象,这里构造函数传入了一个Session对象作为参数;

2、Session类:该对象用于收集客户端与邮件服务器之间的网络连接信息和定义整个邮件程序所需的环境信息,这些信息作为Session对象的属性保存在Session对象中,Session对象利用了java.util.Properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息,由于Session类的构造方法是私有的,所以我们使用Session类提供的getDefaultInstance()这个静态工厂方法获得一个默认的Session对象;

3、Properties类:该类表示了一个持久的属性集,用于存放相关键值对信息作为参数来创建Session对象,这里构造了一个空的集合作为参数;

4、InternetAddress类:该类是抽象类Address类的一个子类,用来创建一个邮件地址;

5、RecipientType类:该类是Message类的一个内部类,该类有3个静态变量,TO表示收件人,CC表示抄送人(收件人知道抄送的人),BCC表示密送人(收件人不知道密送的人)。

上面的邮件只是包含了简单的文本,有时候我们需要使用HTML文件来丰富我们的邮件正文,例如使用HTML标签来对邮件正文进行排版,使用HTML标签在邮件正文中引入一些图片或者是声音等。下面这段代码创建了一个包含HTML格式的邮件

import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.FileOutputStream;

public class HtmlMessage {
    public static void main(String[] args) throws Exception {
        String from = "123456@qq.com";
        String to = "123456@163.com";
        String subject = "test";
        String body = "<h4 id="欢迎大家阅读此邮件">欢迎大家阅读此邮件</h4>";
        // 创建Session实例对象
        Session session = Session.getDefaultInstance(new Properties());
        // 创建MimeMessage实例对象
        MimeMessage msg = new MimeMessage(session);
        // 设置发件人
        msg.setFrom(new InternetAddress(from));
        // 设置收件人
        msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
        // 设置发送日期
        msg.setSentDate(new Date());
        // 设置邮件主题
        msg.setSubject(subject);
        // 设置HTML格式的邮件正文
        msg.setContent(body, "text/html;charset=gb2312");
        // 保存并生成最终的邮件内容
        msg.saveChanges();
        // 把MimeMessage对象中的内容写入到文件中
        msg.writeTo(new FileOutputStream("c:\\test.eml"));
    }
}
로그인 후 복사

我们再用foxmail打开test.eml,显示如下

JavaMail 시작하기이메일 만들기

与之前代码不同的地方只是我们设置邮件内容的时候用setContent方法代替了setText方法,并且指定了邮件正文的MIME类型为text/html。

现在我们学会了创建含有HTML标签的邮件了,不过有时我们可能需要在邮件中插入一些图片来更直观的表达我们的意思,那么这时候我们就需要用到MimeMultipart类与MimeBodyPart类了

import java.io.FileOutputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class PictureMessage {
    public static void main(String[] args) throws Exception {
        String from = "123456@qq.com";// 发件人地址
        String to = "123456@163.com"; // 收件人地址
        String subject = "HTML邮件";
        String body = "<a href=http://www.cnblogs.com>" + "欢迎大家访问博客园</a></br>"
                + "<img  src="/static/imghw/default1.png"  data-src="https://img.php.cn//upload/image/943/882/548/1479697291432682.png"  class="lazy"  src=\"c:\\dog.jpg\" alt="JavaMail 시작하기이메일 만들기" >";

        Session session = Session.getDefaultInstance(new Properties());
        // 创建MimeMessage对象,并设置各种邮件头字段
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse(to));
        message.setSubject(subject);

        // 创建一个子类型为"related"的MimeMultipart对象。
        MimeMultipart multipart = new MimeMultipart("related");

        /*
         * 创建一个表示HTML正文的MimeBodyPart对象, 并将它加入到前面创建的MimeMultipart对象中
         */
        MimeBodyPart htmlBodyPart = new MimeBodyPart();
        htmlBodyPart.setContent(body, "text/html;charset=gb2312");
        multipart.addBodyPart(htmlBodyPart);

        /*
         * 创建一个表示图片内容的MimeBodyPart对象, 并将它加入到前面创建的MimeMultipart对象中
         */
        MimeBodyPart gifBodyPart = new MimeBodyPart();
        FileDataSource fds = new FileDataSource("c:\\dog.jpg");
        gifBodyPart.setFileName(fds.getName());
        gifBodyPart.setDataHandler(new DataHandler(fds));
        multipart.addBodyPart(gifBodyPart);

        /*
         * 将MimeMultipart对象设置为整个邮件的内容, 要注意调用saveChanges方法进行更新
         */
        message.setContent(multipart);
        message.saveChanges();

        // 把MimeMessage对象中的内容写入到文件中
        message.writeTo(new FileOutputStream("c:\\PictureMessage.eml"));
    }
}
로그인 후 복사

代码看起来似乎有点小复杂,可以再看看上面提到的MimeMessage,MimeMultipart与MimeBodyPart这三个类之间的关系图,这样会更会容易理解上面的代码,我们打开PictureMessage.eml,看到如下信息,说明我们成功的创建了一个带有图片的邮件了,并且该图片以附件的形式包含在邮件中了

JavaMail 시작하기이메일 만들기

MimeMultipart有两种构造函数,

1 public MimeMultipart()

2 public MimeMultipart(String subtype)

第一种是无参数的,其默认的实例对象的MIME类型为mixed,第二种制定一个类型来创建MimeMultipart类的实例对象,其有三种常用的类型:mixed,related,alternative,这三种类型在MIME中的组合关系如下所示:

JavaMail 시작하기이메일 만들기

现在我们用上面所示的这种组合关系来创建一封带有附件,并且正文中带有内嵌资源的邮件

import java.io.FileOutputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class ComplexMessage {
    public static void main(String[] args) throws Exception {
        Session session = Session.getDefaultInstance(new Properties());
        MimeMessage message = createMessage(session);
        message.writeTo(new FileOutputStream("c:\\ComplexMessage.eml"));
    }

    public static MimeMessage createMessage(Session session) throws Exception {
        String from = "123456@qq.com";// 发件人地址
        String to = "123456@163.com"; // 收件人地址
        String subject = "HTML邮件"; // 邮件主题
        String body = "<a href=http://www.cnblogs.com>" + "欢迎大家访问博客园</a></br>"
                + "<img  src="/static/imghw/default1.png"  data-src="https://img.php.cn//upload/image/574/505/676/1479697347446643.png"  class="lazy"  src=\"c:\\dog.jpg\" alt="JavaMail 시작하기이메일 만들기" >";

        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse(to));
        message.setSubject(subject);

        // 创建代表邮件正文和附件的各个MimeBodyPart对象
        MimeBodyPart contentPart = createContent(body, "c:\\dog.jpg");
        // 下面的附件可以是视频或者是音频
        MimeBodyPart attachPart1 = createAttachment("c:\\音乐.MP3");
        MimeBodyPart attachPart2 = createAttachment("c:\\视频.avi");

        // 创建用于组合邮件正文和附件的MimeMultipart对象
        MimeMultipart allMultipart = new MimeMultipart("mixed");
        allMultipart.addBodyPart(contentPart);
        allMultipart.addBodyPart(attachPart1);
        allMultipart.addBodyPart(attachPart2);

        // 设置整个邮件内容为最终组合出的MimeMultipart对象
        message.setContent(allMultipart);
        message.saveChanges();
        return message;
    }

    public static MimeBodyPart createContent(String body, String filename)
            throws Exception {
        /*
         * 创建代表组合MIME消息的MimeMultipart对象, 和将该MimeMultipart对象保存到的MimeBodyPart对象
         */
        MimeBodyPart contentPart = new MimeBodyPart();
        MimeMultipart contentMultipart = new MimeMultipart("related");

        /*
         * 创建用于保存HTML正文的MimeBodyPart对象, 并将它保存到MimeMultipart中
         */
        MimeBodyPart htmlBodyPart = new MimeBodyPart();
        htmlBodyPart.setContent(body, "text/html;charset=gb2312");
        contentMultipart.addBodyPart(htmlBodyPart);

        /*
         * 创建用于保存图片的MimeBodyPart对象, 并将它保存到MimeMultipart中
         */
        MimeBodyPart gifBodyPart = new MimeBodyPart();
        FileDataSource fds = new FileDataSource(filename);
        gifBodyPart.setDataHandler(new DataHandler(fds));
        contentMultipart.addBodyPart(gifBodyPart);

        // 将MimeMultipart对象保存到MimeBodyPart对象中
        contentPart.setContent(contentMultipart);
        return contentPart;
    }

    public static MimeBodyPart createAttachment(String filename)
            throws Exception {
        // 创建保存附件的MimeBodyPart对象,并加入附件内容和相应信息
        MimeBodyPart attachPart = new MimeBodyPart();
        FileDataSource fds = new FileDataSource(filename);
        attachPart.setDataHandler(new DataHandler(fds));
        attachPart.setFileName(fds.getName());
        return attachPart;
    }
}
로그인 후 복사

打开ComplexMessage.eml文件,可以看到如下内容,

JavaMail 시작하기이메일 만들기

现在我们学会了如何创建一封纯文本的邮件,带有HTML格式的邮件,以及带有内嵌图片与附件的邮件了。

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

<gum> : Bubble Gum Simulator Infinity- 로얄 키를 얻고 사용하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
Nordhold : Fusion System, 설명
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora : 마녀 트리의 속삭임 - Grappling Hook 잠금 해제 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

회사의 보안 소프트웨어가 응용 프로그램이 실행되지 않습니까? 문제 해결 및 해결 방법은 무엇입니까? 회사의 보안 소프트웨어가 응용 프로그램이 실행되지 않습니까? 문제 해결 및 해결 방법은 무엇입니까? Apr 19, 2025 pm 04:51 PM

일부 애플리케이션이 제대로 작동하지 않는 회사의 보안 소프트웨어에 대한 문제 해결 및 솔루션. 많은 회사들이 내부 네트워크 보안을 보장하기 위해 보안 소프트웨어를 배포 할 것입니다. ...

분류를 구현하고 그룹의 일관성을 유지하기 위해 이름을 숫자로 변환하려면 어떻게합니까? 분류를 구현하고 그룹의 일관성을 유지하기 위해 이름을 숫자로 변환하려면 어떻게합니까? Apr 19, 2025 pm 11:30 PM

많은 응용 프로그램 시나리오에서 정렬을 구현하기 위해 이름으로 이름을 변환하는 솔루션, 사용자는 그룹으로, 특히 하나로 분류해야 할 수도 있습니다.

맵 구조를 사용하여 시스템 도킹에서 필드 매핑 문제를 단순화하는 방법은 무엇입니까? 맵 구조를 사용하여 시스템 도킹에서 필드 매핑 문제를 단순화하는 방법은 무엇입니까? Apr 19, 2025 pm 06:21 PM

시스템 도킹의 필드 매핑 처리 시스템 도킹을 수행 할 때 어려운 문제가 발생합니다. 시스템의 인터페이스 필드를 효과적으로 매핑하는 방법 ...

데이터베이스 쿼리 조건을 구축하기 위해 엔티티 클래스 변수 이름을 우아하게 얻는 방법은 무엇입니까? 데이터베이스 쿼리 조건을 구축하기 위해 엔티티 클래스 변수 이름을 우아하게 얻는 방법은 무엇입니까? Apr 19, 2025 pm 11:42 PM

데이터베이스 작업에 MyBatis-Plus 또는 기타 ORM 프레임 워크를 사용하는 경우 엔티티 클래스의 속성 이름을 기반으로 쿼리 조건을 구성해야합니다. 매번 수동으로 ...

Intellij Idea는 로그를 출력하지 않고 스프링 부팅 프로젝트의 포트 번호를 어떻게 식별합니까? Intellij Idea는 로그를 출력하지 않고 스프링 부팅 프로젝트의 포트 번호를 어떻게 식별합니까? Apr 19, 2025 pm 11:45 PM

IntellijideAultimate 버전을 사용하여 봄을 시작하십시오 ...

Java 객체를 어레이로 안전하게 변환하는 방법은 무엇입니까? Java 객체를 어레이로 안전하게 변환하는 방법은 무엇입니까? Apr 19, 2025 pm 11:33 PM

Java 객체 및 배열의 ​​변환 : 캐스트 유형 변환의 위험과 올바른 방법에 대한 심층적 인 논의 많은 Java 초보자가 객체를 배열로 변환 할 것입니다 ...

전자 상거래 플랫폼 SKU 및 SPU 데이터베이스 설계 : 사용자 정의 속성과 귀속없는 제품을 모두 고려하는 방법은 무엇입니까? 전자 상거래 플랫폼 SKU 및 SPU 데이터베이스 설계 : 사용자 정의 속성과 귀속없는 제품을 모두 고려하는 방법은 무엇입니까? Apr 19, 2025 pm 11:27 PM

전자 상거래 플랫폼에서 SKU 및 SPU 테이블의 디자인에 대한 자세한 설명이 기사는 전자 상거래 플랫폼에서 SKU 및 SPU의 데이터베이스 설계 문제, 특히 사용자 정의 판매를 처리하는 방법에 대해 논의 할 것입니다 ...

Redis 캐시 솔루션을 사용하여 제품 순위 목록의 요구 사항을 효율적으로 실현하는 방법은 무엇입니까? Redis 캐시 솔루션을 사용하여 제품 순위 목록의 요구 사항을 효율적으로 실현하는 방법은 무엇입니까? Apr 19, 2025 pm 11:36 PM

Redis 캐싱 솔루션은 제품 순위 목록의 요구 사항을 어떻게 인식합니까? 개발 과정에서 우리는 종종 a ... 표시와 같은 순위의 요구 사항을 처리해야합니다.

See all articles