Java Mail 发送带有附件的邮件

Posted 追梦赤子心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java Mail 发送带有附件的邮件相关的知识,希望对你有一定的参考价值。

1、小编用的是163邮箱发送邮件,所以要先登录163邮箱开启POP3/SMTP/IMAP服务方法:

 

2、下载所需的java-mail 包

https://maven.java.net/content/repositories/releases/com/sun/mail/javax.mail/

 

3、贴上代码

public class sendMail {
/**
 * 创建邮件信息
 * @param session
 * @param fromAccount
 * @param toAccount
 * @param sourcePath xml文件目录   e.g. xml
 * @param zipPath   zip文件目录  e.g. zip/person.zip
 */
    public static void CreateMessage(final Session session, final String fromAccount, final String toAccount,final String sourcePath,final String zipPath){
        try{
            final String subjectStr="圣诞节快乐";//主题
            final StringBuffer contentStr=new StringBuffer();//内容
            contentStr.append("<h2>Dear Friends,</h2><br/>");
            contentStr.append("Christmas is coming up soon. <br/> Wish you lots of love, joy &happiness. happy christmas.");
            contentStr.append("<h3>Regards,</h3>").append("<h3>ZHBIT College</h3>");

           //创建默认的 MimeMessage 对象
           final MimeMessage message = new MimeMessage(session);
           //Set From: 头部头字段
           message.setFrom(new InternetAddress(fromAccount));
           //Set To: 头部头字段
           message.addRecipient(Message.RecipientType.TO,
                                    new InternetAddress(toAccount));
           //Set Subject: 头部头字段
           message.setSubject(subjectStr);
          //创建消息部分
           final BodyPart messageBodyPart = new MimeBodyPart();
           //消息
           messageBodyPart.setContent(contentStr.toString(),"text/html;charset=UTF-8");
           //创建多重消息
           final Multipart multipart = new MimeMultipart();
           //设置文本消息部分
           multipart.addBodyPart(messageBodyPart);
           //为邮件添加多个附件
           MimeBodyPart attachment = null;
           final File source = new File(sourcePath);
           if (!source.exists()) {
               System.out.println(sourcePath + " not exists");
               return;
           }
           final File[] files = source.listFiles();
           for (final File f : files) {
               attachment = new MimeBodyPart();
               final String filePath =f.getPath();
               //根据附件文件创建文件数据源
               final DataSource ds = new FileDataSource(filePath);
               attachment.setDataHandler(new DataHandler(ds));
               //为附件设置文件名
               attachment.setFileName(ds.getName());
               multipart.addBodyPart(attachment);
           }

           //添加zip附件
           attachment = new MimeBodyPart();
           //根据附件文件创建文件数据源
           final DataSource ds = new FileDataSource(zipPath);
           attachment.setDataHandler(new DataHandler(ds));
           //为附件设置文件名
           attachment.setFileName(ds.getName());
           multipart.addBodyPart(attachment);

           // 发送完整消息
           message.setContent(multipart);
           // 发送消息
           Transport.send(message);

        }catch (final MessagingException mex) {
           mex.printStackTrace();
        }
    }


/**
 * 将源文件目录下的所有文件打包成zip文件
 * @param sourceFilePath  e.g. xml
 * @param zipFilePath   e.g. zip
 * @param fileName   e.g. person
 * @return 返回生成的zip文件目录  e.g. zip/person.zip
 */
    public static String tozip(final String sourceFilePath, final String zipFilePath,
            final String fileName) {
        final File sourceFile = new File(sourceFilePath);
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        FileOutputStream fos = null;
        ZipOutputStream zos = null;
        final String createZipPath=zipFilePath+ "/" + fileName+ ".zip";

        if(!sourceFile.exists()){
            System.out.println("待压缩的文件目录:" + sourceFilePath + "不存在");
        } else {
            try {
                final File zipFile = new File(createZipPath);
                final File[] sourceFiles = sourceFile.listFiles();
                if(null == sourceFiles || sourceFiles.length < 1) {
                    System.out.println("待压缩的文件目录:" + sourceFilePath + " 里面不存在文件,无需压缩");
                }else{
                    fos = new FileOutputStream(zipFile);
                    zos = new ZipOutputStream(new BufferedOutputStream(fos));
                    final byte[] bufs = new byte[1024*10];
                    for(int i=0;i<sourceFiles.length;i++) {
                        // 创建ZIP实体,并添加进压缩包
                        final ZipEntry zipEntry = new ZipEntry(sourceFiles[i].getName());
                        zos.putNextEntry(zipEntry);
                        // 读取待压缩的文件并写进压缩包里
                        fis = new FileInputStream(sourceFiles[i]);
                        bis = new BufferedInputStream(fis,1024*10);
                        int read = 0;
                        while((read=bis.read(bufs, 0, 1024*10)) != -1) {
                            zos.write(bufs, 0, read);
                        }
                    }
                }

            } catch (final FileNotFoundException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } catch (final IOException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } finally {
                try {
                    if (null != bis) {
                        bis.close();
                    }
                    if (null != zos) {
                        zos.close();
                    }
                } catch (final IOException e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
        }
        return createZipPath;
    }


    public static void main(final String[] args) {
        //收件人电子邮箱
        final String toAccount = "********@qq.com";
        //发件人的 邮箱 和 密码
        final String fromAccount = "**********@163.com";
        final String fromPassword = "**********";
        //指定发送邮件的主机
        final String host = "smtp.163.com";

        //创建参数配置, 获取系统属性
        final Properties properties = System.getProperties();
        properties.setProperty("mail.transport.protocol", "smtp");
        properties.setProperty("mail.smtp.host", host);
        properties.put("mail.smtp.auth", "true");

        //根据配置创建会话对象,获取默认session对象
        final Session session = Session.getDefaultInstance(properties,new Authenticator(){
          @Override
            public PasswordAuthentication getPasswordAuthentication()
              {
               return new PasswordAuthentication(fromAccount, fromPassword); //发件人邮件用户名、密码
              }
         });
        session.setDebug(true);

        final String xmlPath="xml";
        final String zipPath=tozip(xmlPath,"zip","person");
        CreateMessage(session,fromAccount,toAccount,xmlPath,zipPath);
    }

}

 

4、收到邮件

 

以上是关于Java Mail 发送带有附件的邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 System.NET.mail 发送带有附件但没有任何纯文本正文的电子邮件?

带有附件的梨邮件在 $mime = new Mail_mime 处失败

Java mail发送邮件附件出现.eml文件夹

基于PHP自带的mail函数实现发送邮件以及带有附件的邮件功能

Java Mail - 电子邮件客户端中未显示附件?

WP_MAIL() 不发送附件