• Android Java使用JavaMail API发送和接收邮件的代码示例


    JavaMail是Oracle甲骨文开发的Java邮件类API,支持多种邮件协议,这里我们就来看一下Java使用JavaMail API发送和接收邮件的代码示例

    使用Javamail发送邮件,必需的jar包(请下载javamail的源文件,官方下载页:http://www.oracle.com/technetwork/java/javamail/index-138643.html):
    mailapi.jar。定义了收发邮件所使用到的接口API;
    smtp.jar。包含了发送邮件使用到的类;
    pop3.jar。包含了收邮件使用到的类;
    我们通常发送邮件使用的协议是smtp协议,接受邮件使用的协议是pop3协议。或者,我们直接将mail.jar加入到工程,这个jar包里边包含了java收发邮件所有的接口和类。

    常用的类:
    1.     javax.mail.Session;                                                    -------->保存连接服务器所需要的信息;
    2.     javax.mail.Message;                                                  -------->邮件体,保存邮件的内容;
    3.     javax.mail.Transport;                                                 -------->发送邮件的载体
    4.     javax.mail.internet.InternetAddress;                         -------->邮件的地址信息

    发送邮件

    下边,我先列出使用Java发送邮件的最简单的一个小测试示例:

    import java.util.Properties; 
      
    import javax.mail.Address; 
    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.MimeMessage; 
      
    /** 
     * 
     * QQ(mail.qq.com):POP3服务器(端口995)SMTP服务器(端口465或587)。 
     * 
     */
    public class Demo1 { 
      
      /** 
       * @param args 
       * @throws MessagingException 
       */
      public static void main(String[] args) throws MessagingException { 
          
        String sendUserName = "wangxiangpan@126.com"; 
        String sendPassword = "pwd"; 
          
        Properties properties = new Properties(); 
        properties.setProperty("mail.smtp.auth", "true");//服务器需要认证 
        properties.setProperty("mail.transport.protocol", "smtp");//声明发送邮件使用的端口 
          
        Session session = Session.getInstance(properties); 
        session.setDebug(true);//同意在当前线程的控制台打印与服务器对话信息 
          
        Message message = new MimeMessage(session);//构建发送的信息 
        message.setText("你好,我是Champion.Wong!");//信息内容 
        message.setFrom(new InternetAddress("wangxiangpan@126.com"));//发件人 
          
        Transport transport = session.getTransport(); 
        transport.connect("smtp.126.com", 25, sendUserName, sendPassword);//连接发件人使用发件的服务器 
        transport.sendMessage(message, new Address[]{new InternetAddress("492134880@qq.com")});//接受邮件 
        transport.close(); 
      } 
      
    } 

    一般的,我们使用Authenticator把用户名和密码封装起来,不透明!所以:

    import javax.mail.Authenticator; 
    import javax.mail.Message; 
    import javax.mail.MessagingException; 
    import javax.mail.PasswordAuthentication; 
    import javax.mail.Session; 
    import javax.mail.Transport; 
    import javax.mail.internet.AddressException; 
    import javax.mail.internet.InternetAddress; 
    import javax.mail.internet.MimeMessage; 
      
    import junit.framework.TestCase; 
      
    /** 
     * javamail 发送邮件 
     * @author Champion Wong 
     * Message.addRecipient(Message.Recipient recipient, Address address); 发邮件的时候指定收件人和收件人的角色 
     * Message.RecipientType.TO 收件人 
     * Message.RecipientType.CC 抄送,即发邮件的时候顺便给另一个人抄一份,不用回复!但是,上边的收件人可以看到你都抄送给了谁 
     * Message.RecipientType.BCC 暗送,也是发邮件的时候顺便给另一个人暗发一份,但是,不同于上边的是,收件人不能看到你都暗送给了谁 
     * 
     */
    public class Demo2 extends TestCase { 
      
      private static final String sendUserName = "wangxiangpan@126.com";// 发送邮件需要连接的服务器的用户名 
      
      private static final String sendPassword = "pwd";// 发送邮件需要连接的服务器的密码 
      
      private static final String sendProtocol = "smtp";// 发送邮件使用的端口 
      
      private static final String sendHostAddress = "smtp.126.com";// 发送邮件使用的服务器的地址 
      
      public void test() throws AddressException, MessagingException { 
      
        Properties properties = new Properties(); 
        properties.setProperty("mail.smtp.auth", "true");// 服务器需要认证 
        properties.setProperty("mail.transport.protocol", sendProtocol);// 声明发送邮件使用的端口 
        properties.setProperty("mail.host", sendHostAddress);// 发送邮件的服务器地址 
      
        Session session = Session.getInstance(properties, new Authenticator() { 
          protected PasswordAuthentication getPasswordAuthentication() { 
            return new PasswordAuthentication(sendUserName, sendPassword); 
          } 
        }); 
        session.setDebug(true);//在后台打印发送邮件的实时信息 
      
        Message message = new MimeMessage(session); 
        message.setFrom(new InternetAddress("wangxiangpan@126.com")); 
        message.setSubject("Demo2JavaCode发送邮件测试,采用Authenticator");// 设置主题 
        message.setRecipients(Message.RecipientType.TO, InternetAddress 
            .parse("492134880@qq.com,wangxiangpan@126.com"));// 发送 
        message.setRecipients(Message.RecipientType.CC, InternetAddress 
            .parse("msn_wangxiangpan@hotmail.com"));// 抄送 
        message 
            .setContent( 
                "<span style="font-size:20px; color:#FFCCFF" mce_style="font-size:20px; color:#FFCCFF">如果您看到,证明测试成功了!</span>", 
                "text/html;charset=gbk"); 
      
        Transport.send(message);//发送邮件 
      } 
    } 

    我们发送一个比较复杂的邮件,包括附件,图文:

    import java.io.FileNotFoundException; 
    import java.io.FileOutputStream; 
    import java.io.IOException; 
    import java.io.OutputStream; 
    import java.util.Properties; 
      
    import javax.activation.DataHandler; 
    import javax.activation.DataSource; 
    import javax.activation.FileDataSource; 
    import javax.mail.Authenticator; 
    import javax.mail.MessagingException; 
    import javax.mail.PasswordAuthentication; 
    import javax.mail.Session; 
    import javax.mail.Transport; 
    import javax.mail.Message.RecipientType; 
    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; 
      
    /** 
     * 
     * @author Administrator Mr XP.Wang 
     * MimeMultipart 一般电子邮件的容器是Multipart,定义了增加及删除电子邮件各部分内容的方法, 
     *        但是其是抽象类,需要其子类MimeMultipart来时用MimeMessage对象 
     * MimeBodyPart 是BodyPart具体用于mimeMessage的一个子类,MimeBodyPart对象代表一个 
     *       mimeMultipart对象的每一个部分 
     * MimeUtility.encodeText(String cn)用于解决邮件中的头部信息中中文的乱码问题 
     * 
     */
    public class Demo3_test { 
      
      public static void main(String[] args) throws Exception { 
          
        Properties properties = new Properties(); 
        properties.setProperty("mail.smtp.auth", "true");// 服务器需要认证 
        properties.setProperty("mail.transport.protocol", "smtp");// 声明发送邮件使用的端口 
        properties.setProperty("mail.host", "smtp.126.com");// 发送邮件的服务器地址 
          
        Session session = Session.getInstance(properties, new Authenticator() { 
          String sendUserName = "wangxiangpan@126.com"; 
          String sendPassword = "pwd"; 
          protected PasswordAuthentication getPasswordAuthentication() { 
            return new PasswordAuthentication(sendUserName, 
                sendPassword); 
          } 
        }); 
        session.setDebug(true); 
          
        MimeMessage msg = new MimeMessage(session);// 声明一个邮件体 
        msg.setFrom(new InternetAddress("/""+MimeUtility.encodeText("Mr XP.Wang")+"/"<wangxiangpan@126.com>")); 
        msg.setSubject("这是我的第一份复杂邮件");//设置邮件主题 
        msg.setRecipients(MimeMessage.RecipientType.TO, InternetAddress.parse(MimeUtility.encodeText("王翔攀")+"<wangxiangpan@126.com>,"+MimeUtility.encodeText("三毛")+"<492134880@qq.com>")); 
      
        MimeMultipart msgMultipart = new MimeMultipart("mixed");// 标明邮件的组合关系,混合的关系 
        msg.setContent(msgMultipart);// 设置邮件体 
          
      
        MimeBodyPart attch1 = new MimeBodyPart();// 附件1 
        MimeBodyPart attch2 = new MimeBodyPart();// 附件2 
        MimeBodyPart content = new MimeBodyPart();// 邮件的正文,混合体(图片+文字) 
      
        // 将附件和正文设置到这个邮件体中 
        msgMultipart.addBodyPart(attch1); 
        msgMultipart.addBodyPart(attch2); 
        msgMultipart.addBodyPart(content); 
          
      
        // 设置第一个附件 
        DataSource ds1 = new FileDataSource("F:/ACCP5.0/文件/ssh配置.txt");// 指定附件的数据源 
        DataHandler dh1 = new DataHandler(ds1);// 附件的信息 
        attch1.setDataHandler(dh1);// 指定附件 
        attch1.setFileName("ssh.txt"); 
      
        // 设置第二个附件 
        DataSource ds2 = new FileDataSource("resource/48.jpg");// 指定附件的数据源 
        DataHandler dh2 = new DataHandler(ds2);// 附件的信息 
        attch2.setDataHandler(dh2);// 指定附件 
        attch2.setFileName("48.jpg"); 
      
        //设置邮件的正文 
        MimeMultipart bodyMultipart = new MimeMultipart("related");//依赖关系 
        content.setContent(bodyMultipart);//指定正文 
        MimeBodyPart htmlPart = new MimeBodyPart(); 
        MimeBodyPart gifPart = new MimeBodyPart(); 
        bodyMultipart.addBodyPart(htmlPart); 
        bodyMultipart.addBodyPart(gifPart); 
          
          
        DataSource gifds = new FileDataSource("resource/48.jpg");//正文的图片 
        DataHandler gifdh = new DataHandler(gifds); 
        gifPart.setHeader("Content-Location", "http://mimg.126.net/logo/126logo.gif"); 
        gifPart.setDataHandler(gifdh);//设置正文的图片 
          
        htmlPart.setContent("我只是来打酱油的,这是我的形象照!<img src="/" mce_src="/""http://mimg.126.net/logo/126logo.gif/">", "text/html;charset=gbk");//设置正文文字 
          
        msg.saveChanges();//保存邮件 
          
        //将邮件保存成文件 
        OutputStream ops = new FileOutputStream("C:/Users/Administrator/Desktop/test.eml"); 
        msg.writeTo(ops); 
        ops.close(); 
          
        Transport.send(msg); 
      } 
      
    } 

    收取邮件
    示例:Rose 收取最近一封邮件。

    import java.util.Date;
    import java.util.Properties;
    import javax.mail.Folder;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.NoSuchProviderException;
    import javax.mail.Session;
    import javax.mail.Store;
     
    public class FetchMail {
     
      public static void main(String[] args) {
        String protocol = "pop3";
        boolean isSSL = true;
        String host = "pop.163.com";
        int port = 995;
        String username = "rose@163.com";
        String password = "rose";
     
        Properties props = new Properties();
        props.put("mail.pop3.ssl.enable", isSSL);
        props.put("mail.pop3.host", host);
        props.put("mail.pop3.port", port);
     
        Session session = Session.getDefaultInstance(props);
     
        Store store = null;
        Folder folder = null;
        try {
          store = session.getStore(protocol);
          store.connect(username, password);
     
          folder = store.getFolder("INBOX");
          folder.open(Folder.READ_ONLY);
     
          int size = folder.getMessageCount();
          Message message = folder.getMessage(size);
     
          String from = message.getFrom()[0].toString();
          String subject = message.getSubject();
          Date date = message.getSentDate();
     
          System.out.println("From: " + from);
          System.out.println("Subject: " + subject);
          System.out.println("Date: " + date);
        } catch (NoSuchProviderException e) {
          e.printStackTrace();
        } catch (MessagingException e) {
          e.printStackTrace();
        } finally {
          try {
            if (folder != null) {
              folder.close(false);
            }
            if (store != null) {
              store.close();
            }
          } catch (MessagingException e) {
            e.printStackTrace();
          }
        }
     
        System.out.println("接收完毕!");
      }
    }
  • 相关阅读:
    【做题记录】区间排序—线段树
    【做题记录】CF1428E Carrots for Rabbits—堆的妙用
    线段树合并、分裂
    一、drf入门规范
    七、Django实战--图书管理系统搭建
    六、ORM模型层补充
    五、Django之模型层
    四、Django之模板层
    三、Django之视图层
    二、Django之路由层
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/6295467.html
Copyright © 2020-2023  润新知