JavaMail(一)——发送纯文本内容邮件

基础概念

  • SMTP (Simple Mail Transfer Protocol) 简单邮件传输协议
    定义了邮件客户端软件与SMTP服务器之间,以及SMTP服务器之间的通信规则;SMTP协议是一个基于TCP/IP的应用层协议,SMTP服务器默认使用的网络监听端口号为25。
  • POP3 (Post Office Protocol) 邮局协议
    使用本地电子邮件客户端可以检索电子邮件从远程服务器通过TCP/ IP连接的应用层网络标准协议。 POP支持访问远程邮箱简单的下载和 - 删除要求。它采用的监听端口号为110。
  • IMAP (Internet Message Access Protocol) Internet消息访问协议
    这是一个应用层互联网协议,它允许电子邮件客户端来访问邮件的远程服务器上的邮件;也是对POP3协议的一种扩展。 IMAP服务器采用的监听端口号为143。

环境配置

要使用Java应用程序发送邮件是很简单的,但首先应该有安装 以下两个Jar包:
JavaMail API 和 JAF(JavaBeans Activation Framework,JavaBeans激活框架)

注:Java SE6或更高版本提供了javax.activation,也可以单独下载
下载流程可参考百度经验:下载流程
也可以在CSDN中直接下载JavaMail相关Jar包

下载并解压缩这些文件,需要添加 mail.jar 和 activation.jar 到项目中。

注:IDEA添加Jar包流程请参考:详述 IntelliJ IDEA 之 添加 jar 包

本人使用的是网易163邮箱,所以需要开启授权码;请参考:163邮箱如何开始POP3协议,获取授权码

发送纯文本邮件

首先创建邮件实体Email,这个实体在后面的各类邮件发送中都会用到

package com.company;

import java.io.File;
import java.util.Map;

/**
 * Created by lining on 2018/5/31.
 */
public class Email {

    // 收件人
    private String[] toEmails;

    // 抄送人
    private String[] ccEmails;

    // 密送人
    private String[] bccEmails;

    // 邮件主题
    private String subject;

    // 邮件内容
    private String content;

    // 附件
    private String[] attachments;

    // 内嵌图片
    private Map<String, String> imagesMap;

    // ----------- getter/setter -----------
    public String[] getToEmails() {
        return toEmails;
    }

    public void setToEmails(String[] toEmails) {
        this.toEmails = toEmails;
    }

    public String[] getCcEmails() {
        return ccEmails;
    }

    public void setCcEmails(String[] ccEmails) {
        this.ccEmails = ccEmails;
    }

    public String[] getBccEmails() {
        return bccEmails;
    }

    public void setBccEmails(String[] bccEmails) {
        this.bccEmails = bccEmails;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String[] getAttachments() {
        return attachments;
    }

    public void setAttachments(String[] attachments) {
        this.attachments = attachments;
    }

    public Map<String, String> getImagesMap() {
        return imagesMap;
    }

    public void setImagesMap(Map<String, String> imagesMap) {
        this.imagesMap = imagesMap;
    }
}

发送邮件的流程:
1.获取与邮件服务器交互的会话对象Session实例
2.通过MimeMessage创建邮件内容,主要涉及收件人、发送时间、邮件主题、邮件内容
3.调用Transport的静态方法send,发送邮件

package com.company;

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

/**
 * Created by lining on 2018/5/26.
 */
public class TextMessageSender {

    // 发件人的中文昵称
    private static final String nickname = "李宁";

    // 发件人在邮箱服务器中的用户名
    private static final String username = "152****1370@163.com";

    // 发件人在邮箱服务器中的授权码
    private static final String password = "******";

    // 邮件的发送协议
    private static final String protocol = "smtp";

    // 邮件发送的服务器
    private static final String host = "smtp.163.com";

    // 邮件的监听端口号
    private static final String port = "25";

    public static void main(String[] args) {
        // 收件人邮箱地址
        String to = "******@qq.com";

        // 抄送人邮箱地址
        String cc = "******@qq.com";

        // 密送人邮箱地址
        String bcc = "******@163.com";

        // 邮件的主题
        String subject = "文本邮件主题";

        // 邮件正文的文本内容
        String body = "文本邮件内容";

        // 封装邮件实体
        Email email = new Email();
        email.setToEmails(to.split(";"));
        email.setCcEmails(cc.split(";"));
        email.setBccEmails(bcc.split(";"));
        email.setSubject(subject);
        email.setContent(body);

        // 发送邮件
        if (sendEmail(email)) {
            System.out.println("邮件发送成功!");
        } else {
            System.out.println("邮件发送失败!请及时解决!");
        }
    }

    /**
     * 发送邮件
     * @param email 邮件信息实体
     * @return 是否发送成功 TRUE 发送成功 FALSE 发送失败
     */
    public static boolean sendEmail(Email email) {
        try {

            // 创建Session实例对象
            /*
             * Session类用于定义整个JavaMail应用程序所需要的环境信息,
             * 以及收集客户端与邮件服务器建立网络连接会话信息,如邮件
             * 服务器的主机号、端口号、采用的邮件发送和接收的协议等。
             */
            Session session = createSession();

            // 创建MimeMessage实例对象
            MimeMessage message =createMessage(session, email);

            // 发送邮件
            /*
             * send方法执行邮件发送任务时,它首先从参数Message对象中获得Session对象,
             * 然后调用Session.getTransport方法获得用于发送邮件邮件的Transport实例对象,
             * 接着使用保存在Session对象中的与网络链接相关的JavaMail属性,调用Transport
             * 对象的connect方法连接邮件服务器,然后调用Transport对象的sendMessage方法
             * 发送邮件,最后调用close方法断开与邮件服务器的连接。
             */
            Transport.send(message);

            return true;
        } catch (Exception e) {
            System.out.println("发送邮件异常==》");
            e.printStackTrace();
            return false;
        } finally {
            System.out.println("邮件发送结束...");
        }
    }

    /**
     * 创建与邮件服务器的会话对象
     * @return 服务器的会话对象
     */
    public static Session createSession() {
        // 封装属性参数
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", protocol); // 邮件传输的协议
        props.setProperty("mail.smtp.host", host); // 邮件的服务器
        props.setProperty("mail.smtp.port", port); // 邮件的监听端口
        props.setProperty("mail.smtp.auth", "true"); // 是否需要验证设置为TRUE,使用授权码发送邮件需要验证

        // 获取与服务器的会话Session对象
        /*
         * getInstance和getDefaultInstance是Session的静态方法,都可以用来获取Session类的实例对象。
         * 两个方法的区别在于:
         * getDefaultInstance方法返回一个Session对象后,将把这个Session对象设置为默认的Session对象,
         * 以后每一次调用getDefaultInstance方法都会返回这个默认Session对象;
         * 而getInstance方法则是每次调用都会返回一个新的Session对象。
         */
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                // 登陆账号及密码,密码需要是第三方授权码
                /*
                 * 调用Session对象中注册的Authenticator对象,从中获取的用户认证信息后传递给邮件服务器
                 * PasswordAuthentication根据指定的用户名和密码创建实例对象
                 */
                return new PasswordAuthentication(username, password);
            }
        });

        return session;
    }

    /**
     * 创建邮件的核心内容
     * @param session 与服务器交互的会话对象
     * @param email 邮件实体
     * @return 生成的MimeMessage实例对象
     * @throws Exception
     */
    public static MimeMessage createMessage(Session session, Email email) throws Exception{
        // 创建MimeMessage实例对象:表示整封邮件
        MimeMessage message = new MimeMessage(session);

        // 设置发件人
        if (!nickname.isEmpty()) {
            // 自定义发件人昵称
            message.setFrom(new InternetAddress(MimeUtility.encodeText(nickname) + " <" + username + ">"));
        } else {
            message.setFrom(new InternetAddress(username));
        }

        // 设置收件人
        String[] toEmails = email.getToEmails();
        if (toEmails != null && toEmails.length != 0) {
            // InternetAddress类表示电子邮件的地址
            InternetAddress[] internetAddressTO = new InternetAddress[toEmails.length];
            for (int i = 0; i < toEmails.length; i++) {
                internetAddressTO[i] = new InternetAddress(toEmails[i]);
            }
            // Message.RecipientType表示收件人的类型,它是Message类中的一个静态内部类
            // TO 收件人 CC 抄送人 BCC 密送人
            message.setRecipients(Message.RecipientType.TO, internetAddressTO);
        }

        // 设置密送人
        String[] bccEmails = email.getBccEmails();
        if (bccEmails != null && bccEmails.length != 0) {
            InternetAddress[] internetAddressBCC = new InternetAddress[bccEmails.length];
            for (int i = 0; i < bccEmails.length; i++) {
                internetAddressBCC[i] = new InternetAddress(bccEmails[i]);
            }
            message.setRecipients(Message.RecipientType.BCC, internetAddressBCC);
        }

        // 设置抄送人
        String[] ccEmails = email.getCcEmails();
        if (ccEmails != null && ccEmails.length != 0) {
            InternetAddress[] internetAddressCC = new InternetAddress[ccEmails.length];
            for (int i = 0; i < ccEmails.length; i++) {
                internetAddressCC[i] = new InternetAddress(ccEmails[i]);
            }
            message.setRecipients(Message.RecipientType.CC, internetAddressCC);
        }

        // 设置发生日期
        message.setSentDate(new Date());

        // 设置邮件主题
        message.setSubject(email.getSubject());

        // 设置纯文本的邮件内容
        message.setText(email.getContent());

        // 保存并生成最终的邮件内容
        message.saveChanges();

        return message;
    }
}

发送结果

收件人邮箱:
收件人邮箱

密送人邮箱:
密送人邮箱

抄送人邮箱:
抄送人邮箱

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
javaMail的详细文档,都有以下多有类的详细信息: ACL Address AddressException AddressStringTerm AddressTerm AndTerm AuthenticationFailedException Authenticator BodyPart BodyTerm ByteArrayDataSource ComparisonTerm ConnectionAdapter ConnectionEvent ConnectionListener ContentDisposition ContentType DateTerm DeliveryStatus DispositionNotification FetchProfile FetchProfile.Item Flags Flags.Flag FlagTerm Folder FolderAdapter FolderClosedException FolderEvent FolderListener FolderNotFoundException FromStringTerm FromTerm Header HeaderTerm HeaderTokenizer HeaderTokenizer.Token IllegalWriteException IMAPFolder IMAPFolder.FetchProfileItem IMAPFolder.ProtocolCommand IMAPMessage IMAPSSLStore IMAPStore IntegerComparisonTerm InternetAddress InternetHeaders InternetHeaders.InternetHeader MailDateFormat MailEvent MailHandler MailSSLSocketFactory Message Message.RecipientType MessageAware MessageChangedEvent MessageChangedListener MessageContext MessageCountAdapter MessageCountEvent MessageCountListener MessageHeaders MessageIDTerm MessageNumberTerm MessageRemovedException MessagingException MethodNotSupportedException MimeBodyPart MimeMessage MimeMessage.RecipientType MimeMultipart MimePart MimePartDataSource MimeUtility Multipart MultipartDataSource MultipartReport NewsAddress NoSuchProviderException NotTerm OrTerm ParameterList ParseException Part PasswordAuthentication POP3Folder POP3Message POP3SSLStore POP3Store PreencodedMimeBodyPart Provider Provider.Type Quota Quota.Resource QuotaAwareStore ReadOnlyFolderException ReceivedDateTerm RecipientStringTerm RecipientTerm Report Rights Rights.Right SearchException SearchTerm SendFailedException SentDateTerm Service Session SharedByteArrayInputStream SharedFileInputStream SharedInputStream SizeTerm SMTPAddressFailedException SMTPAddressSucceededException SMTPMessage SMTPSendFailedException SMTPSSLTransport SMTPTransport Store StoreClosedException StoreEvent StoreListener StringTerm SubjectTerm Transport TransportAdapter TransportEvent TransportListener UIDFolder UIDFolder.FetchProfileItem URLName
如果您想要在发送 HTML 格式的邮件的同时,也需要附加文本格式的邮件,可以使用 JavaMail API 中的 `Multipart` 类来实现。下面是一个示例代码: ```java // 创建邮件会话对象 Properties props = new Properties(); Session session = Session.getDefaultInstance(props); // 创建邮件对象 Message message = new MimeMessage(session); message.setFrom(new InternetAddress("sender@example.com")); message.setRecipient(Message.RecipientType.TO, new InternetAddress("recipient@example.com")); message.setSubject("Test email"); // 创建 Multipart 对象,并将 HTML 和文本邮件添加到其中 Multipart multipart = new MimeMultipart(); BodyPart htmlBodyPart = new MimeBodyPart(); htmlBodyPart.setContent("<html><body><h1>Hello world!</h1></body></html>", "text/html"); multipart.addBodyPart(htmlBodyPart); BodyPart textBodyPart = new MimeBodyPart(); textBodyPart.setText("Hello world!"); multipart.addBodyPart(textBodyPart); // 将 Multipart 对象设置为邮件内容 message.setContent(multipart); // 发送邮件 Transport.send(message); ``` 在这个示例中,我们首先创建一个邮件会话对象和一个邮件对象,并设置邮件的基本信息,如发送者、收件人和主题。 然后,我们创建一个 `Multipart` 对象,并将 HTML 和文本邮件添加到其中。为了创建文本邮件,我们使用 `MimeBodyPart` 类并调用 `setText()` 方法。 最后,我们将 `Multipart` 对象设置为邮件内容,并使用 `Transport` 类的 `send()` 方法发送邮件。 这样,当收件人无法显示 HTML 格式的邮件时,也可以看到附带的文本邮件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值