美文网首页
Java发送邮件

Java发送邮件

作者: 茶理思 | 来源:发表于2021-04-22 15:53 被阅读0次

    系统里面需要发邮件的场景还是比较多的,比如发个通知,发个预警信息等等。
    好了,用Java写个发邮件的功能麻烦吗,不麻烦。
    主要两大步:配置认证信息,组装邮件体
    配置信息有比如邮件服务器、端口,使用的协议,用户名密码等。
    使用这些配置信息,生成一个session实例。根据这个session,生成一个邮件体。
    给邮件体设置发件人地址、收件人地址(抄送、密送),邮件正文,附件。其中邮件正文可以设置html格式或者纯文本格式。
    show the code:

    public class JavaEmailUtils {
        
        private static final Logger log = Logger.getLogger(JavaEmailUtils.class);
    
        private static final String PROPERTIES_PATH = "key/email";
        private static final String KEY_FROM = "email.From";
        private static final String KEY_NAME = "email.UserName";
        private static final String KEY_PWD = "email.UserPwd";
        private static final String SMTP_HOST = "smtp.***.com";
    
        public static boolean send(String to, String emailcontent, String documentNames, String subject) {
            try {
                log.info("begin send email");
                Message msg = getMessage(to, emailcontent, documentNames, subject);
                log.info("get email msg");
            // 触发发送。系统环境要能连接访问邮件服务器
                Transport.send(msg);
                log.info("end send email");
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
    
        /**
         * 配置信息
         */
        private static Session getSession() {
            Properties props = System.getProperties();
            props.setProperty("mail.smtp.host", SMTP_HOST);
            props.setProperty("mail.smtp.port", "25");
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.transport.protocol", "smtp");
            props.put("mail.smtp.ssl.trust", SMTP_HOST);
            props.put("mail.smtp.auth", "true");
            // ConfigUtils 是个工具类,从配置文件properties中获取配置信息
            String name = ConfigUtils.getByKey(PROPERTIES_PATH, KEY_NAME);
            log.info("email from: " + name);
            String pwd = ConfigUtils.getByKey(PROPERTIES_PATH, KEY_PWD);
            return Session.getDefaultInstance(props, new PasswordAuthenticator(name, pwd));
        }
    
        /**
         * 装配邮件体
         */
        private static Message getMessage(String to, String emailcontent, String documentNames, String subject)
                throws Exception {
            Message msg = new MimeMessage(getSession());
            // 从哪里来
            msg.setFrom(new InternetAddress(ConfigUtils.getByKey(PROPERTIES_PATH, KEY_FROM)));
    
            String[] toadd = to.split(",");
            Address[] addArr = new Address[toadd.length];
            for (int i = 0; i < toadd.length; i++) {
                log.info("email to address: "+ toadd[i]);
                addArr[i] = new InternetAddress(toadd[i]);
            }
            // 到哪里去
            msg.setRecipients(Message.RecipientType.TO, addArr);
            // 防止中文乱码
            msg.setSubject(MimeUtility.encodeText(subject, "gb2312", "B"));
    
            Multipart mp = new MimeMultipart();
            
            MimeBodyPart contentPart = new MimeBodyPart();
            emailcontent = emailcontent.replace("\r\n", "<br>");
            emailcontent = emailcontent.replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;");
            // 设置为HTML格式,默认是纯文本
            contentPart.setContent(emailcontent, "text/html;charset=GB2312");
            mp.addBodyPart(contentPart);
            
            if (!TextUtil.isEmpty(documentNames)) {
                String[] documentNameArray = documentNames.split("&&&&");
                for (String docName:documentNameArray) {
                    MimeBodyPart filePart = new MimeBodyPart();
                    DataSource dataSource = new FileDataSource(new File(docName));
                    filePart.setDataHandler(new DataHandler(dataSource));
                    filePart.setFileName(MimeUtility.encodeText(dataSource.getName()));
            // 每加一个附件,就加一个MimeBodyPart
                    mp.addBodyPart(filePart);
                }       
            }
            
            msg.setContent(mp);
            msg.saveChanges();
            return msg;
        }
    }
    
    测试验证通过

    备注:QQ、163等邮件服务器的调用,可能需要在邮件系统去开通外部收发邮件的限制。

    建议:如果是平台性的系统,建议将此工具封装成接口、插件式的。开发者配置自己的邮件账号、密码,调用接口或插件达到发送邮件的功能。

    相关文章

      网友评论

          本文标题:Java发送邮件

          本文链接:https://www.haomeiwen.com/subject/hpffrltx.html