前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Email】Java发送邮件接口与配置类

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

作者头像
谙忆
发布2021-01-21 14:43:40
发布2021-01-21 14:43:40
66900
代码可运行
举报
文章被收录于专栏:程序编程之旅程序编程之旅
运行总次数:0
代码可运行

说明

这文章17年的,不知道为啥,被放到草稿箱了。现在发表下。

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自大学之旅_谙忆的博客

可能最近写博客时间不会很多,最近又在搞一个项目了。 发送邮件的类,我以前写过,不过写的不是接口封装的,现在自己项目用到了,就重新写了一下,现在把它分享出来给大家。

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

在这里我用到了3个类加一个接口。 其中一个类是实现发送邮件的。 另外一个类是发邮件方的配置类。 还有一个类是用来加密的。 接口的话,你只需要写一个实现类实现就可以了。

#MyEmail

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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测试类

代码语言:javascript
代码运行次数:0
运行
复制
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;
    }
}

#收到邮件后的效果:

 本文章由[谙忆]编写, 所有权利保留。 欢迎转载,分享是进步的源泉。

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自大学之旅_谙忆的博客

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档