Java发送邮件

465 阅读3分钟

之前我写的是个人邮箱发送,拿到甲方邮箱才知道是企业邮箱,诶呦把我搞得头都大了

在网上找了很多教程,原本想转载,可是我都找不到作者的原网页了,如果发现了请让我标注作者

企业邮箱和个人邮箱是不同的,企业邮箱不需要输入16位授权码,只需要账号密码,个人邮箱需要的是账号和16位授权码。

一,首先我们登录QQ企业邮箱看看有没有开配置

二,直接放代码(版本一 我用来发送验证码的,但是可以群发,也可以发文件)

import com.sun.mail.util.MailSSLSocketFactory;
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.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Properties;

public class SendEmail {

    private static String account = "登录账户";// 登录账户
    private static String password = "登录密码";// 登录密码
    private static String host = "smtp.exmail.qq.com";// 服务器地址
    private static String port = "465";// 端口
    private static String protocol = "smtp";// 协议
    private static String sender = "发送人别名";

    //初始化参数
    public static Session initProperties() {
        Properties properties = new Properties();
        properties.setProperty("mail.transport.protocol", protocol);
        properties.setProperty("mail.smtp.host", host);
        properties.setProperty("mail.smtp.port", port);
        // 使用smtp身份验证
        properties.put("mail.smtp.auth", "true");
        // 使用SSL,企业邮箱必需 start
        // 开启安全协议
        MailSSLSocketFactory mailSSLSocketFactory = null;
        try {
            mailSSLSocketFactory = new MailSSLSocketFactory();
            mailSSLSocketFactory.setTrustAllHosts(true);
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        }
        properties.put("mail.smtp.enable", "true");
        properties.put("mail.smtp.ssl.socketFactory", mailSSLSocketFactory);
        properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        properties.put("mail.smtp.socketFactory.fallback", "false");
        properties.put("mail.smtp.socketFactory.port", port);
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(account, password);
            }
        });
        // 使用SSL,企业邮箱必需 end
        // TODO 显示debug信息 正式环境注释掉
        session.setDebug(true);
        return session;
    }

// @param sender 发件人别名
// @param subject 邮件主题
//@param content 邮件内容
//@param receiverList 接收者列表,多个接收者之间用","隔开
//@param fileSrc 附件地址
    public static void sendd( String subject, String content, String receiverList) {
        try {

//            , String fileSrc
            Session session = initProperties();
            MimeMessage mimeMessage = new MimeMessage(session);
            mimeMessage.setFrom(new InternetAddress(account, sender));// 发件人,可以设置发件人的别名
            // 收件人,多人接收
            InternetAddress[] internetAddressTo = new InternetAddress().parse(receiverList);
            mimeMessage.setRecipients(Message.RecipientType.TO, internetAddressTo);
            // 主题
            mimeMessage.setSubject(subject);
            // 时间
            mimeMessage.setSentDate(new Date());
//            // 容器类 附件
//            MimeMultipart mimeMultipart = new MimeMultipart();
//            // 可以包装文本,图片,附件
//            MimeBodyPart bodyPart = new MimeBodyPart();
//            // 设置内容
//            bodyPart.setContent(content, "text/html; charset=UTF-8");
//            mimeMultipart.addBodyPart(bodyPart);
//            // 添加图片&附件
//            bodyPart = new MimeBodyPart();
//            bodyPart.attachFile(fileSrc);
//            mimeMultipart.addBodyPart(bodyPart);
//            mimeMessage.setContent(mimeMultipart);
//            mimeMessage.saveChanges();
//            Transport.send(mimeMessage);
            //设置内容
            mimeMessage.setText(content);
            mimeMessage.saveChanges();
            //发送
            Transport.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

下面是版本二,是我直接发送表格的,修改成企业邮箱发送,其实就改了一句话,然后16位授权码变成密码

properties.setProperty("mail.smtp.host", "smtp.exmail.qq.com");

直接放代码吧,首先是生成表格的代码

import com.ruoyi.app.common.request.ToCookLogTwo;
import net.sf.json.JSONArray;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

public class CreatExcel {
    public static ByteArrayOutputStream creatExcel(String[] title, String logs) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        //创建一个表格
        Workbook workbook = new XSSFWorkbook();
        // 创建一个工作薄对象
        XSSFSheet sheet = (XSSFSheet) workbook.createSheet("sheet1");
        //设置首行
        XSSFRow row0 = sheet.createRow(0);
        for(int i=0;i<title.length;i++) {
            XSSFCell cell = (XSSFCell) row0.createCell(i);
            cell.setCellValue(title[i]);
        }

        JSONArray jsonArr = JSONArray.fromObject(logs);//将前端传来的数据转换成JSONArray格式
        List<ToCookLogTwo> toCookLogs = JSONArray.toList(jsonArr, ToCookLogTwo.class);//获得数组

        String sd1 = "";//开始时间
        String sd2 = "";//结束时间

        //循环传来的数组,这样有几条数据生成几个表格
        for (int i=0;i<toCookLogs.size();i++) {
            //时间戳转时间
            SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
            //yyyy-MM-dd
            if(toCookLogs.get(i).getStart_time()!=null){
                sd1 = sdf.format(new Date(Long.parseLong(String.valueOf(toCookLogs.get(i).getStart_time()))));
            }
            //时间戳转时间
            if(toCookLogs.get(i).getEnd_time()!=null){
                sd2 = sdf.format(new Date(Long.parseLong(String.valueOf(toCookLogs.get(i).getEnd_time()))));
            }
            //表格第二行是
            String[] text = {sd1,sd2,toCookLogs.get(i).getType(),toCookLogs.get(i).getPractice(),toCookLogs.get(i).getMedium(), String.valueOf(toCookLogs.get(i).getTemp()),toCookLogs.get(i).getRemark()};

            //设置第二行
            XSSFRow row1 = sheet.createRow(i+1);
            for(int j=0;j<text.length;j++) {
                XSSFCell cell = (XSSFCell) row1.createCell(j);
                cell.setCellValue(text[j]);
            }

        }

        try {
            workbook.write(baos); // write excel data to a byte array
            baos.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("创建成功 office excel");
        return baos;
    }
}

下面是发送邮件的代码

import net.sf.json.JSONArray;
import org.springframework.stereotype.Service;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.util.ByteArrayDataSource;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

@Service
public class SendEmailAndExcle {
    public static boolean sendEmail(String to, ByteArrayOutputStream baos,String tit,String te) {
        // 发件人电子邮箱
        String from = "发件人电子邮箱";
        // 获取系统属性
        Properties properties = System.getProperties();
        // 设置邮件服务器 ->QQ 邮件服务器
        properties.setProperty("mail.smtp.host", "smtp.exmail.qq.com");
        properties.put("mail.smtp.auth", "true");
        properties.put("mail.smtp.port", "465");
        properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

        // 获取默认session对象
        Session session = Session.getDefaultInstance(properties,new Authenticator(){
            public PasswordAuthentication getPasswordAuthentication()
            {
                return new PasswordAuthentication("发件人邮件用户名", "密码"); //发件人邮件用户名、授权码
            }
        });

        try{
            // 创建默认的 MimeMessage 对象
            MimeMessage message = new MimeMessage(session);
            // Set From: 头部头字段
            message.setFrom(new InternetAddress(from,"别名"));
            // Set To: 头部头字段
            message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
            // Set Subject: 头部头字段
            message.setSubject("This is the Subject Line!");
            //邮件标题
            message.setSubject(tit);
            //邮件内容
            //【因为要发送正文和邮件所以
            // 1,设置邮件内容,混合模式
            MimeMultipart msgMultipart = new MimeMultipart("mixed");
            message.setContent(msgMultipart);

            // 2,设置消息正文
            MimeBodyPart content = new MimeBodyPart();
            msgMultipart.addBodyPart(content);

            // 3,设置正文格式
            MimeMultipart bodyMultipart = new MimeMultipart("related");
            content.setContent(bodyMultipart);

            // 4,设置正文内容
            MimeBodyPart htmlPart = new MimeBodyPart();
            bodyMultipart.addBodyPart(htmlPart);
            htmlPart.setContent(te, "text/html;charset=UTF-8");

            //添加这些】

             /*如果只发附件不要正文的话用这个*/
            //  Multipart multipart = new MimeMultipart();

            if(baos.size()>0){
                MimeBodyPart fileBody = new MimeBodyPart();
                DataSource source = new ByteArrayDataSource(baos.toByteArray(), "application/msexcel");
                fileBody.setDataHandler(new DataHandler(source));

                // 中文乱码问题
                fileBody.setFileName(MimeUtility.encodeText("log.xlsx"));
                msgMultipart.addBodyPart(fileBody);
                // 只发送附件的话
                // multipart.addBodyPart(fileBody);
            }

            // 发送消息
            Transport.send(message,message.getAllRecipients());

            // 只发送附件的话
            // Transport.send(message);

            System.out.println("Sent message successfully....");
        }catch (MessagingException mex) {
            mex.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return false;
    }


    public static void send(String email, String logs, String tit, String te) {
        String[] title = {"start time","end time","type","practice","medium","temp","remark"};
        //生成表格
         ByteArrayOutputStream  baos = CreatExcel.creatExcel(title,logs);
         //发送邮件 收件人邮箱,附件,邮件标题,邮件内容
        SendEmailAndExcle.sendEmail(email,baos,tit,te);
    }
}

在pom.xml中有这些


        <!--发送邮件 -->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
          <!--发送邮件 -->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>