【Email】Java发送邮件接口与配置类

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 【Email】Java发送邮件接口与配置类

可能最近写博客时间不会很多,最近又在搞一个项目了。

发送邮件的类,我以前写过,不过写的不是接口封装的,现在自己项目用到了,就重新写了一下,现在把它分享出来给大家。


用得到的就可以拿过去,基本上不需要改什么就可以用的。


在这里我用到了3个类加一个接口。

其中一个类是实现发送邮件的。

另外一个类是发邮件方的配置类。

还有一个类是用来加密的。

接口的话,你只需要写一个实现类实现就可以了。


#MyEmail

package com.uifuture.utils.email;
/**
 * Created with IntelliJ IDEA.
 * User: 陈浩翔.
 * Date: 2017/3/15.
 * Time: 下午 12:33.
 * Explain:我们的发件邮箱类
 */
public class MyEmail {
    private String mainAdd;//发件邮箱地址
    private String mainName;//发件人的名称
    private String password;//发件邮箱密码-也叫授权码
    private String port;//发件邮箱端口
    private String mailHost;//设置邮件服务器主机名
    private String mailProtocol;// 发送邮件协议名称
    private String subject;//邮件内容:主题
    private String activeMailAdd;//邮件激活地址,未带状态以及用户id
    private String serviceMail;//客服邮箱
    private String helpCenterUrl;//网站帮助中心地址
    private String content;//邮件的正文内容
    public MyEmail() {
    }
    public MyEmail(String mainAdd, String mainName, String password, String port, String mailHost, String mailProtocol, String subject, String activeMailAdd, String serviceMail, String helpCenterUrl, String content) {
        this.mainAdd = mainAdd;
        this.mainName = mainName;
        this.password = password;
        this.port = port;
        this.mailHost = mailHost;
        this.mailProtocol = mailProtocol;
        this.subject = subject;
        this.activeMailAdd = activeMailAdd;
        this.serviceMail = serviceMail;
        this.helpCenterUrl = helpCenterUrl;
        this.content = content;
    }
    public String getMainAdd() {
        return mainAdd;
    }
    public void setMainAdd(String mainAdd) {
        this.mainAdd = mainAdd;
    }
    public String getMainName() {
        return mainName;
    }
    public void setMainName(String mainName) {
        this.mainName = mainName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getPort() {
        return port;
    }
    public void setPort(String port) {
        this.port = port;
    }
    public String getMailHost() {
        return mailHost;
    }
    public void setMailHost(String mailHost) {
        this.mailHost = mailHost;
    }
    public String getMailProtocol() {
        return mailProtocol;
    }
    public void setMailProtocol(String mailProtocol) {
        this.mailProtocol = mailProtocol;
    }
    public String getSubject() {
        return subject;
    }
    public void setSubject(String subject) {
        this.subject = subject;
    }
    public String getActiveMailAdd() {
        return activeMailAdd;
    }
    public void setActiveMailAdd(String activeMailAdd) {
        this.activeMailAdd = activeMailAdd;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public String getServiceMail() {
        return serviceMail;
    }
    public void setServiceMail(String serviceMail) {
        this.serviceMail = serviceMail;
    }
    public String getHelpCenterUrl() {
        return helpCenterUrl;
    }
    public void setHelpCenterUrl(String helpCenterUrl) {
        this.helpCenterUrl = helpCenterUrl;
    }
}

#SendEmail

package com.uifuture.utils.email;
/**
 * Created with IntelliJ IDEA.
 * User: 陈浩翔.
 * Date: 2017/3/15.
 * Time: 下午 12:20.
 * Explain:用户发送邮件必须实现的接口
 */
public interface SendEmail {
  public String getId();
  public String getToken();
  public String getName();
  public String getEmail();
}


#PasswordUtil

package com.uifuture.utils.pass;
/**
 * 密码加密工具
 */
public class PasswordUtil {
    /**
     * 用户登录等密码的加密方法
     * @param password
     * @param salt
     * @return
     */
    public static String getPassword(String password, String salt) {
        return MD5Util.md5Encode(MD5Util.md5Encode(password) + salt);
    }
    /**
     * 生成 token 的方式-验证的令牌
     * 在用户点击验证邮箱地址时使用,密码使用的是加密后的密码!
     * @param loginName
     * @param password
     * @return
     */
    public static String getToken(String loginName, String password){
        return getPassword(MD5Util.md5Encode(loginName+password), MD5Util.md5Encode(password));
    }
}


#SendEmailCallable

package com.uifuture.utils.email;
import com.sun.mail.util.MailSSLSocketFactory;
import org.apache.log4j.Logger;
import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.Properties;
import java.util.concurrent.Callable;
/**
 * Created with IntelliJ IDEA.
 * User: 陈浩翔.
 * Date: 2017/3/15.
 * Time: 下午 1:07.
 * Explain:发送邮件的实现类,此类继承了Thread,实现多线程发送邮件,调用start方法运行run函数
 */
public class SendEmailCallable implements Callable {
    private static Logger logger = Logger.getLogger(SendEmailCallable.class);
    private MyEmail myEmail;
    private SendEmail sendEmail;
    public SendEmailCallable() {
    }
    public SendEmailCallable(MyEmail myEmail, SendEmail sendEmail) {
        this.myEmail = myEmail;
        this.sendEmail = sendEmail;
    }
    public Object call() throws Exception {
        // 跟smtp服务器建立一个连接
        Properties p = new Properties();
        // 设置邮件服务器主机名
        p.setProperty("mail.host", myEmail.getMailHost());// 指定邮件服务器,默认端口 25
        // 发送服务器需要身份验证
        p.setProperty("mail.smtp.auth", "true");// 要采用指定用户名密码的方式去认证
        // 发送邮件协议名称
        p.setProperty("mail.transport.protocol", myEmail.getMailProtocol());
        p.setProperty("mail.smtp.port", "465");
        // 开启SSL加密,否则会失败
        MailSSLSocketFactory sf = null;
        try {
            sf = new MailSSLSocketFactory();
        } catch (GeneralSecurityException e1) {
            logger.error("开启SSL加密失败,出现GeneralSecurityException异常!用户ID为:"+sendEmail.getId()+",给" + sendEmail.getToken() + "发送邮件失败!");
            e1.printStackTrace();
        }
        // 开启debug调试,以便在控制台查看
        //p.setProperty("mail.debug", "true");
        sf.setTrustAllHosts(true);
        p.put("mail.smtp.ssl.enable", "true");
        p.put("mail.smtp.ssl.socketFactory", sf);
        Session session = Session.getDefaultInstance(p, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                // 用户名可以用邮箱的别名
                PasswordAuthentication pa = new PasswordAuthentication(
                        myEmail.getMainAdd(), myEmail.getPassword());
                // 后面的字符是授权码!
                return pa;
            }
        });
        //session.setDebug(true);// 设置打开调试状态
        try {
            // 声明一个Message对象(代表一封邮件),从session中创建
            MimeMessage msg = new MimeMessage(session);
            // 邮件信息封装
            // 1发件人
            msg.setFrom(new InternetAddress(myEmail.getMainAdd(), myEmail.getMainName(), "UTF-8"));
            // 2收件人
            msg.setRecipient(Message.RecipientType.TO, new InternetAddress(sendEmail.getEmail()));
            // 3邮件内容:主题、内容
            msg.setSubject(sendEmail.getName() + "," + myEmail.getSubject());
            // StringBuilder是线程不安全的,但是速度快,这里因为只会有这个线程来访问,所以可以用这个
            StringBuilder sbd = new StringBuilder();
            sbd.append("<!DOCTYPE html><html><head><meta charset='UTF-8'>" +
                    "<title>UIF邮箱激活</title>" +
                    "</head><body>" +
                    "<table style='background: #fff; border-collapse: collapse; border-spacing: 0; color: #222; font-size: 16px; height: 100%; margin: 0; padding: 0; width: 100%'bgcolor='#fff'>" +
                    "<tbody><tr><td style='-moz-hyphens: auto; -webkit-hyphens: auto; border-collapse: collapse !important; color: #222;  font-size: 16px; hyphens: auto; margin: 0; padding: 0; text-align: center; word-break: break-word'valign='top'align='center'>" +
                    "<center><table style='border-collapse: collapse; border-spacing: 0; font-size: 16px; line-height: 1.5; margin: 0 auto; max-width: 680px; min-width: 300px; width: 95%'>" +
                    "<tbody><tr><td style='-moz-hyphens: auto; -webkit-hyphens: auto; border-collapse: collapse !important; color: #222; font-family: font-size: 16px; hyphens: auto; margin: 0; padding: 0; word-break: break-word'>" +
                    "<hr style='background: #ddd; border: none; color: #ddd; height: 1px; margin: 20px 0 30px'>" +
                    "<table style='border-collapse: collapse; border-spacing: 0'width='100%'>" +
                    "<tbody><tr><td style='-moz-hyphens: auto; -webkit-hyphens: auto; border-collapse: collapse !important; color: #222; font-size: 16px; hyphens: auto; margin: 0; padding: 0; word-break: break-word'>" +
                    "<div><p style='color: #222;  font-size: 16px; margin: 0 0 10px; padding: 0'>" +
                    sendEmail.getName() + ",你好!" +
                    "</p><p style='color: #222;  font-size: 16px; margin: 0 0 10px; padding: 0'>" +
                    myEmail.getContent() +
                    "</p><p style='color: #222; font-size: 16px; margin: 24px 0; padding: 0'>" +
                    "<a href='" +
                    myEmail.getActiveMailAdd() + "/" + sendEmail.getToken() +
                    "'target='_blank'style='background: #83a198; border-radius: 4px; color: #fff; padding: 8px 16px; text-decoration: none; word-break: break-all'>" +
                    myEmail.getActiveMailAdd() + "/" + sendEmail.getToken() +
                    "</a></p><p style='color: #999999;  font-size: 12px; margin: 0 0 10px; padding: 0'>" +
                    "如果你没有使用过UIFuture,请忽略此邮件。" +
                    "</p></div></td></tr></tbody></table>" +
                    "<hr style='background: #ddd; border: none; color: #ddd; height: 1px; margin: 20px 0'>" +
                    "<table style='border-collapse: collapse; border-spacing: 0'width='100%'>" +
                    "<tbody><tr><td colspan='2'style='-moz-hyphens: auto; -webkit-hyphens: auto; border-collapse: collapse !important; color: #222;font-size: 16px; hyphens: auto; margin: 0; padding: 0; word-break: break-word'align='center'>" +
                    "<p style='color: #999999; font-size: 12px; margin: 0 0 10px; padding: 0'>" +
                    "如有疑问请联系我们:" +
                    "<a href='mailto:" +
                    myEmail.getServiceMail() +
                    "'style='color: #999999; text-decoration: underline'target='_blank'>" +
                    myEmail.getServiceMail() +
                    "</a>" +
                    "或进入" +
                    "<a href='" +
                    myEmail.getHelpCenterUrl() +
                    "'target='_blank'style='color: #999999; text-decoration: underline'>帮助中心" +
                    "</a></p></td></tr></tbody></table></td></tr></tbody></table></center></td></tr></tbody></table></body></html>");
            msg.setContent(sbd.toString(), "text/html;charset=utf-8");// 发html格式的文本
            // 发送动作
            Transport.send(msg);
            logger.info("用户ID为:"+sendEmail.getId()+",给" + sendEmail.getEmail()  + "发送邮件成功...");
            return 1;
        } catch (AddressException e) {
            logger.error("用户ID为:"+sendEmail.getId()+",给" + sendEmail.getEmail()  + "发送邮件失败,异常信息:" + e.getMessage());
            return "用户ID为:"+sendEmail.getId()+",给" + sendEmail.getEmail()  + "发送邮件失败,异常信息:" + e.getMessage();
        } catch (MessagingException e) {
            logger.error("用户ID为:"+sendEmail.getId()+",给" + sendEmail.getEmail()  + "发送邮件失败,异常信息:" + e.getMessage());
            return "用户ID为:"+sendEmail.getId()+",给" + sendEmail.getEmail()  + "发送邮件失败,异常信息:" + e.getMessage();
        } catch (UnsupportedEncodingException e) {
            logger.error("用户ID为:"+sendEmail.getId()+",给" + sendEmail.getEmail() + "发送邮件失败,异常信息:" + e.getMessage());
            return "用户ID为:"+sendEmail.getId()+",给" + sendEmail.getEmail()  + "发送邮件失败,异常信息:" + e.getMessage();
        }
    }
}


#TestMail测试类

package com.uifuture.utilsTest;
import com.uifuture.utils.UUID;
import com.uifuture.utils.email.MyEmail;
import com.uifuture.utils.email.SendEmail;
import com.uifuture.utils.email.SendEmailCallable;
import com.uifuture.utils.pass.PasswordUtil;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
 * Created with IntelliJ IDEA.
 * User: 陈浩翔.
 * Date: 2017/3/15.
 * Time: 下午 12:28.
 * Explain:测试邮件发送类
 */
public class TestMail{
    static String mail =
    "**@qq.com"; //通过
    //"**@outlook.com"; //通过
    //"**@sina.com";//通过
    //"**@163.com"; //163
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyEmail myEmail = new MyEmail();
        myEmail.setMainAdd("**@uifuture.com");
        myEmail.setMainName("UIFuture");
        myEmail.setPassword("******");//密码
        myEmail.setPort("465");
        myEmail.setActiveMailAdd("http://uifuture.com/active/email");
        myEmail.setContent("感谢选择UIFuture,祝您使用愉快,点击下面链接验证邮箱(邮箱验证30分钟后过期):");
        myEmail.setHelpCenterUrl("http://uifuture.com/helpCenterUrl");
        myEmail.setMailHost("smtp.uifuture.com");
        myEmail.setServiceMail("**@uifuture.com");//客服邮箱
        myEmail.setMailProtocol("smtp");// 发送邮件协议名称
        myEmail.setSubject("这是主题!!!");
        //创建一个线程池
        ExecutorService pool = Executors.newFixedThreadPool(1);
        //创建1个有返回值的任务
        SendEmailCallable sendEmailCallable =
                new SendEmailCallable(myEmail, new SendMail());
        // 提交并执行任务,任务启动时返回了一个Future对象,
        // 如果想得到任务执行的结果或者是异常可对这个Future对象进行操作
        Future future = pool.submit(sendEmailCallable);
        //从Future对象上获取任务的返回值,并输出到控制台
        System.out.println(future.get().toString());//Future的 get 方法等待计算完成,获取计算结果
        //关闭线程池
        pool.shutdown();
        ;
    }
}
class SendMail implements SendEmail{
    public String getId() {
        return UUID.getUUID();
    }
    public String getToken() {
        return PasswordUtil.getToken(getName(),getId());
    }
    public String getName() {
        return "chenhaoxiang";
    }
    public String getEmail() {
        return TestMail.mail;
    }
}

#收到邮件后的效果:

image.png

目录
相关文章
|
10天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
1天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
|
1天前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
16 1
|
10天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
11天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
27 1
|
15天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
55 4
|
17天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
44 4
|
15天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
34 2
|
Java 测试技术 数据安全/隐私保护
SpringBoot整合Java Mail实现Outlook / Office365发送邮件
日常开发过程中,我们经常需要使用到邮件发送任务,比方说验证码的发送、日常信息的通知等。日常比较常用的邮件发送方包括:163、QQ等,本文主要讲解Outlook SMTP的开启方式、OutLook STARTTTL的配置、如何通过JavaMail来实现电子邮件的发送等。
8365 0
SpringBoot整合Java Mail实现Outlook / Office365发送邮件
|
安全 Java 网络安全
利用java实现发送邮件
电子邮件的应用非常广泛,常见的如在某网站注册了一个账户,自动发送一封激活邮件,通过邮件找回密码,自动批量发送活动信息等。很显然这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。
2758 0
下一篇
无影云桌面