使用Java发送Email(javax.mail)

前言

电子邮件的应用非常广泛,常见的如在某网站注册了一个账户,自动发送一封激活邮件,通过邮件找回密码,自动批量发送活动信息等。本文将简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件。

电子邮件协议

  1. SMTP协议
    SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP服务器就是遵循SMTP协议的发送邮件服务器。SMTP认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。
    SMTP已是事实上的E-Mail传输的标准。

  2. POP协议
    POP邮局协议负责从邮件服务器中检索电子邮件。它要求邮件服务器完成下面几种任务之一:从邮件服务器中检索邮件并从服务器中删除这个邮件;从邮件服务器中检索邮件但不删除它;不检索邮件,只是询问是否有新邮件到达。
    POP协议支持多用户互联网邮件扩展,后者允许用户在电子邮件上附带二进制文件,如文字处理文件和电子表格文件等,实际上这样就可以传输任何格式的文件了,包括图片和声音文件等。在用户阅读邮件时,POP命令所有的邮件信息立即下载到用户的计算机上,不在服务器上保留。
    POP3(Post Office Protocol 3)即邮局协议的第3个版本,是因特网电子邮件的第一个离线协议标准。
    3. IMAP协议
    互联网信息访问协议(IMAP)是一种优于POP的新协议。和POP一样,IMAP也能下载邮件、从服务器中删除邮件或询问是否有新邮件,但IMAP克服了POP的一些缺点。例如,它可以决定客户机请求邮件服务器提交所收到邮件的方式,请求邮件服务器只下载所选中的邮件而不是全部邮件。客户机可先阅读邮件信息的标题和发送者的名字再决定是否下载这个邮件。通过用户的客户机电子邮件程序,IMAP可让用户在服务器上创建并管理邮件文件夹或邮箱、删除邮件、查询某封信的一部分或全部内容,完成所有这些工作时都不需要把邮件从服务器下载到用户的个人计算机上。
    支持种IMAP的常用邮件客户端有:ThunderMail,Foxmail,Microsoft Outlook等。

传输方式

Internet上传送电子邮件是通过一套称为邮件服务器的程序进行硬件管理并储存的。与个人计算机不同,这些邮件服务器及其程序必须每天24小时不停地运行,否则就不能收发邮件了,简单邮件传输协议SMTP(Simple Mail Transfer Protocol)和邮局协议POP(Post Office Protocol)是负责用客户机/服务器模式发送和检索电子邮件的协议。
用户计算机上运行的电子邮件客户机程序请求邮件服务器进行邮件传输,邮件服务器采用简单邮件传输协议标准。很多邮件传输工具,如outlook express、fox mail等,都遵守SMTP标准并用这个协议向邮件服务器发送邮件。SMTP协议规定了邮件信息的具体格式和邮件的管理方式。

安装所需要的库

The JavaMail API provides a platform-independent and protocol-independent framework to build mail and messaging applications. The JavaMail API is available as an optional package for use with the Java SE platform and is also included in the Java EE platform.

导入

https://javaee.github.io/javamail/
在这个地址中下载JavaMail包。然后导入。

Maven

或者使用Maven进行导入。

<dependencies>
	<dependency>
		<groupId>com.sun.mail</groupId>
		<artifactId>javax.mail</artifactId>
		<version>1.6.2</version>
	</dependency>
</dependencies>

发送函数

    /**
     * send email from user to recipient.
     *
     * @param user user email
     * @param password user password
     * @param recipient recipient
     * @param title title
     * @param sendMessage will to send message
     * @throws MessagingException 
     */
    private static void sendEmail(String user, String password, String recipient, String title, String sendMessage)
            throws MessagingException {
        Properties p = new Properties();

        p.setProperty("mail.smtp.host", "smtp.qq.com");//发送邮箱服务器
        p.setProperty("mail.smtp.port", "465");//发送端口
        p.setProperty("mail.smtp.auth", "true");//是否开启权限控制
        p.setProperty("mail.transport", "smtp");
        p.setProperty("mail.smtp.ssl.enable", "true");

        Session session = Session.getInstance(p, new Authenticator() {
            @Override
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(user, password);
            }
        });

        Message message = new MimeMessage(session);

        message.setFrom(new InternetAddress(user));
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipient));

        message.setSubject(title);
        message.setContent(sendMessage, "text/html;charset=UTF-8");

        Transport transport = session.getTransport();
        transport.connect(user, password);
        Transport.send(message);
        System.out.println("sent");
    }

password需要使用的是授权码,而不是邮箱密码。

mail.class

public class email {
    public static void main(String[] args) {
        final String user = "392515619@qq.com";
        final String password = "gbtzemoqeeqobjda";
        final String recipient = "18500364991@126.com";

        Scanner scanner = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();
        String s = "";

        System.out.println("请输入要发送的信息");
        while (!(s = scanner.nextLine()).equals("end")) {
            sb.append(s);
            sb.append("<br>");
        }

        try {
            sendEmail(user, password, recipient, "test", sb.toString());
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

配置正确后,就可以进行发送邮件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值