您的位置:

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