zoukankan      html  css  js  c++  java
  • [转]JavaMail的使用之邮件发送 详解

      近日心情不爽,项目做烦了,就不想做项目了,停了下来,想做些JavaMail的开发。

      上网看了些教程,发现网上的文章虽然很多,但大都有些问题,包括:有些文章写得很全,但感觉太纷繁复杂,没有个提纲,感觉很乱。有些文章没有把问题写全,对于很多情况,程序能运行,但邮件就是发不了。

      对于JavaMail,最基础的功能就是邮件的发送和接收,在这里,我先讲一讲邮件的发送。

      在写具体的程序前,先讲一些概念。1.邮件的发送:如果你的邮件地址是a@host.com,而你要用这个邮箱发送一封邮件到to@tohost.com,这个发送过程是怎样的呢,你以为是先连接到tohost.com这服务器上,然后把邮件发送出去吗?其实不然。最初,你需要连接到服务器host.com上,当然这个连接可能需要认证,然后是发送邮件到服务器host.com上,关闭连接。在host.com上,你所发送的邮件进入发送队列中,轮到你要发送的邮件时,host.com主机再联系tohost.com,将邮件传输到服务器tohost.com上。2.一些垃圾邮件的发送:在垃圾邮件中,可能大部分的发件人的地址都是假的,这是怎么回事呢?实际上在发送这些垃圾邮件的时候,这里的host.com有些特别,可能host.com不需要对用户进行认证,也可能发送垃圾邮件的人本来就控制着服务器host.com,然后控制着host.com向其他服务器,如tohost.com,发送邮件,而发送邮件的内容可以被控制,发件人的地址就可以随便填写。

      发送邮件主要包括3个部分:创建连接,创建邮件体,发送邮件

      JavaMail中,是使用会话(Session)来管理连接的。创建一个连接,就需要创建一个会话。在会话中,有两个重要的因素,一是会话的属性,二是会话的认证。在我们使用Hotmail等邮件工具的时候,就要设置”SMTP服务器身份验证,也就是这里的会话的认证。

     

      首先,创建一个连接属性。

    Properties props = new Properties();
    
    props.put("mail.smtp.host","smtp.126.com");  //设置smtp的服务器地址是smtp.126.com
    
    props.put("mail.smtp.auth","true");          //设置smtp服务器要身份验证。

     

      再创建一个身份验证。身份验证稍微复杂一点,要创建一个Authenticator的子类,并重载getPasswordAuthentication()方法,代码如下:

    class PopupAuthenticator extends Authenticator {
    
        public PasswordAuthentication getPasswordAuthentication() {
    
            String username = "cqhcp"; //126邮箱登录帐号
    
            String pwd = "12345"; //登录密码
    
            return new PasswordAuthentication(username, pwd);
    
        }
    
    }

      创建身份验证的实例:

    PopupAuthenticator auth = new PopupAuthenticator();

     

      创建会话关于会话的创建,有两种方法,具体请参看后续的文章,这里只简单使用一种。

    Session session = Session.getInstance(props, auth);

     

      定义邮件地址:

    //发送人地址
    
    Address addressFrom = new InternetAddress("cqhcp@126.com", "George Bush");
    
    //收件人地址
    
    Address addressTo = new InternetAddress("webmaster@javazy.com", "George Bush");
    
    //抄送地址
    
    Address addressCopy = new InternetAddress("haocongping@gmail.com", "George Bush");

     

      创建邮件体:

    message.setContent("Hello", "text/plain");//或者使用message.setText("Hello");更详细的信息请参看后续文章.
    
    message.setSubject("Title");
    
    message.setFrom(addressFrom);
    
    message.addRecipient(Message.RecipientType.TO,addressTo);
    
    message.addRecipient(Message.RecipientType.CC,addressCopy);
    
    message.saveChanges();

     

      发送邮件的过程:

    Transport transport = session.getTransport("smtp");//创建连接
    
    transport.connect("smtp.126.com", "cqhcp", "12345");//连接服务器
    
    transport.send(message);//发送信息
    
    transport.close();//关闭连接

     

      整体程序的代码如下:

    class PopupAuthenticator extends Authenticator {
    
        public PasswordAuthentication getPasswordAuthentication() {
    
            String username = "cqhcp"; //163邮箱登录帐号
    
            String pwd = "12345"; //登录密码
    
            return new PasswordAuthentication(username, pwd);
    
        }
    
    }
    
     
    
    Properties props = new Properties();
    
    props.put("mail.smtp.host","smtp.126.com");
    
    props.put("mail.smtp.auth","true");
    
    PopupAuthenticator auth = new PopupAuthenticator();
    
    Session session = Session.getInstance(props, auth);
    
    MimeMessage message = new MimeMessage(session);
    
               
    Address addressFrom = new InternetAddress("cqhcp@126.com", "George Bush");
    
    Address addressTo = new InternetAddress("webmaster@javazy.com", "George Bush");
    
    Address addressCopy = new InternetAddress("haocongping@gmail.com", "George Bush");
     
    
    message.setContent("Hello", "text/plain");//或者使用message.setText("Hello");
    
    message.setSubject("Title");
    
    message.setFrom(addressFrom);
    
    message.addRecipient(Message.RecipientType.TO,addressTo);
    
    message.addRecipient(Message.RecipientType.CC,addressCopy);
    
    message.saveChanges();
    
     
    Transport transport = session.getTransport("smtp");
    
    transport.connect("smtp.126.com", "cqhcp", "12345");
    
    transport.send(message);
    
    transport.close();
  • 相关阅读:
    fastJson Gson对比及java序列化问题
    HashMap遍历时的性能对比
    FileChannel与ByteBuffer的使用示例
    spring boot中ConditionalOnClass为什么没有classNotFound类加载异常
    maven插件: shade, assembly
    spring容器中的beanName
    线程状态
    IDEA插件
    IDEA 工具使用指南
    方法调用:对象的传值与传引用
  • 原文地址:https://www.cnblogs.com/xzs603/p/2844995.html
Copyright © 2011-2022 走看看