在校的时候,学过JavaMail,发送简单文本内容。所以刚接手这任务的时候,觉得挺过程应该不会太难,只是要研究一下将附件一并发送。

首先要配置环境,我用的163邮箱。

Java发送动态excel附件邮件 java 发送邮件附件_Java发送动态excel附件邮件


然后复制客户端授权密码,在这里自己设置。

Java发送动态excel附件邮件 java 发送邮件附件_html_02


在项目测试过程中,我上网借鉴了好多,但是一直553什么的报错。

报错1smtplib.SMTPDataError: 554, 'DT:SPM

原因:有的时候控制台也会给提示个链接,554错误的原因有很多,我的问题原因就是《发信IP因发送垃圾邮件或存在异常的连接行为,被暂时挂起》,还有就是是163邮箱的客户端授权码我写错了。

报错2smtplib.SMTPDataError: (554, b’DT:SPM 163 smtp10,DsCowAA3nir1u6xZq42WDw–.22935S2 1504492533,please

原因:赋值不全。只赋值了msg[‘Subject‘], 沒有賦值msg[‘From‘], msg[‘To‘]。

最期待的部分,开始上代码~~~

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.*;
import java.util.Properties;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @Author Wangsq.
 * @Description
 * @Date 2019/8/20 on 10:19.
 */
public class SendMail {

    public static String smtp_host = "smtp.163.com"; // 网易
    public static String user = "888@163.com"; // 邮箱 
    public static String password = "qqqeee666"; // 授权码(登录邮箱-->设置-->邮箱安全设置-->客户端授权密码),这里不是邮箱的密码,切记! 
    public static String from = "888@163.com"; // 来源邮箱,使用当前账号
    /**
     * 发送邮件
     *
     * @param toEmail 收件人邮箱地址
     * @param subject 邮件标题
     * @param content 邮件内容 可以是html内容
     */
    public void send(String toEmail, String subject, String content) {
        // 1 准备发送邮件需要的参数
        Properties props = new Properties();
        // 设置主机地址 smtp.qq.com smtp.126.com smtp.163.com
        props.put("mail.smtp.host", smtp_host);
        // 是否打开验证:只能设置true,必须打开
        props.put("mail.smtp.auth", true);
        props.put("mail.smtp.ssl.enable", true);//QQ邮箱的SSL加密

        // 2 连接邮件服务器
        Session session = Session.getDefaultInstance(props);        // session.setDebug(true);
        // 创建邮件消息
        MimeMessage message = new MimeMessage(session);
        try {
            // 设置发件人
            // 4 设置发送者
            InternetAddress fromAddress = new InternetAddress(from);
            message.setFrom(fromAddress);
            Address[] a = new Address[1];
            a[0] = new InternetAddress(user);
            message.setReplyTo(a);
            // 设置收件人
            InternetAddress to = new InternetAddress(toEmail);
            message.setRecipient(MimeMessage.RecipientType.TO, to);
            // 设置邮件标题
            message.setSubject(subject);
            // 设置邮件的内容体
            message.setContent(content, "text/html;charset=UTF-8");
            // 发送邮件
            // 8 发送:坐火箭
            Transport transport = session.getTransport("smtp");// 参数不能少,表示的是发送协议
            // 登录邮箱,此处的密码是授权码
            transport.connect(user, password);
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();

            System.out.println("ok");
        } catch (MessagingException e) {
            String err = e.getMessage();
            // 在这里处理message内容, 格式是固定的
            System.out.println(err);
        }
    }


    /**
     * 发送邮件 带附件
     *
     * @param toEmail    收件人邮箱地址
     * @param subject    邮件标题
     * @param content    邮件内容 可以是html内容
     * @param attachPath 附件路径
     */
    public void send(String toEmail, String subject, String content, String attachPath) {
        // 1 准备发送邮件需要的参数
        Properties props = new Properties();
        // 设置主机地址 smtp.qq.com smtp.126.com smtp.163.com
        props.put("mail.smtp.host", smtp_host);
        // 是否打开验证:只能设置true,必须打开
        props.put("mail.smtp.auth", true);
        props.put("mail.smtp.ssl.enable", true);//QQ邮箱的SSL加密

        // 2 连接邮件服务器
        Session session = Session.getDefaultInstance(props);
        MimeMessage mm = new MimeMessage(session);
        try {
            //发件人
            mm.setFrom(new InternetAddress(user));
            //收件人
            mm.setRecipient(Message.RecipientType.TO, new InternetAddress(toEmail)); // 设置收件人
            // mm.setRecipient(Message.RecipientType.CC, new
            // InternetAddress("XXXX@qq.com")); //设置抄送人
            //标题
            mm.setSubject(subject);
            //创建多重消息
            Multipart multipart = new MimeMultipart();
            //body部分
            BodyPart contentPart = new MimeBodyPart();
            contentPart.setContent(content, "text/html;charset=utf-8");
            multipart.addBodyPart(contentPart);

            //附件部分
            BodyPart attachPart = new MimeBodyPart();
            FileDataSource fileDataSource = new FileDataSource(attachPath);
            attachPart.setDataHandler(new DataHandler(fileDataSource));
            attachPart.setFileName(MimeUtility.encodeText(fileDataSource.getName()));
            multipart.addBodyPart(attachPart);

            mm.setContent(multipart);
            // 8 发送:坐火箭
            Transport transport = session.getTransport("smtp");// 参数不能少,表示的是发送协议
            // 登录邮箱,此处的密码是授权码
            transport.connect(user, password);
            transport.sendMessage(mm, mm.getAllRecipients());
            transport.close();

            System.out.println("ok");

    } catch (Exception e) {
            String err = e.getMessage();
            // 在这里处理message内容, 格式是固定的
            System.out.println(err);
        }

    }

}

以上内容作为工具使用,接下来是调用部分。

public static void main(String[] args) {
 //两个都可以用哦~~
//        new SendMail().send("1371386540@qq.com", "激活测试", "test");
        new SendMail().send("1371386540@qq.com", "激活测试", "test", "C:\\Users\\Administrator\\Desktop\\dot文件\\sortec\\aaatest.docx");
    }

Java发送动态excel附件邮件 java 发送邮件附件_javaMail发送邮件附件_03

这个功能是我来公司后做的最快的一个,出效果后很开心,忍不住夸夸自己,对就是这么容易满足,也没啥追求,就是做好自己的工作内容就行。耶~ 继续加油