Java Mail 发送带有附件的邮件

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

2、下载所需的java-mail 包

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

3、贴上代码

package javamail;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

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、收到邮件

时间: 2024-11-07 17:35:27

Java Mail 发送带有附件的邮件的相关文章

解决java mail发送TXT附件被直接显示在正文中的问题

这两天遇到一个问题,关于使用java mail发送邮件的问题. 详细是这样子的:我使用java mail发送异常报告邮件,邮件中有一个包含异常日志的附件,和关于设备信息的邮件正文.假设日志为log后缀名,那么在我的qq邮箱中显示正常.可是假设把附件的后缀名改为txt之后,就变成把附件中的内容直接显示在邮件正文中了.而我原来设置的邮件正文则不在了. 我的代码是这样写的: 加入附件: public void addAttachment(String filePath, String fileName

Apache Mail 发送带附件的邮件

MultiPartEmail email = new MultiPartEmail(); email.setDebug(true); email.setHostName("smtp.sina.com"); email.setAuthentication("发送邮件帐号", "邮箱登录密码"); email.setCharset("UTF-8"); try { email.setFrom("发送邮件帐号",

Android在发送带有附件的邮件

准备好工作了-下载最新的版本号JMail https://java.net/projects/javamail/pages/Home#Download_JavaMail_1.5.2_Release http://www.oracle.com/technetwork/java/javase/downloads/index-135046.html 在android上发送邮件方式: 第一种:借助GMail APPclient.缺点是必须使用GMail帐号,有点是比較方便 不须要写非常多代码.可是不是非

python 发送带有附件的邮件

在selenium运行完成,想要把测试报告和截图发送指定的邮箱,需要先把测试报告和截图文件夹打包成压缩文件然后一起发送,下面就是代码: 1.压缩文件 import os,zipfile #压缩文件 def compression(): try: fantasy_zip = zipfile.ZipFile(压缩文件存放路径,'w') for folder,subfolders,files in os.walk(测试报告文件夹路径): for file in files: fantasy_zip.w

【Mail】JavaMail发送带附件的邮件

上一篇讲了使用JavaMail发送普通邮件([Mail]JavaMail介绍及发送邮件(一)),本例讲发送复杂的邮件(带有附件的邮件) 生成一封复杂的邮件 新建一个JavaWeb的Maven工程,引入javamail.jar包,maven引用如下: 1 <!-- javamail --> 2 <dependency> 3 <groupId>javax.mail</groupId> 4 <artifactId>mail</artifactId

Android上发送带附件的邮件

准备工作-下载最新版本的JMail https://java.net/projects/javamail/pages/Home#Download_JavaMail_1.5.2_Release http://www.oracle.com/technetwork/java/javase/downloads/index-135046.html 在android上发送邮件方式: 第一种:借助GMail APP客户端,缺点是必须使用GMail帐号,有点是比较方便 不需要写很多代码,但是不是很灵活. 第二种

(转)用javamail发送带附件的邮件

本文转载自:http://redleaf.iteye.com/blog/78217 mail.java 代码 package mail; import java.util.* ; import java.io.* ; import javax.mail.* ; import javax.mail.internet.* ; import javax.activation.* ; public class Mail { //定义发件人.收件人.SMTP服务器.用户名.密码.主题.内容等 privat

自动化测试发送带附件的邮件

自动化测试发送带附件的邮件 标签(空格分隔): 带附件邮件 在我们的自动化测试中,有时候会发送报告,有时候会发送带附件的报告,具体带附件的报告怎么操作呢? 具体的步骤如下述所示:如下是QQ邮箱为例 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart # 用于传送附件 smtpserver = 'smtp.exmail.qq.com' user = '*

C#发送带附件的邮件的代码

如下的代码是关于C#发送带附件的邮件的代码. MailMessage m = new MailMessage();m.Subject = "File attachment!";m.Body = "See the attached file.";m.Attachments.Add(new Attachment(@"C:test.txt"));SmtpClient client = new SmtpClient("smtp.w3mentor