Java发送邮件

系统里面需要发邮件的场景还是比较多的,比如发个通知,发个预警信息等等。
好了,用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", "
"); emailcontent = emailcontent.replace("\t", "    "); // 设置为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发送邮件)