Java 发送带附件的邮件

在日常工作和生活中,我们经常需要通过邮件发送文件。而对于Java开发人员来说,如何使用Java程序发送带附件的邮件是一个非常基础且实用的技能。本文将介绍如何使用Java发送带附件的邮件,并提供相应的代码示例。

邮件协议与JavaMail

在介绍如何发送带附件的邮件之前,我们先来了解一下邮件协议。邮件协议是指用于在网络上传输电子邮件的协议,常见的邮件协议有SMTP、POP3和IMAP。

  • SMTP(Simple Mail Transfer Protocol)是用于发送电子邮件的协议。当我们发送邮件时,邮件客户端通过SMTP协议将邮件发送给邮件服务器,然后由邮件服务器将邮件传递给接收方的邮件服务器。

  • POP3(Post Office Protocol 3)是用于接收电子邮件的协议。当我们使用邮件客户端接收邮件时,客户端通过POP3协议从邮件服务器上下载邮件。

  • IMAP(Internet Message Access Protocol)也是用于接收电子邮件的协议,与POP3相比,IMAP协议更加灵活,可以在不同设备上同步邮件状态。

而在Java中,我们可以使用JavaMail库来实现邮件的发送和接收。JavaMail是Sun公司提供的一组用于发送和接收电子邮件的API,它提供了SMTP、POP3和IMAP等协议的实现。我们可以通过JavaMail库来发送带附件的邮件。

添加依赖

在使用JavaMail之前,我们需要先添加相应的依赖。可以在pom.xml文件中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>javax.mail-api</artifactId>
        <version>1.6.2</version>
    </dependency>
    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>1.6.2</version>
    </dependency>
</dependencies>

发送邮件

下面我们来看一下如何使用JavaMail发送带附件的邮件。首先,我们需要创建一个javax.mail.Session对象来表示邮件会话,并设置相应的属性。

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import java.util.Properties;

public class MailUtils {

    public static Session createSession(String host, int port, String username, String password) {
        Properties props = new Properties();
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.port", port);
        props.put("mail.smtp.auth", "true");

        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        };

        return Session.getDefaultInstance(props, authenticator);
    }
}

在上述代码中,我们创建了一个Properties对象来设置邮件服务器的地址、端口以及身份验证相关的属性。然后,我们通过创建一个Authenticator对象来提供用户名和密码,以便进行身份验证。最后,我们使用Session.getDefaultInstance方法创建一个Session对象。

接下来,我们可以使用Session对象来创建一个javax.mail.Message对象,表示一封邮件。然后,我们可以设置邮件的发送者、接收者、主题、正文和附件。

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.Date;

public class MailUtils {

    public static void sendMail(Session session, String from, String to, String subject, String content, File attachment) {
        try {
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
            message.setSubject(subject);
            message.setSentDate(new Date());

            MimeBodyPart textPart = new MimeBodyPart();
            textPart.setText(content);

            MimeBodyPart attachmentPart = new MimeBodyPart();
            attachmentPart.attachFile(attachment);

            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(textPart);
            multipart.addBodyPart(attachmentPart);

            message.setContent(multipart);