手机扫一扫访问本页内容

微信扫描点右上角"···"分享到好友或朋友圈

关闭
微信扫一扫可打开小程序

微信长按图片或搜“分享录”可打开小程序

关闭
Java ,

Java实现发邮件

由于个人网站之前已经用PHP实现评论邮件通知功能,今天给小程序也加上这个功能,小程序后台接口是用Java做的,所以用java来实现发邮件。要想实现发送邮件功能必须有专门的邮件服务器,可以自己搭也可以用第三方的。这些邮件服务器类就像现实生活中的邮局,主要负责接收用户发送过来的邮件,并把邮件投递到接收者的电子邮箱中。
常用的电子邮件协议有SMTP、POP3和IMAP4,它们都隶属于TCP/IP协议簇,默认状态下分别通过TCP端口25、110和143建立连接。
SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。
POP3(Post Office Protocol – Version 3)即邮局协议的第3个版本,由RFC1939 定义,是因特网电子邮件的第一个离线协议标准。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S。
IMAP4(Internet Message Access Protocol 4) 即 交互式数据消息访问协议第四个版本。IMAP协议是由斯坦福大学的Mark Crispin教授在1986年开发的,后期版本是华盛顿州立大学进行开发的,现在的版本是“IMAP第四版第一次修订版”(IMAP4rev1)。
实际上SMTP已是事实上的E-Mail传输的标准,这里SMTP服务器来讲解,为了简单方便这里直接使用QQ的邮箱服务器smtp.qq.com,首先要花一毛钱去申请个授权码,之前在讲GitLab配邮件功能时也讲过如何申请授权码,具体操作如下图:

接着引入依赖包implementation “com.sun.mail:javax.mail:1.6.2”,我这里用的是Gradle,你们用maven的在pom.xml中引入:

接下来直接上代码:

package cn.xubingtao.backend.miniprogram.utils;

import com.sun.mail.util.MailSSLSocketFactory;

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.net.MalformedURLException;
import java.net.URL;
import java.security.GeneralSecurityException;
import java.util.Properties;

/**
 * 邮件工具类
 * @Author Xu Bingtao
 * @Email 1399898086@qq.com
 * @DateTime 2020/6/13 09:39
 */
public class EmailUtil {

    public static final String HOST = "smtp.qq.com";
    public static final int PORT = 465;
    public static final String PROTOCOL = "smtp";
    public static final String ISAUTH = "true";
    public static final String ISENABLESSL = "true";
    public static final String PASSWORD = "16位的授权码,不是登录密码!";
    public static final String USERNAME = "1399898086@qq.com";
    public static final String FROM = "1399898086@qq.com";//from跟username必须相同不然报:501 Mail from address must be same as authorization user.
    public static final String TO = "1399898086@qq.com";
    private static final String SUBJECT = "文章有新评论待审批通知";
    private static final String CONTENT = "您题为《xx》的文章在小程序中被微信昵称叫:xxx评论录,访问IP为:xxxx,评论内容为:xxx,请您尽快审批。";
    private static final String TEXTHTML = "text/html;charset=UTF-8";
    private static final boolean ISSETDEBUG = false;

    /**
     * 发送文本邮件
     */
    public static int sendTextEmail(String subject, String content, String to)
            throws MessagingException, GeneralSecurityException {
        if(StringUtil.isBlank(subject) || StringUtil.isBlank(content) || StringUtil.isBlank(to)) {
            return -1;
        }
        //1.创建一个配置文件并设置相关配置信息
        Properties properties = new Properties();
        properties.setProperty("mail.host", HOST);
        properties.setProperty("mail.transport.protocol", PROTOCOL);
        properties.setProperty("mail.smtp.auth", ISAUTH);
        MailSSLSocketFactory sf = sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        properties.put("mail.smtp.ssl.enable", ISENABLESSL);
        properties.put("mail.smtp.ssl.socketFactory", sf);
        //2.创建整个应用程序所需的环境信息 Session 对象
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USERNAME, PASSWORD);
            }
        });
        //开启debug模式会打印发邮件日志
        session.setDebug(ISSETDEBUG);
        //3、通过session获取Transport连接对象
        Transport transport = session.getTransport();
        //4、通过邮箱账号和授权码连接邮箱服务器,不加端口或者传-1会默认使用465端口
        transport.connect(HOST, USERNAME, PASSWORD);
        //5、传入session对象,创建邮件对象并设置相关信息
        MimeMessage mimeMessage = new MimeMessage(session);
        //5.1设置邮件发送人
        mimeMessage.setFrom(new InternetAddress(FROM));
        //5.2设置邮件接收人
        mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
        //5.3设置邮件主题
        mimeMessage.setSubject(subject);
        //5.4设置邮件内容
        mimeMessage.setContent(content, TEXTHTML);
        //6.发送邮件
        transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
        //7.关闭连接
        transport.close();
        return 1;
    }

    /**
     * 发送图文、附件邮件
     * @return
     * @throws GeneralSecurityException
     * @throws MessagingException
     */
    public static int sendMIMEEmail() throws GeneralSecurityException, MessagingException, MalformedURLException {
        Properties prop = new Properties();
        prop.setProperty("mail.host", HOST); //// 设置QQ邮件服务器
        prop.setProperty("mail.transport.protocol", PROTOCOL); // 邮件发送协议
        prop.setProperty("mail.smtp.auth", ISAUTH); // 需要验证用户名密码
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable", ISENABLESSL);
        prop.put("mail.smtp.ssl.socketFactory", sf);
        Session session = Session.getDefaultInstance(prop, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //传入发件人的姓名和授权码
                return new PasswordAuthentication(USERNAME, PASSWORD);
            }
        });
        session.setDebug(ISSETDEBUG);
        Transport transport = session.getTransport();
        transport.connect(HOST, USERNAME, PASSWORD);
        MimeMessage mimeMessage = mimeEmail(session);
        //5、发送邮件
        transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
        //6、关闭连接
        transport.close();
        return 1;
    }

    private static MimeMessage mimeEmail(Session session) throws MessagingException, MalformedURLException {
        //消息的固定信息
        MimeMessage mimeMessage = new MimeMessage(session);
        mimeMessage.setFrom(new InternetAddress(FROM));
        mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(TO));
        mimeMessage.setSubject("这是带有图文和附件的邮件");
        //邮件内容
        //准备图片数据
        MimeBodyPart image = new MimeBodyPart();
//        DataHandler handler = new DataHandler(new FileDataSource("/Volumes/Mac-Program/Dev/Mac/mail/test/wxxcx.jpg"));
        DataHandler handler = new DataHandler(new URL("https://www.xubingtao.cn/wp-content/uploads/2020/06/wxxcx.jpg"));
        image.setDataHandler(handler);
        //设置图片id
        image.setContentID("test.jpg");
        //准备文本
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("这是我的小程序二维码,微信扫码或搜索xubingtao可在小程序上看我的网站<br><img src='cid:test.jpg'>","text/html;charset=utf-8");
        //附件
        MimeBodyPart appendix = new MimeBodyPart();
        appendix.setDataHandler(new DataHandler(new FileDataSource("/Volumes/Mac-Program/Dev/Mac/mail/test/test.txt")));
        appendix.setFileName("test.txt");
        //拼装邮件正文
        MimeMultipart mimeMultipart = new MimeMultipart();
        mimeMultipart.addBodyPart(image);
        mimeMultipart.addBodyPart(text);
        mimeMultipart.setSubType("related");//文本和图片内嵌成功
        //将拼装好的正文内容设置为主体
        MimeBodyPart contentText = new MimeBodyPart();
        contentText.setContent(mimeMultipart);
        //拼接附件
        MimeMultipart allFile = new MimeMultipart();
        allFile.addBodyPart(appendix);//附件
        allFile.addBodyPart(contentText);//正文
        allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed
        //放到Message消息中
        mimeMessage.setContent(allFile);
        mimeMessage.saveChanges();//保存修改
        return mimeMessage;
    }

    public static void main(String[] args) throws MessagingException, GeneralSecurityException, MalformedURLException {
//        sendTextEmail(SUBJECT,CONTENT,TO);
        sendMIMEEmail();
    }
}

运行后就能收到邮件了:


历史上的今天:

展开阅读全文


上一篇:

下一篇:

您还可以访问本站的小程序、公众号等所有端,或者下载APP, 在小程序、APP上可以评论文章以及保存图片还有在线客服哦,如您有任何疑问或建议可向作者提出意见反馈
关注我的公众号每天为您分享各类有用信息
扫码打开小程序可评论文章保存图片,在“我的”有实时在线客服哦,看效果?
分享录多端跨平台系统
分享录交流群