1. 电子邮件协议

电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,所以本文也只会涉及到SMTP协议。SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。



2.创建一封简单的电子邮件

首先创建一个 Java 工程,把下载好的 javax.mail.jar 作为类库加入工程。

邮件创建步骤:

  1. 创建一个邮件对象(MimeMessage);
  2. 设置发件人,收件人,可选增加多个收件人,抄送人,密送人;
  3. 设置邮件的主题(标题);
  4. 设置邮件的正文(内容);
  5. 设置显示的发送时间;
  6. 保存到本地。

代码实现:

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.Properties;

/**
 * 邮件发送
 */
public class MailSend {

    private static Properties getMailConfig(){
        Properties props = new Properties();                    // 参数配置
        props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议(JavaMail规范要求)
        props.setProperty("mail.smtp.host", "smtp.exmail.qq.com");    // 发件人的邮箱的 SMTP 服务器地址
        props.setProperty("mail.smtp.auth", "true");          // 需要请求认证
        return props;
    }

    public static void send(String sender,String receivers,String emailPassword, String title, String content) throws Exception{
        Session session = Session.getInstance(getMailConfig());
        session.setDebug(true);
        //多用户发送
        String[] receiver = receivers.split(";");
        //创建一封邮件
        MimeMessage message = createMimeMessage(session, sender, receiver,title,content);
        //根据 Session 获取邮件传输对象
        Transport transport = session.getTransport();
        transport.connect(sender, emailPassword);
        //发送邮件
        transport.sendMessage(message, message.getAllRecipients());
        //关闭连接
        transport.close();
    }

    /**
     * 创建一封只包含文本的简单邮件
     *
     * @param session 和服务器交互的会话
     * @param sender 发件人邮箱
     * @param receiver 收件人邮箱
     * @return
     * @throws Exception
     */
    public static MimeMessage createMimeMessage(Session session, String sender, String[] receiver,String title,String content) throws Exception {
        // 1. 创建一封邮件
        MimeMessage message = new MimeMessage(session);

        // 2. From: 发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称)
        message.setFrom(new InternetAddress(sender, title, "UTF-8"));

        // 3. To: 收件人(可以增加多个收件人、抄送、密送)
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiver[0]));
        if(receiver.length > 1){
            for (int i = 1; i < receiver.length; i++) {
                message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiver[i]));
            }
        }
        
        // To: 增加收件人(可选)
 //message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress("dd@receive.com", "USER_DD", "UTF-8"));
        //    Cc: 抄送(可选)
        //message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress("ee@receive.com", "USER_EE", "UTF-8"));
        //    Bcc: 密送(可选)
        //message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress("ff@receive.com", "USER_FF", "UTF-8"));
        
        // 4. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
        message.setSubject(title, "UTF-8");

        // 5. Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
        message.setContent(content, "text/html;charset=UTF-8");

        // 6. 设置发件时间
        message.setSentDate(new Date());

        // 7. 保存设置
        message.saveChanges();

        return message;
    }
}