Java 发邮件实现

一、SMTP协议

SMTP(Simple Mail Transfer Protocol)是因特网电子邮件传输的标准协议,使用TCP协议25号端口。JavaMail是Java EE平台上发送、接收电子邮件的API规范,JavaMail还实现了SMTP及IMAP等邮件协议。JavaMail发送电子邮件的过程就是使用SMTP协议与邮件服务器进行通信,传输邮件消息传输给对方。SMTP协议发送邮件需要实现以下几个步骤:

1、建立连接(connect):建立与邮件服务器连接,获取服务器连接的Socket对象。

2、握手(handshake):客户端和服务器通过交换特定的协议码来确认对方的身份和协议,以及对方邮件服务器是否开启SMTP服务,一般客户端在请求连接后会发送EHLO或HELO命令请求服务器确认身份并获取服务器支持的协议。

3、登录(login):进行SMTP用户认证,使用用户名和密码(如果SMTP服务器要求的话)。

4、设置发件人(set sender):使用MAIL FROM命令指定哪个邮件地址将作为发件人(MAIL FROM后面加上要发送邮件的发件人的邮件地址)。

5、设置收件人(set recipient):使用RCPT TO命令指定哪个邮件地址将作为收件人(RCPT TO后面加上要发送邮件的收件人的邮件地址)。

6、设置邮件内容(set content):使用DATA命令开始发送邮件内容,通过Socket输入流将邮件内容发送至服务器。

7、退出(quit):使用QUIT命令关闭SMTP连接。

二、JavaMail API

JavaMail API包含两个主要类库:

1、javax.mail: JavaMail中SMTP和IMAP协议的实现。

2、javax.mail.internet:该类库用于编码和解析Internet消息。它包括MIME(Multipurpose Internet Mail Extensions)处理的实现。

三、实现步骤

以下代码实现了基本邮件发送功能,其中SMTP_SERVER为邮件服务器地址,AUTH_USER和AUTH_PWD为邮件服务器账号和密码,TO_MAIL为收件人邮箱地址,FROM_MAIL为发件人邮箱地址,SUBJECT为邮件主题,BODY为邮件内容。

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class SendMail{
    public static void main(String[] args) throws Exception{
        final String SMTP_SERVER = "smtp.qq.com";
        final String AUTH_USER = "example@qq.com";
        final String AUTH_PWD = "password";
        String TO_MAIL = "to@example.com";
        String FROM_MAIL = "example@qq.com";
        String SUBJECT = "邮件主题";
        String BODY = "邮件内容";

        //设置邮件会话属性
        Properties props = new Properties();
        props.put("mail.smtp.host", SMTP_SERVER);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.ssl.enable", "true");
        props.setProperty("mail.smtp.port", "465");

        // 获取会话对象
        Session session = Session.getInstance(props, new javax.mail.Authenticator(){
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(AUTH_USER, AUTH_PWD);
            }
        });

        //设置邮件消息
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(FROM_MAIL));
        message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_MAIL));
        message.setSubject(SUBJECT);
        message.setText(BODY);

        //发送邮件
        Transport.send(message);

        System.out.println("邮件已发送至" + TO_MAIL);
    }
}

四、其他实现方式

1、发送附件

以下代码实现了带附件的邮件发送功能,其中attachments为附件地址。

//设置邮件消息
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(FROM_MAIL));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_MAIL));
message.setSubject(SUBJECT);

// 创建整个邮件的容器描述数据对象
MimeMultipart multipart = new MimeMultipart();

// 添加邮件的文本内容
BodyPart contentPart = new MimeBodyPart();
contentPart.setText(BODY);
multipart.addBodyPart(contentPart);

// 添加附件
for(String filePath : attachments){
    BodyPart attachmentPart = new MimeBodyPart();
    File file = new File(filePath);
    if (file.exists()) {
        DataSource source = new FileDataSource(file);
        attachmentPart.setDataHandler(new DataHandler(source));
        attachmentPart.setFileName(MimeUtility.encodeText(file.getName()));
        multipart.addBodyPart(attachmentPart);  
    }
}

// 将多重消息放到一个复合消息中 
message.setContent(multipart);

//发送邮件
Transport.send(message);

2、HTML邮件

以下代码实现了HTML格式的邮件发送功能,其中HTML为HTML邮件内容。

//设置邮件消息
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(FROM_MAIL));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_MAIL));
message.setSubject(SUBJECT);

// 内容采用html方式并设置编码方式为utf-8
message.setContent(HTML, "text/html;charset=utf-8");

//发送邮件
Transport.send(message);

3、邮件模板

以下代码实现了使用Freemarker模板生成邮件内容并发送邮件的功能,其中templatePath为模板文件所在路径,data为模板数据。

//设置邮件消息
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(FROM_MAIL));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_MAIL));
message.setSubject(SUBJECT);

// 解析模板
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File(templatePath));
Template template = cfg.getTemplate("template.ftl");
StringWriter out = new StringWriter();
template.process(data, out);
String content = out.toString();

// 内容采用html方式并设置编码方式为utf-8
message.setContent(content, "text/html;charset=utf-8");

//发送邮件
Transport.send(message);

原创文章,作者:TGNKE,如若转载,请注明出处:https://www.506064.com/n/368647.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
TGNKETGNKE
上一篇 2025-04-12 01:13
下一篇 2025-04-12 01:13

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29
  • Java 8 Group By 会影响排序吗?

    是的,Java 8中的Group By会对排序产生影响。本文将从多个方面探讨Group By对排序的影响。 一、Group By的概述 Group By是SQL中的一种常见操作,它…

    编程 2025-04-29

发表回复

登录后才能评论