【java】javamail发送带附件的邮件

一、前言

      很多我们都使用过邮件,通过邮件的附件发送一些东西,达到传送的目的,这个目的还是不错的。但是各位知道我们是如何添加附件呢?如何通过代码完成的呢?

二、附件是什么?

      我们发送的邮件除了邮件的主题内容,可以添加一些其他类型的文件,发送过出去。这些文件可以是图片、文档、视频等。很像是在我们写信一样把信写好后放进信封,同样我们也可以在信封中放一些其他的东西,比如钥匙,钱等。附件就等同于这个。

三、如何操作

      我们可以通过如下的操作达到目的:

      通过程序把我们要整理的邮件生成模板,保存在本地,生成* .eml文件,然后通过发送 *.eml文件,达到附件邮件发送的目的。

      关于环境搭配,朋友们可以借鉴小编先前的《【java】javamail简介以及发送邮件》

      生成带附件的邮件:

      这里小编在E盘下面建立了两个txt文件以及一张图片作为附件,然后把这些添加到邮件中,生成复杂的邮件。

package com.dmsd.mail;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
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;
import javax.mail.internet.MimeUtility;

public class EmailWithAttch {
    public static void main(String[] args) throws Exception {
        //环境
        Session session = Session.getInstance(new Properties());

        //邮件
        MimeMessage msg = new MimeMessage(session);
        //发件人,注意中文的处理
        msg.setFrom(new InternetAddress("\"" + MimeUtility.encodeText("东方不败") + "\" <18333602097@163.com>"));
        //设置主题
        msg.setSubject("越来越棒!");        
        //设置邮件回复人
        msg.setReplyTo(new Address[]{new InternetAddress("lili@126.com")});
        //收件人
        msg.setRecipients(RecipientType.TO,InternetAddress.parse(MimeUtility.encodeText("Ares") + " <1102716752@qq.com>," + MimeUtility.encodeText("王雷") + " <18333602097@163.com>"));

        //整封邮件的MINE消息体
        MimeMultipart msgMultipart = new MimeMultipart("mixed");//混合的组合关系
        //设置邮件的MINE消息体
        msg.setContent(msgMultipart);

        //附件1
        MimeBodyPart attch1 = new MimeBodyPart();
        //附件2
        MimeBodyPart attch2 = new MimeBodyPart();
        //正文内容
        MimeBodyPart content = new MimeBodyPart();

        //把内容,附件1,附件2加入到 MINE消息体中
        msgMultipart.addBodyPart(attch1);       
        msgMultipart.addBodyPart(attch2);       
        msgMultipart.addBodyPart(content);

        //把文件,添加到附件1中
        //数据源
        DataSource ds1 = new FileDataSource(
                new File("E:/1.txt")    
            );
        //数据处理器
        DataHandler dh1 = new DataHandler(ds1 );
        //设置第一个附件的数据
        attch1.setDataHandler(dh1);
        //设置第一个附件的文件名
        attch1.setFileName(
                MimeUtility.encodeText("我是第一个文件.txt")
                );

        //把文件,添加到附件2中
        DataSource ds2 = new FileDataSource(
                new File("E:/2.txt")        
            );
        DataHandler dh2 = new DataHandler(ds2 );
        attch2.setDataHandler(dh2);     
        attch2.setFileName(MimeUtility.encodeText("我是第二个文件.txt"));

        //正文(图片和文字部分)
        MimeMultipart bodyMultipart = new MimeMultipart("related");
        //设置内容为正文
        content.setContent(bodyMultipart);
        //html代码部分
        MimeBodyPart htmlPart = new MimeBodyPart();
        //html中嵌套的图片部分
        MimeBodyPart gifPart = new MimeBodyPart();
        //正文添加图片和html代码
        bodyMultipart.addBodyPart(htmlPart);
        bodyMultipart.addBodyPart(gifPart); 

        //把文件,添加到图片中
        DataSource gifds = new FileDataSource(
                new File("E:/小熊猫.jpg")  
            );
        DataHandler gifdh = new DataHandler(gifds);     
        gifPart.setDataHandler(gifdh);
        //说明html中的img标签的src,引用的是此图片
        gifPart.setHeader("Content-Location", "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2703288617,3613848102&fm=23&gp=0.jpg");

        //html代码
        htmlPart.setContent("马蓉出轨王宝强的经纪人的事情其实根本曾经划上了句号。加上前段时间的白百何出轨小鲜肉的事情,把文娱圈的潘金莲的丑闻推上了一个新的阶段。时间就是一个沙漏,马蓉和王宝强的离婚事情,也慢慢被人们淡忘。<img src='https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1495797374&di=537ebbbc19d917e7c425475e867069ca&imgtype=jpg&er=1&src=http%3A%2F%2Fimgsrc.baidu.com%2Fforum%2Fpic%2Fitem%2Fcf594910b912c8fc2c8ed308fc039245d48821cc.jpg'>", "text/html;charset=utf-8");

        //生成文件邮件
        msg.saveChanges();

        //输出
        OutputStream ips = new FileOutputStream("E:/demo3.eml");
        msg.writeTo(ips);
        ips.close();
    }
}

      发送生成的*.eml文件:

package com.dmsd.mail;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmail {

    /**
     * @param args
     * @throws MessagingException 
     * @throws FileNotFoundException 
     */
    public static void main(String[] args) throws FileNotFoundException, MessagingException {
         // 属性对象
        Properties properties = new Properties();
        // 开启debug调试 ,打印信息
         properties.setProperty("mail.debug", "true");
         // 发送服务器需要身份验证
         properties.setProperty("mail.smtp.auth", "true");
         // 发送服务器端口,可以不设置,默认是25
         properties.setProperty("mail.smtp.port", "25");
         // 发送邮件协议名称
         properties.setProperty("mail.transport.protocol", "smtp");
         // 设置邮件服务器主机名
         properties.setProperty("mail.host", "smtp.163.com");
         // 环境信息
         Session session = Session.getInstance(properties, new Authenticator() {
             @Override
             protected PasswordAuthentication getPasswordAuthentication() {
                 // 在session中设置账户信息,Transport发送邮件时会使用
                 return new PasswordAuthentication( "xxxxxxx", "xxxxxxxx");
             }
         });


         //读取本地邮件
         Message message = new MimeMessage(session, new FileInputStream(new File("E:/11.html")));

         //发送邮件
         Transport.send(message, InternetAddress.parse("18333612586@163.com,15732626015@163.com,18333602097@163.com,15732622312@163.com,15732534138@163.com") );

    }

}

      在生成的邮件中,就可以看到发送的人,以及附件的详细信息,邮件的主体内容。等等

这里写图片描述

四、小结

      通过学习javamail对邮件的研究更加深入了,可以自己通过代码搭建一个邮件服务器,使用也比较方便,自己搭建的就可以照顾到跟多的方面,管理也就比较方便了,当使用邮件进行消息推送的时候也就可以很快的实现了。

      下一篇博客将向大家带来一个新的技术freemarker,在javamail+freemarker生成邮件模板,并发送邮件。

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
可以使用 JavaMail API 来发送附件邮件。下面是一个简单的示例代码: ```java import javax.mail.*; import javax.mail.internet.*; import java.util.*; public class SendMailWithAttachment { public static void main(String[] args) { // 发件人邮箱地址和密码 final String senderEmail = "[email protected]"; final String senderPassword = "your_email_password"; // 收件人邮箱地址 String recipientEmail = "[email protected]"; // 邮件主题和正文 String emailSubject = "Test email with attachment"; String emailBody = "This is a test email with attachment."; // 附件文件路径 String attachmentFilePath = "path/to/attachment/file"; // 发送邮件 Properties properties = new Properties(); properties.put("mail.smtp.auth", "true"); properties.put("mail.smtp.starttls.enable", "true"); properties.put("mail.smtp.host", "smtp.gmail.com"); properties.put("mail.smtp.port", "587"); Session session = Session.getInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(senderEmail, senderPassword); } }); try { MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(senderEmail)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipientEmail)); message.setSubject(emailSubject); // 创建邮件正文部分 MimeBodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText(emailBody); // 创建附件部分 MimeBodyPart attachmentBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(attachmentFilePath); attachmentBodyPart.setDataHandler(new DataHandler(source)); attachmentBodyPart.setFileName(source.getName()); // 将正文部分和附件部分组合成混合的 MimeMultipart 对象 Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); multipart.addBodyPart(attachmentBodyPart); // 将混合的 MimeMultipart 对象设置为整个邮件的内容 message.setContent(multipart); // 发送邮件 Transport.send(message); System.out.println("Email sent successfully."); } catch (MessagingException e) { System.out.println("Failed to send email. Error message: " + e.getMessage()); } } } ``` 在代码中,需要将 `senderEmail` 和 `senderPassword` 替换为发件人的邮箱地址和密码,将 `recipientEmail` 替换为收件人的邮箱地址,将 `emailSubject` 和 `emailBody` 替换为邮件的主题和正文,将 `attachmentFilePath` 替换为附件文件的路径。 使用 JavaMail API 发送附件邮件需要注意以下几点: - 需要引入 JavaMail API 和 Java Activation Framework(JAF)的库。 - 需要设置邮件服务器的地址和端口号,例如 Gmail 的地址是 smtp.gmail.com,端口号是 587。 - 需要使用 `javax.mail.Authenticator` 类创建一个实现了 `getPasswordAuthentication()` 方法的子类来提供发件人邮箱地址和密码。 - 需要创建一个 `MimeMessage` 对象来表示邮件,设置发件人、收件人、主题和内容。 - 需要创建一个 `MimeBodyPart` 对象来表示附件,将附件文件的数据源和文件名设置到 `DataHandler` 和 `setFileName()` 方法中,然后将其添加到混合的 `MimeMultipart` 对象中。 - 需要将邮件的正文部分和附件部分组合成混合的 `MimeMultipart` 对象,然后将其设置为整个邮件的内容。 - 最后调用 `Transport.send()` 方法将邮件发送出去。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你个佬六

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值