第十六章 Javamail发送邮件

目录

一、邮件发送原理和流程图 

二、Java发送邮件基本步骤

三、QQ邮箱授权码获取

四、发送纯文本示例代码

五、发送除文本外的图片文件代码

5.1. multipart类型


注:本章内容仅作为了解JavaMail邮件收发的基本原理,不建议作为实际项目使用,项目中建议通过SpringBoot项目加入mail的starter依赖来构建,代码更为精简可靠。

一、邮件发送原理和流程图 

二、Java发送邮件基本步骤

  1. 使用JavaMail API建立与邮件服务器的通信。

  2. 创建邮件对象并设置发件人、收件人、主题和内容。

  3. 调用Transport.send方法发送邮件。

  4. 关闭连接。

三、QQ邮箱授权码获取

四、发送纯文本示例代码

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Javamail</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.2</version>
        </dependency>
    </dependencies>
</project>
import com.sun.mail.util.MailSSLSocketFactory;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

public class Test {
    public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        // 设置QQ邮件服务器
        prop.setProperty("mail.host", "smtp.qq.com");
        // 设置邮件发送协议
        prop.setProperty("mail.transport.protocol", "smtp");
        // 设置需要验证用户密码
        prop.setProperty("mail.smtp.auth", "true");

        // 对于部分大公司的邮箱,还需要设置SSL加密,加上以下代码即可
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        // 设置信任所有主机
        sf.setTrustAllHosts(true);
        // 启用SSL加密
        prop.put("mail.smtp.ssl.enable", "true");
        prop.put("mail.smtp.ssl.socketFactory", "true");

        // 使用JavaMail发送邮件的5个步骤
        // 1. 新建一个认证器
        Authenticator auth = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                // 设置发件人邮箱和密码
                return new PasswordAuthentication("123456@qq.com", "123456ddd@");
            }
        };
        // 2. 创建定义整个应用程序所需的环境信息的Session会话对象
        Session session = Session.getInstance(prop, auth);
        // 开启session的debug模式,这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);
        // 3. 通过Session得到transport对象
        Transport ts = session.getTransport();
        // 4. 使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("smtp.qq.com", "123456@qq.com", "vkxypfjuv1pobbajg");
        // 5. 创建邮件:写邮件
        MimeMessage message = new MimeMessage(session);
        // 6. 指明邮件的发件人
        message.setFrom(new InternetAddress("123456@qq.com"));
        // 7. 指明邮件的收件人,这里发件人和收件人是一样的,给自己发
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("123456@qq.com"));
        // 邮件的标题
        message.setSubject("只包含文本的简单邮件");
        // 8. 邮件的文本内容
        message.setContent("<h1 style='color: red'>你好啊!<h1>", "text/html;charset=UTF-8");
        ts.sendMessage(message, message.getAllRecipients());
        // 9. 关闭连接
        ts.close();
    }
}

五、发送除文本外的图片文件代码

import com.sun.mail.util.MailSSLSocketFactory;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;

public class Test1 {
    public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        // 设置QQ邮件服务器
        prop.setProperty("mail.host", "smtp.qq.com");
        // 设置邮件发送协议
        prop.setProperty("mail.transport.protocol", "smtp");
        // 设置需要验证用户密码
        prop.setProperty("mail.smtp.auth", "true");

        // 对于部分大公司的邮箱,还需要设置SSL加密,加上以下代码即可
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        // 设置信任所有主机
        sf.setTrustAllHosts(true);
        // 启用SSL加密
        prop.put("mail.smtp.ssl.enable", "true");
        prop.put("mail.smtp.ssl.socketFactory", "true");

        // 使用JavaMail发送邮件的5个步骤
        // 1. 新建一个认证器
        Authenticator auth = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                // 设置发件人邮箱和密码
                return new PasswordAuthentication("791332570@qq.com", "Wangzhexiao1991@");
            }
        };
        // 2. 创建定义整个应用程序所需的环境信息的Session会话对象
        Session session = Session.getInstance(prop, auth);
        // 开启session的debug模式,这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);
        // 3. 通过Session得到transport对象
        Transport ts = session.getTransport();
        // 4. 使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("smtp.qq.com", "791332570@qq.com", "vkxypfjuvpobbajg");
        // 5. 创建邮件:写邮件
        MimeMessage message = new MimeMessage(session);
        // 6. 指明邮件的发件人
        message.setFrom(new InternetAddress("791332570@qq.com"));
        // 7. 指明邮件的收件人,这里发件人和收件人是一样的,给自己发
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("791332570@qq.com"));
        // 邮件的标题
        message.setSubject("包含附件的邮件");
        // 邮件的纯文本部分
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("人生,婚姻伴侣与工作职业的选择", "text/html;charset=UTF-8");
        // 邮件的图片部分
        MimeBodyPart image = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource("src/main/resources/1.jpeg"));
        image.setDataHandler(dh);
        image.setFileName("1.jpeg");
        image.setHeader("Content-ID", "<image>");
        image.setContentID("microservices.png");

        // 邮件的附件部分
        MimeBodyPart attachment = new MimeBodyPart();
        DataHandler attachmentDataHandler = new DataHandler(new FileDataSource("src/main/resources/wzx.txt"));
        attachment.setDataHandler(attachmentDataHandler);
        attachment.setFileName("wzx.txt");

        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.addBodyPart(attachment);
        
        mm.setSubType("related");

        message.setContent(mm);
        message.saveChanges();

        ts.sendMessage(message, message.getAllRecipients());
        // 9. 关闭连接
        ts.close();
    }


}

5.1. multipart类型

MIME邮件中各种不同类型的内容是按分段存储的,各个段的排列方式、位置信息都通过Content-Type域的multipart类型来定义,查看Java源代码可知,默认为mixed

multipart类型主要有三种子类型:mixed、alternative、related

1. mixed类型

一封邮件中含有附件,邮件的Content-Type域中必须定义multipart/mixed类型,邮件通过multipart/mixed类型中定义的boundary标识将附件内容同邮件其它内容分成不同的段。基本格式如下:Content-Type: multipart/mixed; boundary="{分段标识}"

2. multipart/alternative类型

MIME邮件可传送超文本内容,出于兼容性的考虑,一般在发送超文本格式内容的同时会发送一个纯文本内容的副本,如果邮件中同时存在纯文本和超文本内容,则邮件需要在Content-Type域中定义multipart/alternative类型,邮件通过其boundary中的分段标识将纯文本、超文本和邮件的其它内容分成不同的段。基本格式如下:Content-Type: multipart/alternative; boundary="{分段标识}"

3. multipart/related类型

MIME邮件中除了可以携带各种附件外,还可以将其它内容以内嵌资源的方式存储在邮件中。比如我们在发送html格式的邮件内容时,可能使用图像作为 html的背景,html文本会被存储在alternative段中,而作为背景的图像则会存储在multipart/related类型定义的段中。基本格式如下:
Content-Type: multipart/related; boundary="{分段标识}"

import com.sun.mail.util.MailSSLSocketFactory;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;

public class Test1 {
    public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        // 设置QQ邮件服务器
        prop.setProperty("mail.host", "smtp.qq.com");
        // 设置邮件发送协议
        prop.setProperty("mail.transport.protocol", "smtp");
        // 设置需要验证用户密码
        prop.setProperty("mail.smtp.auth", "true");

        // 对于部分大公司的邮箱,还需要设置SSL加密,加上以下代码即可
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        // 设置信任所有主机
        sf.setTrustAllHosts(true);
        // 启用SSL加密
        prop.put("mail.smtp.ssl.enable", "true");
        prop.put("mail.smtp.ssl.socketFactory", "true");

        // 使用JavaMail发送邮件的5个步骤
        // 1. 新建一个认证器
        Authenticator auth = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                // 设置发件人邮箱和密码
                return new PasswordAuthentication("791332570@qq.com", "Wangzhexiao1991@");
            }
        };
        // 2. 创建定义整个应用程序所需的环境信息的Session会话对象
        Session session = Session.getInstance(prop, auth);
        // 开启session的debug模式,这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);
        // 3. 通过Session得到transport对象
        Transport ts = session.getTransport();
        // 4. 使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("smtp.qq.com", "791332570@qq.com", "vkxypfjuvpobbajg");
        // 5. 创建邮件:写邮件
        MimeMessage message = new MimeMessage(session);
        // 6. 指明邮件的发件人
        message.setFrom(new InternetAddress("791332570@qq.com"));
        // 7. 指明邮件的收件人,这里发件人和收件人是一样的,给自己发
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("791332570@qq.com"));
        // 邮件的标题
        message.setSubject("包含附件的邮件");

        MimeBodyPart text = new MimeBodyPart();
        text.setContent("人生,婚姻伴侣与工作职业的选择", "text/html;charset=UTF-8");

        MimeBodyPart image = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource("src/main/resources/1.jpeg"));
        image.setDataHandler(dh);
        image.setFileName("1.jpeg");
        image.setHeader("Content-ID", "<image>");
        image.setContentID("microservices.png");

        // 创建附件
        MimeBodyPart attachment = new MimeBodyPart();
        DataHandler attachmentDataHandler = new DataHandler(new FileDataSource("src/main/resources/wzx.txt"));
        attachment.setDataHandler(attachmentDataHandler);
        attachment.setFileName("wzx.txt");

        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.addBodyPart(attachment);
//
        mm.setSubType("related");

        message.setContent(mm);
        message.saveChanges();

        ts.sendMessage(message, message.getAllRecipients());
        // 9. 关闭连接
        ts.close();
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值