java集成exchange邮箱


maven项目
原文为
https://blog.csdn.net/xiaoxiaosu_37/article/details/53385289
https://blog.csdn.net/zwqhehe/article/details/104171528

1.导入依赖

 
     javax.mail
     mail
     1.5.0-b01
 

2.实体类生成

import java.util.Vector;

public class Exchange {
	private String displayName;
	private String to;
	private String from;
	private String smtpServer;
	private String username;
	private String password;
	private String subject;
	private String content;
	private boolean isExchange;
	private String domain;
	private boolean ifAuth;
	private String filename;
	private Vector file = new Vector(); // 用于保存发送附件的文件名的集合

	public String getDisplayName() {
		return displayName;
	}

	public void setDisplayName(String displayName) {
		this.displayName = displayName;
	}

	public String getTo() {
		return to;
	}

	public void setTo(String to) {
		this.to = to;
	}

	public String getFrom() {
		return from;
	}

	public void setFrom(String from) {
		this.from = from;
	}

	public String getSmtpServer() {
		return smtpServer;
	}

	public void setSmtpServer(String smtpServer) {
		this.smtpServer = smtpServer;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	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 boolean isExchange() {
		return isExchange;
	}

	public void setExchange(boolean exchange) {
		isExchange = exchange;
	}

	public String getDomain() {
		return domain;
	}

	public void setDomain(String domain) {
		this.domain = domain;
	}

	public boolean isIfAuth() {
		return ifAuth;
	}

	public void setIfAuth(boolean ifAuth) {
		this.ifAuth = ifAuth;
	}

	public String getFilename() {
		return filename;
	}

	public void setFilename(String filename) {
		this.filename = filename;
	}

	public Vector getFile() {
		return file;
	}

	public void setFile(Vector file) {
		this.file = file;
	}

	/**
	 * @param smtpServer 发送服务器地址
	 * @param from 发送人地址
	 * @param displayName 发送人发送名
	 * @param to 接收人
	 * @param subject 主题
	 * @param content 内容
	 * @param isExchange 是否验证
	 * @param domain 域名
	 * @param username 用户登录名
	 * @param password 密码
	 */
	public Exchange(String smtpServer, String from, String displayName, String to,
                    String subject, String content, boolean isExchange, String domain,
                    String username, String password) {
		this.smtpServer = smtpServer;
		this.from = from;
		this.displayName = displayName;
		this.ifAuth = true;
		this.to = to;
		this.subject = subject;
		this.content = content;
		this.isExchange = isExchange;
		this.domain = domain;
		this.username = username;
		this.password = password;
	}
}
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class MailAuthenticator extends Authenticator {

    /**
     * 用户名(登录邮箱)
     */

    private String username;
    /**
     * 密码
     */
    private String password;

    /**
     * 初始化邮箱和密码
     *
     * @param username 邮箱
     * @param password 密码
     */
    public MailAuthenticator(String username, String password) {
        this.username = username;
        this.password = password;
    }

    String getPassword() {
        return password;
    }

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

    String getUsername() {
        return username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setUsername(String username) {
        this.username = username;
    }

}

2.工具类

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Properties;

public class ExchangeMail {
    /**
     * 发送邮件
     */
    public static HashMap send(Exchange exchange) {
        HashMap map = new HashMap<>();
        map.put("state", "success");
        String message = "邮件发送成功!";
        Session session = null;
        Properties props = System.getProperties();
        props.put("mail.smtp.host", exchange.getSmtpServer());
        if (exchange.isExchange()) {
            if (exchange.getDomain() == null || exchange.getDomain().equals("")) {
                throw new RuntimeException("domain is null");
            }
            props.setProperty("mail.smtp.auth.ntlm.domain", exchange.getDomain());
        }
        if (exchange.isIfAuth()) { // 服务器需要身份认证
            props.put("mail.smtp.auth", "true");
            MailAuthenticator smtpAuth = new MailAuthenticator(exchange.getUsername(), exchange.getPassword());
            session = Session.getDefaultInstance(props, smtpAuth);
        } else {
            props.put("mail.smtp.auth", "false");
            session = Session.getDefaultInstance(props, null);
        }
        session.setDebug(true);
        Transport trans = null;
        try {
            Message msg = new MimeMessage(session);
            try {
                Address from_address = new InternetAddress(exchange.getFrom(), exchange.getDisplayName());
                msg.setFrom(from_address);
            } catch (java.io.UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            InternetAddress[] address = {new InternetAddress(exchange.getTo())};
            msg.setRecipients(Message.RecipientType.TO, address);
            msg.setSubject(exchange.getSubject());
            //设置传输文件
            Multipart mp = new MimeMultipart();
            MimeBodyPart mbp = new MimeBodyPart();
            mbp.setContent(exchange.getContent().toString(), "text/html;charset=gb2312");
            mp.addBodyPart(mbp);
            if (!exchange.getFile().isEmpty()) {// 有附件
                Enumeration efile = exchange.getFile().elements();
                while (efile.hasMoreElements()) {
                    mbp = new MimeBodyPart();
                    exchange.setFilename(efile.nextElement().toString()); // 选择出每一个附件名
                    FileDataSource fds = new FileDataSource(exchange.getFilename()); // 得到数据源
                    mbp.setDataHandler(new DataHandler(fds)); // 得到附件本身并至入BodyPart
                    mbp.setFileName(fds.getName()); // 得到文件名同样至入BodyPart
                    mp.addBodyPart(mbp);
                }
                exchange.getFile().removeAllElements();
            }
            msg.setContent(mp); // Multipart加入到信件
            msg.setSentDate(new Date()); // 设置信件头的发送日期
            // 发送信件
            msg.saveChanges();
            trans = session.getTransport("smtp");
            trans.connect(exchange.getSmtpServer(), exchange.getUsername(), exchange.getPassword());
            trans.sendMessage(msg, msg.getAllRecipients());
            trans.close();

        } catch (AuthenticationFailedException e) {
            map.put("state", "failed");
            message = "邮件发送失败!错误原因:\n" + "身份验证错误!";
            e.printStackTrace();
        } catch (MessagingException e) {
            message = "邮件发送失败!错误原因:\n" + e.getMessage();
            map.put("state", "failed");
            e.printStackTrace();
            Exception ex = null;
            if ((ex = e.getNextException()) != null) {
                System.out.println(ex.toString());
                ex.printStackTrace();
            }
        }
        // System.out.println("\n提示信息:"+message);
        map.put("message", message);
        return map;
    } 

3.测试类

    1. 使用qq邮箱进行发送
    1. smtp地址为 smtp.qq.com stmp地址输入建议使用要发送邮件的邮箱在foxmail中验证邮箱类型以及其他信息,防止信息错误造成连接失败等问题
    1. domain域为 mail.qq.com
    1. from为发送地址与username相同为自己的邮箱
    public void test() {
        //设置SMTP服务器地址
        String smtpServer = "smtp.qq.com";
        //设置发件人的地址
        String from = "111111@qq.com";
        String userName = "111111@qq.com";
        String password = "111111";
        String displayName = "exchange mail";
        String to = "111111@163.com";
        String domain = "mail.qq.com";
        String subject = "主题";
        String content = "内容";
        Exchange exchange = new Exchange(smtpServer, from, displayName,
                to, subject, content, true, domain,
                userName, password);
        ExchangeMail.send(exchange);
    }