EMail 工具类

EMail 工具类

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.*;
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;


/**    使用前 需要获取  IMAP/SMTP服务 的第三方的登录密码 才能使用
 *   Email 发送工具类 1.1.1
 *              功能 : 发送普通邮件
 *                      发送Html邮件
 *                      同时向多人发送邮件 邮件中带有图片, 附件
 *                     不需要在传图片名  ==》 去除需要将图片名上传 , 使用截取字符串
 maven 依赖:
 <!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api -->
 <dependency>
 <groupId>javax.mail</groupId>
 <artifactId>javax.mail-api</artifactId>
 <version>1.6.2</version>
 </dependency>
 */
public class MailUtil {

    // 邮件发送协议
    private final static String PROTOCOL = "smtp";

    // SMTP邮件服务器
    // qq.com  pop.qq.com smtp.qq.com
    private final static String HOST = "smtp.qq.com";

    // SMTP邮件服务器默认端口
    private final static String PORT = "25";

    // 是否要求身份认证
    private final static String IS_AUTH = "true";

    // 是否启用调试模式(启用调试模式可打印客户端与服务器交互过程时一问一答的响应消息)
    private final static String IS_ENABLED_DEBUG_MOD = "true";

    // 发件人
    //private String addressor = "xxxxxx54@qq.com" ;

    // 收件人
    //private String addressee = "xxxxxxan@hotmail.com";

    // 初始化连接邮件服务器的会话信息
    private static Properties props = null;

    static {
        props = new Properties();
        props.setProperty("mail.transport.protocol", PROTOCOL);
        props.setProperty("mail.smtp.host", HOST);
        props.setProperty("mail.smtp.port", PORT);
        props.setProperty("mail.smtp.auth", IS_AUTH);
        props.setProperty("mail.debug",IS_ENABLED_DEBUG_MOD);
    }

    /**
     *  发送简单的文本邮件
     * @param user   发送的邮箱名  ==》 取 @前的名字
     * @param password   SMTP 生成的第三方密码
     * @param addressor  发件人
     * @param addressee  收件人
     * @param subject   邮件主题名
     * @param content   内容
     * @return  true|false
     * @throws Exception  Exception
     */
    public boolean sendEmail(String user,String password,String addressor,String addressee,String subject,String content)throws Exception{
        try {
            // 创建Session实例对象
            Session session1 = Session.getDefaultInstance(props);

            // 创建MimeMessage实例对象
            MimeMessage message = new MimeMessage(session1);

            // 设置发件人
            message.setFrom(new InternetAddress(addressor));

            // 设置邮件主题
            message.setSubject(subject);

            // 设置收件人
            message.setRecipient(RecipientType.TO, new InternetAddress(addressee));

            // 设置发送时间
            message.setSentDate(new Date());

            // 设置纯文本内容为邮件正文
            message.setText(content);

            // 保存并生成最终的邮件内容
            message.saveChanges();

            // 获得Transport实例对象
            Transport transport = session1.getTransport();

            // 打开连接  xxxxxx4  rdpbuhymozfjbiag
            transport.connect(user, password);

            // 将message对象传递给transport对象,将邮件发送出去
            transport.sendMessage(message, message.getAllRecipients());

            // 关闭连接
            transport.close();
            return true;
        }catch(Exception e){
            e.printStackTrace();
            return false;
        }
    }


    /**  发送简单的html邮件
     * @param userName  发送的邮箱名  ==》 取 @前的名字
     * @param password   SMTP 生成的第三方密码
     * @param addressor   发送人邮箱
     * @param addressorName   发送人姓名
     * @param addressee   接收人邮箱
     * @param subject   邮件主题
     * @param content  邮件内容
     * @return   true|false
     * @throws Exception UnsupportedEncodingException
     */
    public boolean sendHtmlEmail(String userName,String password,String addressor,String addressorName,String addressee,String subject,String content)throws Exception{
        // 创建Session实例对象  xxxxxxx54
        MyAuthenticator myAuthenticator = new MyAuthenticator();
        myAuthenticator.setUsername(userName);
        myAuthenticator.setPassword(password);
        Session session1 = Session.getInstance(props,myAuthenticator);

        // 创建MimeMessage实例对象
        MimeMessage message = new MimeMessage(session1);

        // 设置邮件主题
        message.setSubject(subject);

        // 设置发送人
        message.setFrom(new InternetAddress(addressor));

        // 设置发送时间
        message.setSentDate(new Date());

        // 设置收件人
        message.setRecipients(RecipientType.TO, InternetAddress.parse(addressee));

        // 设置html内容为邮件正文,指定MIME类型为text/html类型,并指定字符编码为gbk
        message.setContent("<div style='width: 600px;margin: 0 auto'><h3 style='color:#003E64; text-align:center; '> "+ addressee +"</h3><p style='text-indent: 2em'> "+content+" </p><p style='text-align: right; color:#003E64; font-size: 20px;'></p></div>","text/html;charset=utf-8");

        //设置自定义发件人昵称
        String nick="";
        try {
            nick = javax.mail.internet.MimeUtility.encodeText(addressorName);
        }catch(UnsupportedEncodingException e){
            e.printStackTrace();
        }
        message.setFrom(new InternetAddress(nick+" <"+addressor+">"));

        // 保存并生成最终的邮件内容
        message.saveChanges();

        // 发送邮件
        try {
            Transport.send(message);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     *   发送带内嵌图片的HTML邮件
     * @param userName  发送的邮箱名  ==》 取 @前的名字
     * @param password  SMTP 生成的第三方密码
     * @param addressor   发送人邮箱
     * @param addressee  接收人邮箱
     * @param subject  邮件主题
     * @param content   邮件内容
     * @param imagePathName   图片的路径及图片名字  路径用“\\”
     * @return  true|false
     * @throws MessagingException  MessagingException
     */
    public boolean sendHtmlWithInnerImageEmail(String userName,String password,String addressor,String addressee,String subject,String content,String imagePathName)throws MessagingException{
        // 创建Session实例对象
        MyAuthenticator myAuthenticator = new MyAuthenticator();
        myAuthenticator.setUsername(userName);
        myAuthenticator.setPassword(password);
        Session session = Session.getDefaultInstance(props,myAuthenticator);
        // 创建邮件内容
        MimeMessage message = new MimeMessage(session);

        // 邮件主题,并指定编码格式
        message.setSubject(subject, "utf-8");

        // 发件人
        message.setFrom(new InternetAddress(addressor));

        // 收件人
        message.setRecipients(RecipientType.TO, InternetAddress.parse(addressee));

        // 抄送
        message.setRecipient(RecipientType.CC, new InternetAddress(addressee));

        // 密送 (不会在邮件收件人名单中显示出来)
        message.setRecipient(RecipientType.BCC, new InternetAddress(addressee));

        // 发送时间
        message.setSentDate(new Date());

        // 创建一个MIME子类型为“related”的MimeMultipart对象
        // MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
        MimeMultipart mp = new MimeMultipart("related");

        // 创建一个表示正文的MimeBodyPart对象,并将它加入到前面创建的MimeMultipart对象中
        MimeBodyPart htmlPart = new MimeBodyPart();
        mp.addBodyPart(htmlPart);

        // 创建一个表示图片资源的MimeBodyPart对象,将将它加入到前面创建的MimeMultipart对象中
        MimeBodyPart imagePart = new MimeBodyPart();
        mp.addBodyPart(imagePart);
        // 将MimeMultipart对象设置为整个邮件的内容
        message.setContent(mp);

        // 设置内嵌图片邮件体
        DataSource ds = new FileDataSource(new File(imagePathName));
        DataHandler dh = new DataHandler(ds);
        imagePart.setDataHandler(dh);
        String[] aa = imagePathName.split("\\\\");
        System.out.println("aa   ==> " + aa);
        String imageName = aa[aa.length-1];
        imagePart.setContentID(imageName);  // 设置内容编号,用于其它邮件体引用

        // 创建一个MIME子类型为"alternative"的MimeMultipart对象,并作为前面创建的htmlPart对象的邮件内容
        MimeMultipart htmlMultipart = new MimeMultipart("alternative");
        // 创建一个表示html正文的MimeBodyPart对象
        MimeBodyPart htmlBodypart = new MimeBodyPart();
        // 其中cid=androidlogo.gif是引用邮件内部的图片,即imagePart.setContentID("androidlogo.gif");方法所保存的图片
        htmlBodypart.setContent("<span style='color:red;'> " + content + " <img src=\""+ imageName +"\" /></span>","text/html;charset=utf-8");
        htmlMultipart.addBodyPart(htmlBodypart);
        htmlPart.setContent(htmlMultipart);

        // 保存并生成最终的邮件内容
        message.saveChanges();

        // 发送邮件
        Transport.send(message);

        return true;
    }


    /**
     *   发送带内嵌图片、附件、多收件人(显示邮箱姓名)、邮件优先级、阅读回执的完整的HTML邮件
     * @param userName  发送的邮箱名  ==》 取 @前的名字
     * @param password  SMTP 生成的第三方密码
     * @param addressor  发送人邮箱
     * @param addressorName  发送人的名字
     * @param subject  邮件主题
     * @param attachments   附件 ==》 多个 用List<String> 放置附件路径 , 要求使用 "\\"
     * @param imagePathName   图片路径的名称  路径用“\\”
     * @param content   邮件内容
     * @param addressees   接收人邮箱 ==》 多个  用List<String> 放置
     * @param addresseeNames   接收人姓名  ==》 多个  用List<String> 放置, 要求姓名的个数与接收人的数量一致
     * @return   true|false
     * @throws Exception  Exception
     */
    public boolean sendMultipleEmail(String userName, String password, String addressor, String addressorName, String subject, List<String> attachments,String imagePathName,String content,List<String> addressees,List<String> addresseeNames)throws Exception {

        for(int i = 0 ; i < attachments.size(); i++){

            String charset = "utf-8";   // 指定中文编码格式

            MyAuthenticator myAuthenticator = new MyAuthenticator();
            myAuthenticator.setUsername(userName);
            myAuthenticator.setPassword(password);
            // 创建Session实例对象
            Session session = Session.getDefaultInstance(props,myAuthenticator);

            // 创建MimeMessage实例对象
            MimeMessage message = new MimeMessage(session);

            // 设置主题
            message.setSubject(subject);

            // 设置发送人
            message.setFrom(new InternetAddress(addressor,addressorName,charset));

            // 设置收件人
            for(int z = 0 ; z < addressees.size(); z++){
                String addressee = addressees.get(z);
                String addresseeName = addresseeNames.get(z);
                message.setRecipients(RecipientType.TO,
                        new Address[]{
                                // 参数1:邮箱地址,参数2:姓名(在客户端收件只显示姓名,而不显示邮件地址),参数3:姓名中文字符串编码
                                new InternetAddress(addressee, addresseeName, charset),
                        }
                );
                // 设置抄送
                message.setRecipient(RecipientType.CC, new InternetAddress(addressee,addresseeName,charset));

                // 设置密送
                message.setRecipient(RecipientType.BCC, new InternetAddress(addressee, addresseeName, charset));

                // 设置发送时间
                message.setSentDate(new Date());

                // 设置回复人(收件人回复此邮件时,默认收件人)
                message.setReplyTo(InternetAddress.parse("\"" + MimeUtility.encodeText(addressorName) + "\" <"+ addressor +">"));

                // 设置优先级(1:紧急   3:普通    5:低)
                message.setHeader("X-Priority", "1");

                // 要求阅读回执(收件人阅读邮件时会提示回复发件人,表明邮件已收到,并已阅读)
                message.setHeader("Disposition-Notification-To", addressor);

                // 创建一个MIME子类型为"mixed"的MimeMultipart对象,表示这是一封混合组合类型的邮件
                MimeMultipart mailContent = new MimeMultipart("mixed");
                message.setContent(mailContent);

                // 附件
                MimeBodyPart attach = new MimeBodyPart();

                // 内容
                MimeBodyPart mailBody = new MimeBodyPart();

                // 将附件和内容添加到邮件当中
                mailContent.addBodyPart(attach);
                mailContent.addBodyPart(mailBody);

                String attachment = attachments.get(i);
                DataSource ds1 = new FileDataSource(attachment);
                DataHandler dh1 = new DataHandler(ds1);
                String[] aa = attachment.split("\\\\");
                String name = aa[aa.length-1];
                attach.setFileName(MimeUtility.encodeText(name));
                attach.setDataHandler(dh1);

                // 邮件正文(内嵌图片+html文本)
                MimeMultipart body = new MimeMultipart("related");  //邮件正文也是一个组合体,需要指明组合关系
                mailBody.setContent(body);

                // 邮件正文由html和图片构成
                MimeBodyPart imgPart = new MimeBodyPart();
                MimeBodyPart htmlPart = new MimeBodyPart();
                body.addBodyPart(imgPart);
                body.addBodyPart(htmlPart);

                // 正文图片
                DataSource ds3 = new FileDataSource(imagePathName);
                DataHandler dh3 = new DataHandler(ds3);
                imgPart.setDataHandler(dh3);
                String[] aaa = imagePathName.split("\\\\");
                String ImageName = aa[aa.length-1];
                imgPart.setContentID(ImageName);

                // html邮件内容
                MimeMultipart htmlMultipart = new MimeMultipart("alternative");
                htmlPart.setContent(htmlMultipart);
                MimeBodyPart htmlContent = new MimeBodyPart();
                htmlContent.setContent(
                        "<span style='color:red'>"+ content +
                                "<img src='cid:"+ ImageName +"' /></span>"
                        , "text/html;charset=gbk");
                htmlMultipart.addBodyPart(htmlContent);

                // 保存邮件内容修改
                message.saveChanges();

              
                // 发送邮件
                Transport.send(message);
            }
            return true;

        }
        return false;
    }

    public static void main(String[] args){
//        try {
//            boolean b = new MailUtil().sendEmail("xxxxx4","rdpbuhymozfjbiag","xxxxx4@qq.com", "xxxxx4@hotmail.com","测试","测试内容");
//
//            System.out.println("===> " + b);
//        }catch (Exception e){
//            e.printStackTrace();
//        }

//        try {
//            boolean b = new MailUtil().sendHtmlEmail("xxxxx4","rdpbuhymozfjbiag","xxxxx4@qq.com","咸鱼张","xxxxx4@hotmail.com","测试主题","邮件测试内容");
//            System.out.println("===> " + b);
//        }catch (Exception e){
//            e.printStackTrace();
//        }

//        try {
//            boolean b = new MailUtil().sendHtmlWithInnerImageEmail("xxxxx254","rdpbuhymozfjbiag","xxxxxx254@qq.com","xxxxxxxan@hotmail.com","测试带图片的邮件","邮件内容测试11111","G:\\images\\2233.jpg");
//            System.out.println("===> " + b);
//        }catch (Exception e){
//            e.printStackTrace();
//        }

//        try {
//            List list = new ArrayList();
//            list.add("G:\\images\\新建文本文档.md");
//            list.add("G:\\images\\12306-抢票.zip");
//            System.out.println("list  ==> " + list.toString());
//
//
//            List list2 = new ArrayList();
//            list2.add("xxxxxxan@hotmail.com");
//            list2.add("xxxxxx93@qq.com");
//            list2.add("xxxxxxx66@qq.com");
//            System.out.println("list2  ==> " + list2.toString());
//
//            List list3 = new ArrayList();
//            list3.add("测试一");
//            list3.add("测试二");
//            list3.add("测试三");
//            System.out.println("list3  ==> " + list3.toString());
//
//            boolean b = new MailUtil().sendMultipleEmail("xxxxxx54","rdpbuhymozfjbiag","xxxxxx54@qq.com","咸鱼一号","测试",list,"G:\\images\\2233.jpg","邮件测试内容",list2,list3);
//            System.out.println("===> " + b);
//        }catch(Exception e){
//            e.printStackTrace();
//        }


    }

    /**
     * 向邮件服务器提交认证信息
     */
    static class MyAuthenticator extends Authenticator {

        private String username;

        private String password;

        public MyAuthenticator() {
            super();
        }

        public MyAuthenticator(String username, String password) {
            super();
            this.username = username;
            this.password = password;
        }

        @Override
        protected PasswordAuthentication getPasswordAuthentication() {

            return new PasswordAuthentication(username, password);
        }

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }
    }

}


/* * JCatalog Project */ package com.hexiang.utils; import java.util.List; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.Properties; import javax.mail.Session; import javax.mail.Transport; import javax.mail.Message; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.hexiang.exception.CatalogException; /** * Utility class to send email. * * @author <a href="380595305@qq.com">hexiang</a> */ public class EmailUtil { //the logger for this class private static Log logger = LogFactory.getLog("com.hexiang.util.EmailUtil"); /** * Send email to a single recipient. * * @param smtpHost the SMTP email server address * @param senderAddress the sender email address * @param senderName the sender name * @param receiverAddress the recipient email address * @param sub the subject of the email * @param msg the message content of the email */ public static void sendEmail(String smtpHost, String senderAddress, String senderName, String receiverAddress, String sub, String msg) throws CatalogException { List<String> recipients = new ArrayList<String>(); recipients.add(receiverAddress); sendEmail(smtpHost, senderAddress, senderName, recipients, sub, msg); } /** * Send email to a list of recipients. * * @param smtpHost the SMTP email server address * @param senderAddress the sender email address * @param senderName the sender name * @param recipients a list of receipients email addresses * @param sub the subject of the email * @param msg the message content of the email */ public static void sendEmail(String smtpHost, String senderAddress, String senderName, List<String> recipients, String sub, String msg) throws CatalogException { if (smtpHost == null) { String errMsg = "Could not send email: smtp host address is null"; logger.error(errMsg); throw new CatalogException(errMsg); } try { Properties props = System.getProperties(); props.put("mail.smtp.host", smtpHost); Session session = Session.getDefaultInstance(props, null ); MimeMessage message = new MimeMessage( session ); message.addHeader("Content-type", "text/plain"); message.setSubject(sub); message.setFrom(new InternetAddress(senderAddress, senderName)); for (Iterator<String> it = recipients.iterator(); it.hasNext();) { String email = (String)it.next(); message.addRecipients(Message.RecipientType.TO, email); } message.setText(msg); message.setSentDate( new Date() ); Transport.send(message); } catch (Exception e) { String errorMsg = "Could not send email"; logger.error(errorMsg, e); throw new CatalogException("errorMsg", e); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

饭酱

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

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

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

打赏作者

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

抵扣说明:

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

余额充值