发送邮件的原理

概叙

邮件服务器:

  • 要在 Internet 上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在 Internet 很多 提供邮件服务的厂商:sina、sohu、163 等等他们都有自己的邮件服务器。
  • 这些服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投 递到邮件接收者的电子邮箱中。
  • 邮件服务器,按照提供的服务类型,可以分为发送邮件的服务器和接收邮件的服务器。

电子邮箱:

  • 电子邮箱(E-mail 地址)的获得需要在邮件服务器上进行申请,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个帐户。用户在邮件服务器上申请了一个帐号后,邮件服务器就会为这个帐号分配一定的空间,用户从而可以使用这个帐号以及空间,发送和接收电子邮件。

邮件协议

SMTP 协议-发邮件协议

  • 全称为 Simple Mail Transfer Protocol(简单邮件传输协议),它定义了邮件客户端软件与 SMTP 服务器之间、以及两台 SMTP 服务器之间的通讯规则。
  • 端口号:25。

POP3 协议-收邮件协议

  • 全称为 Post Office Protocol(邮局协议),它定义了邮件客户端软件与 POP3 服务器的通讯规则。
  • 端口号:110。

发送邮件流程

  img

JavaMail

JavaMail是提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。

使用JavaMail需要导入两个jar包,mail.jar、activation.jar。

使用qq邮箱发送邮件

使用qq邮箱发送邮件必须联网,否则无效。

package com.kindleheart.store.utils;

import java.util.Properties;

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.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;


public class MailTest {

    public static void main(String[] args) throws MessagingException {
        //服务器的设置
        Properties props = new Properties();
        props.setProperty("mail.host", "smtp.qq.com");//设置服务器地址
        props.setProperty("mail.smtp.auth", "true");//验证

        //邮箱帐号密码
        Authenticator authenticator = new Authenticator() {
            @Override
            public PasswordAuthentication getPasswordAuthentication() {
                //必须使用授权码,而不是密码,去qq邮箱申请
                return new PasswordAuthentication("873268974@qq.com","授权码");
            }
        };

        //1、与服务器建立连接:Session
        Session session = Session.getDefaultInstance(props, authenticator);

        //2、编写邮件:Message
        Message message = new MimeMessage(session);
        //2.1、发件人
        message.setFrom(new InternetAddress("873268974@qq.com"));
        //2.2、收件人 , to:收件人、cc :抄送、bcc:暗送(密送)。
        message.setRecipient(RecipientType.TO, new InternetAddress("kindleheart@qq.com"));
        //2.3、主题
        message.setSubject("测试");
        //2.4、正文
        String str = "哈哈,我发送了";
        message.setContent(str, "text/html;charset=UTF-8");

        //3、发送
        Transport.send(message);
    }

}

使用本地邮箱服务器和客户端发送邮件

在没有联网的情况下可以使用该方法在自己的电脑上发送和接收邮件,可以用于测试项目。

搭载本地环境

  1. 安装邮件服务器(易邮邮件服务器)

    双击安装包,进行配置

    • 设置域名

      img

    • 新建账户,新建aaa和bbb两个账户,用于发送和接收邮件

      img

  2. 安装foxmail邮箱

    双击安装包,进行配置

    • 我们刚刚在MailServer中创建了aaa,bbb两个账户,现在在foxmail邮箱中登入这两个账户

      img

    • 指定本地的邮件服务器

    img

使用JavaMail在本地发送接受邮件

package com.kindleheart.store.utils;

import java.util.Properties;

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.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;


public class MailTest {

    public static void main(String[] args) throws MessagingException {
        //服务器的设置
        Properties props = new Properties();
        props.setProperty("mail.host", "localhost");//设置服务器地址
        props.setProperty("mail.smtp.auth", "true");//权限验证

        //邮箱帐号密码
        Authenticator authenticator = new Authenticator() {
            @Override
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("aaa@store.com","123");
            }
        };

        //1、与服务器建立连接:Session
        Session session = Session.getDefaultInstance(props, authenticator);

        //2、编写邮件:Message
        Message message = new MimeMessage(session);
        //2.1、发件人
        message.setFrom(new InternetAddress("aaa@store.com"));
        //2.2、收件人 , to:收件人、cc :抄送、bcc:暗送(密送)。
        message.setRecipient(RecipientType.TO, new InternetAddress("bbb@store.com"));
        //2.3、主题
        message.setSubject("测试");
        //2.4、正文
        String str = "哈哈,我发送了";
        message.setContent(str, "text/html;charset=UTF-8");

        //3、发送
        Transport.send(message);
    }

}

在foxmail邮箱中查看是否发送成功

img

posted on 2018-10-13 13:20  kindleheart  阅读(333)  评论(0编辑  收藏  举报