Java Mail 学习与简单实现总结(转)

转:邮件实现详解(四)--JavaMail 发送(带图片和附件)
补:附录中总结了一些遇到的问题与解决方案

1. Java Mail API 简介
    JavaMail,它支持一些常用的邮件协议,如SMTP,POP3,IMAP,还有MIME等。
    新建Maven工程,加入依赖
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4</version>
    </dependency>
    
   Java Mail API按照功能可以划分为如下三大类:
    ① 创建和解析邮件的API
    ② 发送邮件的API
    ③ 接收邮件的API
   
   三种类型的API在Java Mail中有多个类组成,主要的四个核心类:
    ① Message类:javax.mail.Message类是创建和解析邮件的核心API
       通常使用它的子类javax.mail.internet.MimeMessage类。它的实例表示一个电子邮件。
    ② Transport类: javax.mail.Transport类是发送邮件的核心API,它的实例是实现了某个邮件发送协议的邮件发送对象。
    ③ Store类: javax.mail.Store类是接收邮件的核心API,它的实例是实现了某个邮件接收协议的邮件接收对象。
    ④ Session类: javax.mail.Session类用于定义整个应用程序所需的环境信息,以及手机客户端与邮件服务器建立网络连接的会话信息
       邮件服务器的主机名、端口号、采用的邮件发送和接收协议。
       Session对象根据这些信息构建用于邮件发送的Transport和Store对象,以及为客户端创建Message对象提供信息支持。
    
    一句话:Message是卫星,Transport是火箭,卫星和火箭的构建都需要Session的帮助。
    
2. Java Mail 发送简单的纯文本邮件实现示例
    public class SendMail {
        
        //发件人地址:建MimeMessage实例使用
        private static String senderAddress = "*****@163.com";
        ///收件人地址:建MimeMessage实例使用
        private static String receiverAddress = "*****@qq.com";
        //发件人账户:建Transport实例使用
        private static String senderAccout = "*****@163.com";
        //发件人账户密码:建Transport实例使用(注:QQ邮箱有独立的支持第三方发邮件的登录密码)
        private static String senderPassword = "*****";

        public static void main(String[] args) throws Exception {
            
            Properties props = new Properties();
            //加载类路径下的properties文件
            props.load(SendMail.class.getResourceAsStream("/mail.properties"));
            //根据props生成整个环境所需要的环境信息Session对象
            Session session = Session.getInstance(props);
            //在控制台设置打印调试信息
            session.setDebug(true);
            
            //前面说了,session是生产卫星和火箭的重要信息,下面创建邮件的实例对象
            Message msg = getMimeMessage(session);
            
            //前面说了,session是生产卫星和火箭的重要信息,下面创建邮件传输对象
            Transport transport = session.getTransport();
            //设置发件人的账户名密码
            transport.connect(senderAccout, senderPassword);
            //发送邮件
            transport.sendMessage(msg, msg.getAllRecipients());
            
            //关闭邮件连接
            transport.close();
        }
        
        public static MimeMessage getMimeMessage(Session session) throws Exception {
            //前面说了,session是生产卫星和火箭的重要信息
            //创建一封邮件的实例对象
            MimeMessage msg = new MimeMessage(session);
            //设置发件人地址
            msg.setSender(new InternetAddress(senderAddress));
            /*
             * 设置收件人地址
             * MimeMessage.RecipientType.TO:发送
             * MimeMessage.RecipientType.CC:抄送
             * MimeMessage.RecipientType.BCC:密送
             */
            msg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiverAddress));
            //设置邮件主题
            msg.setSubject("JAVA Mail SendTest", "UTF-8");
            //设置邮件正文
            msg.setContent("First Java Mail,<br/>这是一封通过Java实现的电子邮件", "text/html;charset=utf-8");
            //设置邮件发送时间,默认立即发送
            msg.setSentDate(new Date());
            
            //返回编辑好的邮件实例(卫星)
            return msg;
        }
    }
    
    mail.properties文件:
    #user authentication
    mail.smtp.auth=true
    #transport protocol
    mail.transport.protocol=smtp
    #SMTP HOST of sender
    mail.smtp.host=smtp.163.com

    #port 465 not 25(out-time)
    mail.smtp.port=465
    #important -> a new SMTP based on SSL
    mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
    
3. Java Mail 发送带图片+文件的邮件实现示例

    public class SendPicFileTest {
        //发件人地址
        private static String senderAddress = "*****@163.com";
        //收件人地址
        private static String recipientAddress = "*****@qq.com";
        //发件人账户名
        private static String senderAccount = "*****@163.com";
        //发件人账户密码
        private static String senderPassword = "*****";
        
        public static void main(String[] args) throws Exception {
            //1. 加载smtp配置文件
            Properties props = new Properties();
            props.load(SendPicFileTest.class.getResourceAsStream("/mail.properties"));
            
            //2. 生成Session
            Session session = Session.getInstance(props);
            session.setDebug(true);
            //3. 生成Transport
            Transport transport = session.getTransport();
            transport.connect(senderAccount, senderPassword);
            
            //4. 生成要发送的邮件实例
            MimeMessage msg = getMimeMessage(session);
            //5. 发送邮件
            transport.sendMessage(msg, msg.getAllRecipients());
            //6. 关闭邮件链接
            transport.close();
            
        }
        
        public static MimeMessage getMimeMessage(Session session) throws Exception {
            MimeMessage msg = new MimeMessage(session);
            
            msg.setSubject("Java Mail Pic&Files", "utf-8");
            msg.setSender(new InternetAddress(senderAddress));
            msg.setRecipients(MimeMessage.RecipientType.TO, recipientAddress);
            
            //创建图片节点
            MimeBodyPart image = new MimeBodyPart();
            //读取文件
            DataHandler dh = new DataHandler(new FileDataSource(new File(SendPicFileTest.class.getClassLoader().getResource("mail.png").getPath())));
            //将图片数据添加到“节点”
            image.setDataHandler(dh);
            //为节点设置一个唯一的编号(在文本“节点”将引用该ID)
            image.setContentID("mailPic");
            
            //创建文本节点
            MimeBodyPart text = new MimeBodyPart();
            //加入文本内容
            text.setContent("<a href='https://blog.csdn.net/Juwenzhe_HEBUT'>你好,点击进入我的博客链接</a><br>", "text/html;charset=utf-8");
            
            //设置文本+图片的节点的关系,将文本和图片整合成一个节点
            MimeMultipart mm_text_image = new MimeMultipart();
            mm_text_image.addBodyPart(text);
            mm_text_image.addBodyPart(image);
            mm_text_image.setSubType("related");//关联关系
            
            //将文本+图片的混合节点,封装成普通的节点
            MimeBodyPart text_image = new MimeBodyPart();
            text_image.setContent(mm_text_image);
            
            //以上完成了图文内容的封装
            //下面,添加附件
            
            //创建附件节点
            MimeBodyPart attachment = new MimeBodyPart();
            //读取本地文件
        DataHandler dh2 = new DataHandler(new FileDataSource(new File(SendPicFileTest.class.getClassLoader().get Resource("jsontest.txt").getPath())));
            //把本地文件添加到附件节点
            attachment.setDataHandler(dh2);
            //设置附件名(加编码)
            attachment.setFileName(MimeUtility.encodeText(dh2.getName()));
            
            //将图文+附件生成一个大节点
            MimeMultipart mm = new MimeMultipart();
            mm.addBodyPart(text_image);
            mm.addBodyPart(attachment);
            mm.setSubType("mixed");//混合关系
            
            //将最终的混合节点作为邮件的内容添加到邮件对象
            msg.setContent(mm);
            
            return msg;
        }
    }
    
    [ Java Mail 接收邮件实现示例 用的很少,参考转载的大佬博客 ]
    
    转载:邮件实现详解(四)------JavaMail 发送(带图片和附件)和接收邮件
    补充:遇到的问题与解决方案 -->
       1. Maven项目中读取src/main/resources目录下的配置文件的方法
       2. 554 DT:SPM 163 smtp3解决方案http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html
       3. 获取src/main/resources下文件的绝对路径
       4. tcmime.6751.6880.18849.bin文件的产生原因:邮件的附件或者图片没有使用或者为空白时,系统随机分配的附件,不是病毒。
      5. 关于使用Java Mail进行邮件发送,抛出Could not connect to SMTP host: xx@xxx.com, port: 25的异常可能https://blog.csdn.net/qq_21647977/article/details/77743808
        6. Could not connect to SMTP host: smtp.***.com, port: 465, response: -1

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值