Java Mail 发送邮件之——简单实现

Java Mail发送邮件

简介

  Java程序发送邮件是很频繁的操作,这两天整理一下,分两篇,第一篇介绍Java Mail发送一个简单的邮件需要哪些步骤以及准备工作。第二篇整理一下Java Mail发送带有照片、附件的邮件,然后封装一下作为一个小module在以后使用的地方使用。写完之后module会放到github上。

准备条件

  • 一个开通了smtp协议(关于smtp协议的内容可以参考一下维基百科)的邮箱帐号,这里以163邮箱为例(这里同样要注意一下,新申请的163邮箱默认是不开通smtp协议的,要手动开启,后面具体步骤会有)。
  • 下载Java Mail APIjar包,我项目中用的是maven

具体步骤

开通smtp协议的邮箱

申请163之后可以在下图中看到163 帐号查看smtp协议,新申请的邮箱默认是没有开通的,可以按照提示一步一步开启。

下载Java Mail

这里使用的是maven,方便、高效,不用手动去扒。

代码

核心发送代码

package org.oscar.mail.service.impl;

import org.oscar.mail.service.ICommunicate;
import org.oscar.mail.support.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * Description :
 *
 * @author : oscar
 * @version :1.0, 2016/7/9
 */
public class JavaMailImpl implements ICommunicate {

    private static final Logger LOGGER = LoggerFactory.getLogger(JavaMailImpl.class);

    @Override
    public String sendSimpleMail(List<String> addressList, String title, Object content) {
        LOGGER.debug("|- Start send simple email...");

        Properties props = new Properties();
        //使用的邮件服务器类型
        props.setProperty(Constants.MAIL_HOST_KEY, Constants.MAIL_HOST_VALUE);
        //使用的认证方式
        props.setProperty(Constants.MAIL_AUTH_KEY, Constants.MAIL_AUTH_VALUE);

        Authenticator authenticator = new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(Constants.MAIL_USERNAME, Constants.MAIL_PASSWORD);
            }
        };

        Session session = Session.getInstance(props, authenticator);
        MimeMessage msg = new MimeMessage(session);
        try {
            // 设置邮件的发件人
            msg.setFrom(new InternetAddress(Constants.MAIL_FROM));
            // 设置收件人
            Address[] adds = convertAddress(addressList);
            msg.setRecipients(Message.RecipientType.TO, adds);
            // 设置邮件标题
            msg.setSubject(title);
            // 设置邮件内容
            msg.setContent(content, Constants.MAIL_TYPE);
            //发邮件
            Transport.send(msg);
        } catch (MessagingException e) {
            e.printStackTrace();
            return "Send failed, the reason:" + e.getMessage();
        }
        return " Send success";
    }



    /**
     * 将字符串类型邮箱地址转换为java mail能使用的邮箱地址
     * @param addressList 字符串类型邮箱地址集合
     * @return java mail使用的邮箱地址集合
     */
    private Address[] convertAddress(List<String> addressList) throws AddressException {
        List<Address> addresses = new ArrayList<>();
        for (String addressStr : addressList) {
            //这里没有做邮箱的合法性校验,只是做了非空和null
            if (addressStr != null && addressStr.length() > 0) {
                addresses.add(new InternetAddress(addressStr));
            }
        }
        return addresses.toArray(new Address[addresses.size()]);
    }
}

常量Constant.java

package org.oscar.mail.support;

/**
 * Description :
 *
 * @author : oscar
 * @version :1.0, 2016/7/9
 */
public class Constants {

    /*
     * 实际项目中可以将这段常量放在properties文件中。这里简单处理
     */
    public static final String MAIL_HOST_KEY = "mail.host";
    public static final String MAIL_HOST_VALUE = "smtp.163.com";
    public static final String MAIL_AUTH_KEY = "mail.smtp.auth";
    public static final String MAIL_AUTH_VALUE = "true";
    public static final String MAIL_FROM = "********@163.com";
    public static final String MAIL_TYPE = "text/html;charset=utf-8";
    public static final String MAIL_USERNAME = "********";
    public static final String MAIL_PASSWORD = "********";
}

测试代码

package org.oscar.mail.service.impl;

import org.junit.Before;
import org.junit.Test;

import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import java.util.ArrayList;
import java.util.List;

public class JavaMailImplTest {
    private JavaMailImpl javaMail;
    private List<String> addressList;

    @Before
    public void setUp() {
        javaMail = new JavaMailImpl();
        addressList = new ArrayList<>();
        addressList.add("[email protected]");
        addressList.add("[email protected]");
    }

    @Test
    public void testSendMail() throws Exception {
        //使用中文是为了验证是否有乱码
        String title = "来自Java Mail的邮件";
        String content = "<html><body><h1>您收到一封来自Java Mail的邮件,邮件内容是一张图片:</br></h1>" +
                "<img src=\"http://www.rgagnon.com/images/jht.gif\"/></body></html>";
        String result = javaMail.sendSimpleMail(addressList, title, content);
        System.out.println(result);
    }

}

结果展示

QQ邮箱收到的邮件

补充

这篇其实有很多的不足之处,可扩展之处,待下篇整理成一个完整的module。可以根据自己的需求调整和扩展。

猜你喜欢

转载自blog.csdn.net/chenghuaying/article/details/51869083