使用java mail 发送邮件

Posted MarcoReus

tags:

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

1.关联jar包:   activation.jar   mail.jar

2.调用 

@Test
    public void test1() {
        List<String> imageUrlList = Arrays.asList(new String[] { "src/美女1.jpg", "src/2.jpg", "src/2.jpg" });
        List<String> attachmentUrlList = Arrays.asList(new String[] { "src/光辉岁月.MP3", "src/美女1.jpg", "src/2.jpg" });

        MailInfo mailInfo = new MailInfo("us0911@126.com", "subject", "content");
        mailInfo.setImageUrlList(imageUrlList);
        MailUtils.getInstance().sendMail(mailInfo);
    }

 

3.封装代码

3.1配置文件: src/mailConfig.properties

#邮件发送服务器地址: 比如126邮件地址为 smtp.126.com
mail.smtp.host = localhost
#发件人账户
emailAddress = a@bvb.de
#发件人密码
password = a

3.2 实体类

package de.bvb.utils;

import java.util.List;

public class MailInfo {
    private String to;
    private String subject;
    private String content;
    private List<String> imageUrlList;
    private List<String> attachmentUrlList;

    public MailInfo() {
        super();
    }

    public MailInfo(String to, String subject, String content) {
        super();
        this.to = to;
        this.subject = subject;
        this.content = content;
    }

    public String getTo() {
        return to;
    }

    public void setTo(String to) {
        this.to = to;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public List<String> getImageUrlList() {
        return imageUrlList;
    }

    public void setImageUrlList(List<String> imageUrlList) {
        this.imageUrlList = imageUrlList;
    }

    public List<String> getAttachmentUrlList() {
        return attachmentUrlList;
    }

    public void setAttachmentUrlList(List<String> attachmentUrlList) {
        this.attachmentUrlList = attachmentUrlList;
    }

}
实体类
package de.bvb.utils;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
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 MailUtils {
    ///////////////////////////////////////////////////////////////
    //单例模式//////////////////////////////////////////////////////
    private static MailUtils instance;

    private MailUtils() {
    }

    public static MailUtils getInstance() {
        if (instance == null) {
            instance = new MailUtils();
        }
        return instance;
    }

    //单例模式//////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////

    private static Session session;
    private static String emailAddress;
    private static String username;
    private static String password;

    // 配置文件路径: src/mailConfig.properties
    static {
        try {
            Properties props = new Properties();
            props.setProperty("mail.transport.protocol", "smtp");
            props.setProperty("mail.smtp.auth", "true");
            props.load(MailUtils.class.getClassLoader().getResourceAsStream("mailConfig.properties"));
            emailAddress = props.getProperty("emailAddress");
            username = emailAddress.split("\\\\@")[0];
            password = props.getProperty("password");
            session = Session.getInstance(props);
            //session.setDebug(true);//启动调试,控制台打印交互信息
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public boolean sendMail(MailInfo info) {
        if (info == null) {
            throw new RuntimeException("信息不全");
        }
        try {
            Message message = createMail(info);
            Transport transport = session.getTransport();
            transport.connect(username, password);
            transport.sendMessage(message,  message.getAllRecipients());
            transport.close();
            System.out.println("发送成功");
            return true;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private Message createMail(MailInfo info) throws MessagingException, UnsupportedEncodingException {
        if (info == null) {
            return null;
        }
        //创建邮件
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(emailAddress));
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(info.getTo()));
        message.setSubject(info.getSubject());

        MimeMultipart root = new MimeMultipart();
        MimeMultipart contentImageMM = new MimeMultipart();
        StringBuilder main = new StringBuilder(info.getContent());

        //创建图片
        List<String> imageUrlList = info.getImageUrlList();
        if (imageUrlList != null && imageUrlList.size() > 0) {
            for (String imageUrl : imageUrlList) {
                String cid = generatorMD5(imageUrl); //id需要唯一,md5处理一把
                MimeBodyPart image1 = new MimeBodyPart();
                image1.setContentID(cid);
                image1.setDataHandler(new DataHandler(new FileDataSource(imageUrl)));
                main.append("<br/><img src=\'cid:").append(cid).append("\'>");
                contentImageMM.addBodyPart(image1);
            }
        }

        //描述数据之间的关系(正文和图片) 在封装到MimeBodyPart中去
        MimeBodyPart content = new MimeBodyPart();
        content.setContent(main.toString(), "text/html;charset=UTF-8");
        contentImageMM.addBodyPart(content);
        contentImageMM.setSubType("related");
        MimeBodyPart contentImage = new MimeBodyPart();
        contentImage.setContent(contentImageMM);

        //创建附件
        List<String> attachmentUrlList = info.getAttachmentUrlList();
        if (attachmentUrlList != null && attachmentUrlList.size() > 0) {
            for (String attachmentUrl : attachmentUrlList) {
                MimeBodyPart attachment1 = new MimeBodyPart();
                DataHandler handler1 = new DataHandler(new FileDataSource(attachmentUrl));
                attachment1.setDataHandler(handler1);
                attachment1.setFileName(MimeUtility.encodeText(handler1.getName()));
                root.addBodyPart(attachment1);
            }
        }

        //描述数据之间的关系(把正文和图片封装后的MimeBodyPart,再和附件封装)
        root.addBodyPart(contentImage);
        contentImageMM.setSubType("mixed");

        //封装保存数据
        message.setContent(root);
        message.saveChanges();
        return message;
    }

    private String generatorMD5(String pwd) {
        //用于加密的字符  
        char md5String[] = { \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'A\', \'B\', \'C\', \'D\', \'E\', \'F\' };
        try {
            //使用平台的默认字符集将此 String 编码为 byte序列,并将结果存储到一个新的 byte数组中  
            byte[] btInput = pwd.getBytes();
            //信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。  
            MessageDigest mdInst = MessageDigest.getInstance("MD5");
            //MessageDigest对象通过使用 update方法处理数据, 使用指定的byte数组更新摘要  
            mdInst.update(btInput);
            // 摘要更新之后,通过调用digest()执行哈希计算,获得密文  
            byte[] md = mdInst.digest();
            // 把密文转换成十六进制的字符串形式  
            int j = md.length;
            char str[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) { //  i = 0  
                byte byte0 = md[i]; //95  
                str[k++] = md5String[byte0 >>> 4 & 0xf]; //    5   
                str[k++] = md5String[byte0 & 0xf]; //   F  
            }
            //返回经过加密后的字符串  
            return new String(str);
        } catch (Exception e) {
            return null;
        }
    }
}
工具类

 

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

代码片段

javax.mail.SendFailedException 为啥当我尝试通过我的 java 代码发送电子邮件时收到上述异常?

Java实现发送邮件功能

JAVA使用javax.mail发送邮件

从Oracle存储过程Oracle 11g发送邮件

Java mail发送邮件附件出现.eml文件夹