Java implementation of the e-mail function --- NetEase mailbox

Java implementation of the e-mail function

Foreword

E-mail is widely used application scenarios, such as adding new users, send instant discount lists by e-mail password recovery, monitoring daemon, abnormal automatic e-mail notification appears and so on.

In this paper, NetEase mailbox, for example, send messages to achieve functions through Java code.

Development environment

Please refer to: Based SpringBoot sub-module building project

Code

  1. pom.xml introduced dependence

    <properties>
        <java.version>1.8</java.version>
        <!-- 你的其他依赖... -->
        <javax.mail.version>1.6.0</javax.mail.version>
    </properties>
    
    <dependencies>
        <!-- 你的其他依赖... -->
        <!-- 发送短信 -->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>${javax.mail.version}</version>
        </dependency>
    </dependencies>
  2. Send Mail Tools

    package com.wayne.common.utils;
    
    import com.wayne.common.entity.CmsMailConfig;
    import com.wayne.common.vo.MailVo;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import javax.mail.*;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.util.Date;
    import java.util.Properties;
    
    /**
     * 发送邮件工具类
     * @author Wayne
     * @date 2019/6/19
     */
    @Component
    public class MailUtils {
    
        /**
         * 发送邮件
         * @param isSingle 是否单发: true-单发 false-群发
         * @param mailVo 邮件内容
         * @param sendTime 发送时间, 如果为null,表示立即发送
         * @param mailConfig 发件人信息及授权
         */
        public void sendMail(Boolean isSingle, MailVo mailVo, Date sendTime, CmsMailConfig mailConfig) throws MessagingException {
            Session session = this.authenticationMail();
            MimeMessage message = getMimeMessage(isSingle, session, mailConfig.getMailAccount(), mailVo.getRecipients());
            message = getContent(message, mailVo.getMailTiTle(), mailVo.getMailContent(), sendTime);
    
            Transport transport = session.getTransport();
            transport.connect(mailConfig.getMailAccount(), mailConfig.getMailLicense());
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        }
    
        /**
         * 校验发送的邮件内容
         */
        private MimeMessage getContent(MimeMessage message, String messageTitle, String messageContent, Date sendTime) throws MessagingException {
            if (null == messageTitle) {
                throw new MessagingException("邮件标题不能为空");
            }
            if (null == messageContent) {
                throw new MessagingException("邮件内容不能为空");
            }
            sendTime = sendTime == null ? new Date() : sendTime;
            message.setSubject(messageTitle, "UTF-8");
            message.setContent(messageContent, "text/html;charset=UTF-8");
            message.setSentDate(sendTime);
            return message;
        }
    
        /**
         * 验证认证信息
         */
        private Session authenticationMail() throws MessagingException {
            Session session;
            try {
                Properties props = new Properties();
                //设置用户的认证方式
                props.setProperty("mail.smtp.auth", "true");
                //设置传输协议
                props.setProperty("mail.transport.protocol", "smtp");
                //设置发件人的SMTP服务器地址
                props.setProperty("mail.smtp.host", "smtp.163.com");
                session = Session.getInstance(props);
                session.setDebug(true);
            } catch (Exception e) {
                e.printStackTrace();
                throw new MessagingException("认证失败");
            }
            return session;
        }
    
        /**
         * @param isSingle 是否单发
         *                 <P>true-向指定的一个收件人发送邮件,比如:找回密码、登录验证
         *                 <P>false-向多个收件人群发邮件,比如:优惠活动推送
         *                 <P>群发时多个收件人之间用英文逗号','分割
         * @param senderAddress 发件人地址
         * @param recipientAddress 收件人地址
         */
        private MimeMessage getMimeMessage(Boolean isSingle, Session session, String senderAddress, String recipientAddress) throws MessagingException {
            MimeMessage message = new MimeMessage(session);
            try {
                message.setFrom(new InternetAddress(senderAddress));
            } catch (MessagingException e) {
                throw new MessagingException("发件人地址错误");
            }
            /*
              设置收件人地址
              MimeMessage.RecipientType.TO:发送
              MimeMessage.RecipientType.CC:抄送
              MimeMessage.RecipientType.BCC:密送
             */
            if (isSingle) {
                message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(recipientAddress));
            } else {
                message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientAddress));
            }
            return message;
        }
    }
  3. Message content objects -MailVo

    package com.wayne.common.vo;
    
    import lombok.Data;
    
    /**
     * @author Wayne
     * @date 2019/6/24
     */
    @Data
    public class MailVo {
        /**
         * 邮件标题
         */
        private String mailTiTle;
        /**
         * 邮件内容
         */
        private String mailContent;
        /**
         * 收件人(们)
         */
        private String recipients;
    }
  4. Sender information and authorization

    Note: Here I assume that there are multiple senders, and uncertain, you can dynamically add, select which is sent by the sender, so I'll sender information stored in the database. If your application sender is fixed, here to write in the project or with the configuration file!

    We need to enter a password when sending mail properly, log on to our email account. Sent by e-mail program does not require login passwords, but the use of the authorization code, NetEase mailbox to obtain an authorization code as follows

    1. Enable Authorization

    Start Authorization

    1. Authorization code

    Authorization code

    package com.wayne.common.entity;
    
    import lombok.Data;
    
    import javax.persistence.*;
    
    @Data
    @Table(name = "cms_mail_config")
    public class CmsMailConfig {
        /**
         * 主键
         */
        @Id
        @Column(name = "MAIL_ID")
        private Integer mailId;
    
        /**
         * 邮箱账号
         */
        @Column(name = "MAIL_ACCOUNT")
        private String mailAccount;
    
        /**
         * 授权码
         */
        @Column(name = "MAIL_LICENSE")
        private String mailLicense;
    
        /**
         * 状态,0:使用,1:未使用
         */
        @Column(name = "IS_USE")
        private String isUse;
    
        /**
         * 是否删除,0:否,1:是
         */
        @Column(name = "IS_DELETE")
        private String isDelete;
    
        /**
         * 创建者ID
         */
        @Column(name = "CREATE_ADMIN_ID")
        private Integer createAdminId;
    
        @Column(name = "EXTEND1")
        private String extend1;
    
        @Column(name = "EXTEND2")
        private String extend2;
    
        @Column(name = "EXTEND3")
        private String extend3;
    
        @Column(name = "EXTEND4")
        private String extend4;
    
        @Column(name = "EXTEND5")
        private String extend5;
    
        @Column(name = "EXTEND6")
        private String extend6;
    }
  5. Service

    @Override
    public ResponseBean sendMails(MailVo mailVo) {
        if (null == mailVo) {
            return ResponseBean.createInstance(Boolean.FALSE, 400, "参数异常");
        }
        // 获取当前正在使用的发件人配置
        List<CmsMailConfig> mailConfigList = mailConfigMapper.selectCurrUseMailConfig();
        if (null == mailConfigList || mailConfigList.size() != 1) {
            return ResponseBean.createInstance(Boolean.FALSE, 400, "参数异常");
        }
    
        try {
            // 发送邮件
            mailUtils.sendMail(Boolean.FALSE, mailVo, null, mailConfigList.get(0));
            return ResponseBean.createInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResponseBean.createInstance(Boolean.FALSE, 400, "参数异常");
    }
  6. Controller

    @PostMapping("/mail/sendMails")
    public ResponseBean sendMails(MailVo mailVo) {
        return mailService.sendMails(mailVo);
    }

effect

Here to send a manual transmission main experience code feature. Specific application scenario according to an actual production environment adaptable. For example: By combining task timer, time to send daily reports; detecting when a user logs address is not a common address, e-mail automatically notify the user; when the user logs in general, triggering send a message to the administrator, etc.

send

accept

Conclusion

No. I have opened the public are welcome to come to irrigation

No public

Guess you like

Origin www.cnblogs.com/L-Wirepuller/p/11415652.html
Recommended