java_邮件

Posted 幻影黑子

tags:

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

导包:activation.jar、mail.jar

1、测试代码:(这里使用的是QQ邮箱主机)

package com.canzhen.demo.simple;

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;
import javax.mail.internet.MimeUtility;
import java.io.UnsupportedEncodingException;
import java.util.Properties;

public class SimpleEmail {
    public static void main(String[] args) {
        // 收件人电子邮箱
        String to = "XXX@qq.com";

        // 发件人电子邮箱
        String from = "XXX@qq.com";

        // 指定发送邮件的服务器为 QQ邮箱主机
        String host = "smtp.qq.com";

        // 获取系统属性
        Properties properties = System.getProperties();

        // 设置邮件服务器
        properties.setProperty("mail.smtp.host", host);

        //设置是否认证
        properties.put("mail.smtp.auth", "true");

        //认证
        Authenticator authenticator = new Authenticator(){
            public PasswordAuthentication getPasswordAuthentication()
            {
                //发件人邮件用户名、授权码(使用第三方时需要提供授权码,而不是密码)
                return new PasswordAuthentication("XXX@qq.com", "XXX");
            }
        };

        // 获取默认session对象
        Session session = Session.getDefaultInstance(properties,authenticator);

        try{
            // 创建默认的 MimeMessage 对象
            MimeMessage message = new MimeMessage(session);

            // Set From: 发件人,头部头字段
            message.setFrom(new InternetAddress(from));

            // Set To: 收件人,头部头字段,单发
            message.addRecipient(Message.RecipientType.TO,
                    new InternetAddress(to));

            //多发
            // void addRecipients(Message.RecipientType type,
            //                   Address[] addresses)
            //throws MessagingException
            // 下面是对于参数的描述:
            //
            //type:要被设置为 TO, CC 或者 BCC,这里 CC 代表抄送、BCC 代表秘密抄送。举例:Message.RecipientType.TO
            //
            //addresses: 这是 email ID 的数组。在指定电子邮件 ID 时,你将需要使用 InternetAddress() 方法。

            // Set Subject: 主题,头部头字段
            message.setSubject("This is the Subject Line!");

            // 设置消息体,邮件内容
            //setText进入源码,可以看到底层调用setContent,而setContent会new一个DataHandler,所以会覆盖掉之前的setContent
//            message.setText("This is actual message");

            // 发送 html 消息, 可以插入html标签
//            message.setContent("<h1>This is actual message</h1>",
//                    "text/html" );

            //发送带有附件的 E-mail
            // 创建文本消息部分
            BodyPart messageBodyPart = new MimeBodyPart();

            // 消息
            messageBodyPart.setText("This is message body");

            // 创建多重消息
            Multipart multipart = new MimeMultipart();

            // 设置文本消息部分
            multipart.addBodyPart(messageBodyPart);

            // 创建附件部分
            messageBodyPart = new MimeBodyPart();
            String filename = "E:\桌面壁纸\哈哈.png";
            DataSource source = new FileDataSource(filename);
            messageBodyPart.setDataHandler(new DataHandler(source));
            //就只这行可以防止文件名乱码
            String newFileName =  MimeUtility.encodeText(source.getName(),"utf-8",null);
            messageBodyPart.setFileName(newFileName);
            multipart.addBodyPart(messageBodyPart);

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

            // 发送消息
            Transport.send(message);
            System.out.println("Sent message successfully....");
        }catch (MessagingException | UnsupportedEncodingException mex) {
            mex.printStackTrace();
        }
    }
}

2、邮件工具:

package com.canzhen.demo.util;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
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;
import javax.mail.internet.MimeUtility;
import java.io.UnsupportedEncodingException;
import java.util.Properties;

public class MultiEmailUtil {
    private Properties props;//用来存储一些邮件的属性,设置几个等待时间什么的。
    private String[] params = new String[2];//用来存储发件人和授权码

    /**
     * @param transportType 邮件发送方式
     * @param serviceType 服务器类型
     * @param servicePort 服务器端口号
     * @param fromEMail   发件人
     * @param authPassword 授权码
     */
    public MultiEmailUtil(String transportType,String serviceType,String  servicePort,String fromEMail ,String authPassword)
    {

        //       // 获取默认的 Session 对象。
        // 1.创建一个程序与邮件服务器会话对象 Session
        Properties tProps = new Properties();
        tProps.put("mail.transport.protocol", transportType);
        tProps.put("mail.smtp.host",serviceType );//smtp.exmail.qq.com 这个例子是qq的企业邮箱的服务器
        tProps.put("mail.smtp.port", servicePort);//一般默认都是 25
        // 指定验证为true
        tProps.setProperty("mail.smtp.auth", "true");
        // props.setProperty("mail.smtp.timeout","1000");
        tProps.put("mail.smtp.timeout", 100000);//这几个参数很有必要
        tProps.put("mail.smtp.connectiontimeout", 100000);//这几个参数很有必要
        tProps.put("mail.smtp.writetimeout",100000);//这几个参数很有必要
        props = (Properties) tProps.clone();
        params[0]=fromEMail;//如果可以最好弄一个加密的方式
        params[1]=authPassword;//如果可以最好弄一个加密的方式
    }

    /***
     *
     * @param mailTO    收件人集合,这个不可以为空,哈哈哈
     * @param mailCC    抄送人集合,可以传null,若果是null就当做没有抄送
     * @param contentTop 邮件标题,可以传null,默认值是 "您有,一封邮件待查收"
     * @param contentText 邮件正文,可以传null,默认值是 "各位好:"
     * @param fileName    附件的绝对地址,可以传null,如果是null就默认当做不添加附件
     */
    public boolean sendEmail(String[] mailTO,String[] mailCC,String contentTop,String contentText,String fileName)
    {
        //收件人不能是空
        if (mailTO == null || mailTO.length == 0)
            return false;
        // 认证
        Authenticator auth = new Authenticator() {
            @Override
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(params[0], params[1]);
            }
        };
        Session session = Session.getInstance(props, auth);//居然发现了一个final的类,和String一样,哈哈

        try{
            // 创建默认的 MimeMessage 对象。
            MimeMessage message = new MimeMessage(session);

            // Set From: 发件人,头部头字段
            message.setFrom(new InternetAddress(params[0]));

            Address addressesTO[] = new Address[mailTO.length];

            //循环收件人
            for (int i = 0; i < mailTO.length ; i++)
            {
                addressesTO[i] = (Address) new InternetAddress(mailTO[i]).clone();
            }
            message.addRecipients(Message.RecipientType.TO,addressesTO);//设置收件人
            //对抄送人进行处理
            if( ! (mailCC == null|| mailCC.length == 0)) {
                Address addressesCC[] = new Address[mailCC.length];
                //循环抄送人
                for (int i = 0; i < mailCC.length; i++)
                {
                    addressesCC[i] = (Address) new InternetAddress(mailCC[i]).clone();
                }
                message.addRecipients(Message.RecipientType.CC, addressesCC);//设置抄送人
            }
            // Set Subject: 头字段
            if(contentTop == null || contentTop.equals(""))
            {
                message.setSubject("您有,一封邮件待查收");
            }else {
                message.setSubject(contentTop);
            }
            // 创建消息部分
            BodyPart messageBodyPart = new MimeBodyPart();
            // 消息
            if(contentText == null || contentText.equals("")){
                messageBodyPart.setText("各位好:");
            }else{
                messageBodyPart.setText(contentText);
            }
            // 创建多重消息
            Multipart multipart = new MimeMultipart();
            // 设置文本消息部分
            multipart.addBodyPart(messageBodyPart);
            // String tFileName = fileName;
            //目前没有对目录做校验,后续再添加吧
            if (!( fileName == null || fileName.equals(""))){
                // 附件部分
                messageBodyPart = new MimeBodyPart();
                DataSource source = new FileDataSource(fileName);
                messageBodyPart.setDataHandler(new DataHandler(source));
                //就只这行可以防止乱码
                String newFileName =  MimeUtility.encodeText(source.getName(),"utf-8",null);
                messageBodyPart.setFileName(newFileName);
                multipart.addBodyPart(messageBodyPart);
            }

            // 发送完整消息
            message.setContent(multipart,"text/html;charset=utf-8");
            //   发送消息
            Transport.send(message);

            System.out.println("Sent message successfully....");

        }catch (MessagingException | UnsupportedEncodingException mex) {
            mex.printStackTrace();
        }
        return true;
    }
}

测试:

package com.canzhen.demo.test;

import com.canzhen.demo.util.MultiEmailUtil;

public class UtilTest {
    public static void main(String[] args) {
        String[] mailTO = {"XXX@qq.com"};//收件人
        String[] mailCC = {"XXX@qq.com"};//抄送人
        String contentTop = "这是一个邮件的题目";
        String contentText = "这是这个邮件的正文";
        String fileName = "E:\桌面壁纸\哈哈.png";//如果有附件的话这填写地址
        new MultiEmailUtil("SMTP","smtp.qq.com","25","XXX@qq.com",
                "XXX").sendEmail(mailTO,mailCC,contentTop,contentText,fileName);
    }
}

以上是关于java_邮件的主要内容,如果未能解决你的问题,请参考以下文章

超实用的php代码片段

我应该如何使用 Outlook 发送代码片段?

java_邮件

添加超链接时,VBA抛出错误1004

代码片段

导航 PopUpToInclusive 不起作用?重新打开应用程序时,它会打开登录片段而不是电子邮件登录片段