Java发送带图片和附件的邮件

发送邮件时将邮件的每一个组件(MimeBodyPart)加入面板(MimeMultipart)message中

先介绍不带附件的邮件 但是带图片和文本
思路:
1.文本和图片封装在 MimeBodyPart中(图片需要进行数据处理)
2.最后将 MimeBodyPart加入到MimeMultipart中此时需要通过MimeMultipart的setSubType()方法设置类型为mixed/related/alternative设置,再将MimeMultipart加入Message中保存进行发送
(图片来自B站狂神说JAVA)
Java发送带图片和附件的邮件_第1张图片
示例代码如下:

public static void main(String[] args) throws MessagingException, GeneralSecurityException {
        Properties prop  = new Properties();
       prop.setProperty("mail.host","smtp.qq.com");//设置QQ登陆
        prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议
        prop.setProperty("mail.smtp.auth","true");//需要验证用户名密码

        //关于QQ邮箱 还要设置SSL加密  加上以下代码即可  仅QQ需要  其他邮箱不需要
        MailSSLSocketFactory sf = null;
        try {
            sf = new MailSSLSocketFactory();
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        }
        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable","true");
        prop.put("mail.smtp.ssl.socketFactory",sf);

        //使用Java Mail发送邮件的5个步骤

        //1.创建定义整个应用程序所需的环境信息的Session对象
        //创建定义整个应用程序所需的环境变量信息的Session对象


        //QQ才有  其他邮箱不需要
        Session session = Session.getDefaultInstance(prop, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("654736673","soqdiresshiqbaj3i");
            }
        });

        //开启Session的debug模式 这样就可以看到程序发送Email    的运行状态
        session.setDebug(true);//默认为false

        //2.通过session得到trans  port对象
        Transport ts = session.getTransport();

        //3.使用邮箱的用户名和授权码连接上邮件服务器
        try {
            ts.connect("smtp.qq.com","[email protected]","soqdiresshiqbaj3i");
        } catch (MessagingException e) {
            e.printStackTrace();
        }

        //4.创建邮箱

        //创建邮箱对象
        MimeMessage message = new MimeMessage(session);

        //指定邮箱发件人
        message.setFrom(new InternetAddress("[email protected]"));

        //指定邮箱收件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("[email protected]"));//写的自己邮箱  就是自己给自己发

        //邮件标题
        message.setSubject("用Java发送带图片的邮件");

        //准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        DataHandler dh  = new DataHandler(new FileDataSource("E:\\IDEAworkpace\\web文件上传\\mail_Java\\src\\resources\\hanjin.jpg"));
        image.setDataHandler(dh);
        image.setContentID("bz.jpg");

        //准备正文数据
        MimeBodyPart text = new MimeBodyPart();


        text.setContent("这是一封邮件正文带图片的邮件","text/html;charset=UTF-8");//这里的cid指的是ContentID的图片标识
        //描述数据关系
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.setSubType("related");
         //将封装好的数据保存到 Message中
        message.setContent(mm);
        message.saveChanges();

        //5.发送邮件
        ts.sendMessage(message,message.getAllRecipients());
        //6.关闭连接
        ts.close();

    }

带附件 和图片,文本的邮件
思路
1.先将图片和正文准备好
2.将图片和正文拼接在一起组成 MimeMultipart,因为还要与组件拼接,再将拼接好的 MimeMultipart封装在MimeBodyPart当中
3.将附件与组装好的图片文本再次进行拼接成 MimeMultipart
4.保存到message中进行发送

示例代码:

  public static void main(String[] args) throws MessagingException, GeneralSecurityException {
        Properties prop  = new Properties();
        prop.setProperty("mail.host","smtp.qq.com");//设置QQ登陆
        prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议
        prop.setProperty("mail.smtp.auth","true");//需要验证用户名密码

        //关于QQ邮箱 还要设置SSL加密  加上以下代码即可  仅QQ需要  其他邮箱不需要
        MailSSLSocketFactory sf = null;
        try {
            sf = new MailSSLSocketFactory();
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        }
        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable","true");
        prop.put("mail.smtp.ssl.socketFactory",sf);

        //使用Java Mail发送邮件的5个步骤

        //1.创建定义整个应用程序所需的环境信息的Session对象
        //创建定义整个应用程序所需的环境变量信息的Session对象


        //QQ才有  其他邮箱不需要
        Session session = Session.getDefaultInstance(prop, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("654736673","soqdiresshiqbaj3i");
            }
        });

        //开启Session的debug模式 这样就可以看到程序发送Email    的运行状态
        session.setDebug(true);//默认为false

        //2.通过session得到trans  port对象
        Transport ts = session.getTransport();

        //3.使用邮箱的用户名和授权码连接上邮件服务器
        try {
            ts.connect("smtp.qq.com","[email protected]","soqdiresshiqbaj3i");
        } catch (MessagingException e) {
            e.printStackTrace();
        }

        //4.创建邮箱

        //创建邮箱对象
        MimeMessage message = new MimeMessage(session);

        //指定邮箱发件人
        message.setFrom(new InternetAddress("[email protected]"));

        //指定邮箱收件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("[email protected]"));//写的自己邮箱  就是自己给自己发

        //邮件标题
        message.setSubject("用Java发送带图片的邮件");

        
        //准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        DataHandler dh  = new DataHandler(new FileDataSource("E:\\IDEAworkpace\\web文件上传\\mail_Java\\src\\resources\\hanjin.jpg"));
        image.setDataHandler(dh);
        image.setContentID("bz.jpg");

        //准备正文数据
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("这是一封邮件正文带图片的邮件","text/html;charset=UTF-8");
    
        //描述数据关系   1拼装邮件正文内容
        MimeMultipart mm1 = new MimeMultipart();
        mm1.addBodyPart(text);
        mm1.addBodyPart(image);
        mm1.setSubType("related");//1.文本和图片内嵌成功

        MimeBodyPart contentText = new MimeBodyPart();
        contentText.setContent(mm1);


        //2准备附件
        MimeBodyPart fujian1 = new MimeBodyPart();
        fujian1.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\lenovo\\Desktop\\新建 DOC 文档.doc")));
        fujian1.setFileName("word文本1");//附件设置名字

        MimeBodyPart fujian2 = new MimeBodyPart();
        fujian2.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\lenovo\\Desktop\\新建文本文档.txt")));
        fujian2.setFileName("txt2");//附件设置名字

        

        //3拼接附件和正文图片
        MimeMultipart allFile = new MimeMultipart();
        allFile.addBodyPart(fujian1);
        allFile.addBodyPart(fujian2);
        allFile.addBodyPart(contentText);
        allFile.setSubType("mixed");//正文和附件都在邮件中



         //将封装好的数据保存到 Message中
        message.setContent(allFile);
        message.saveChanges();

        //5.发送邮件
        ts.sendMessage(message,message.getAllRecipients());
        //6.关闭连接
        ts.close();

    }

阶段学习后 可用以Web注册等业务
示例:

public class SendMail extends Thread {
    //用于给用户发送的邮箱
    private String from = "[email protected]";
    //邮箱授权码
    private String username = "[email protected]";
    //邮箱密码 若为QQ 则为授权码
    private String password = "wsnmhneeragkbbeh";
    //发送邮件的服务器地址
    private String host ="smtp.qq.com";
    //用户信息
    private User user;

    public SendMail(User user){
        this.user=user;
    }

    @Override
    public void run() {
        try {
        Properties prop  = new Properties();
        prop.setProperty("mail.host",host);//设置QQ登陆
        prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议
        prop.setProperty("mail.smtp.auth","true");//需要验证用户名密码

        //关于QQ邮箱 还要设置SSL加密  加上以下代码即可  仅QQ需要  其他邮箱不需要
        MailSSLSocketFactory sf = null;

            sf = new MailSSLSocketFactory();

        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable","true");
        prop.put("mail.smtp.ssl.socketFactory",sf);

        //使用Java Mail发送邮件的5个步骤

        //1.创建定义整个应用程序所需的环境信息的Session对象
        //创建定义整个应用程序所需的环境变量信息的Session对象


        //QQ才有  其他邮箱不需要
        Session session = Session.getDefaultInstance(prop, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username,password);
            }
        });

        //开启Session的debug模式 这样就可以看到程序发送Email    的运行状态
        session.setDebug(true);//默认为false

        //2.通过session得到trans  port对象
        Transport ts = null;

            ts = session.getTransport();


        //3.使用邮箱的用户名和授权码连接上邮件服务器

            ts.connect("smtp.qq.com",username,password);


        //4.创建邮箱

        //创建邮箱对象
        MimeMessage message = new MimeMessage(session);

        //指定邮箱发件人

            message.setFrom(new InternetAddress(from));


        //指定邮箱收件人

            message.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail()));//写的自己邮箱  就是自己给自己发


        //邮件标题

            message.setSubject("用Java发送带图片的邮件");

        //准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        DataHandler dh  = new DataHandler(new FileDataSource("E:\\IDEAworkpace\\web文件上传\\mail_Java\\src\\resources\\hanjin.jpg"));

            image.setDataHandler(dh);

        image.setContentID("bz.jpg");

        //准备正文数据
        String info ="恭喜您注册成功,你的账号为:"+user.getUsername()+",密码为:"+user.getPassword()+"为了您的信息安全,请您妥善保管" ;
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("这是一封邮件正文带图片的邮件","text/html;charset=UTF-8");

        //描述数据关系   1拼装邮件正文内容
        MimeMultipart mm1 = new MimeMultipart();
        mm1.addBodyPart(text);
        mm1.addBodyPart(image);
        mm1.setSubType("related");//1.文本和图片内嵌成功

        MimeBodyPart contentText = new MimeBodyPart();
        contentText.setContent(mm1);


        //2准备附件
        MimeBodyPart fujian1 = new MimeBodyPart();
        fujian1.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\lenovo\\Desktop\\新建 DOC 文档.doc")));
        fujian1.setFileName("word文本1");//附件设置名字

        MimeBodyPart fujian2 = new MimeBodyPart();
        fujian2.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\lenovo\\Desktop\\新建文本文档.txt")));
        fujian2.setFileName("txt2");//附件设置名字



        //3拼接附件和正文图片
        MimeMultipart allFile = new MimeMultipart();
        allFile.addBodyPart(fujian1);
        allFile.addBodyPart(fujian2);
        allFile.addBodyPart(contentText);
        allFile.setSubType("mixed");//正文和附件都在邮件中



        //将封装好的数据保存到 Message中
        message.setContent(allFile);
        message.saveChanges();

        //5.发送邮件

            ts.sendMessage(message,message.getAllRecipients());

        //6.关闭连接

            ts.close();
        }catch(Exception e) {
            e.printStackTrace();
        }
    }}

Servlet代码如下:

@Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         //处理编码格式
        try {


        request.setCharacterEncoding("UTF-8");
        //接受用户信息
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String email = request.getParameter("email");
        User user = new User(username,password,email);

        //用户注册成功后给用户发送邮件
        //使用多线程处理发送邮件,防止出现耗时和网站人数注册过多的情况
        SendMail send = new SendMail(user);
        //启动线程
        send.start();
        //重定向到成功页面  可自行考虑与前台的交互
        response.sendRedirect("success.jsp");
        }
        catch (Exception e){
            System.out.println("注册失败");
            //此处进行逻辑处理即可
        }
    }

你可能感兴趣的:(Java)