美文网首页
使用java发送邮件

使用java发送邮件

作者: 泪催伊人心 | 来源:发表于2017-06-02 16:47 被阅读0次

    一、简述发送和收取邮件的协议

    SMTP

    简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)由RFC 821定义。它定义了发送电子邮件的机制。在 JavaMail API 环境中,您基于 JavaMail 的程序将和您的公司或因特网服务供应商的(Internet Service Provider's,ISP's)SMTP 服务器通信。SMTP 服务器会中转消息给接收方 SMTP 服务器以便最终让用户经由 POP 或 IMAP 获得。这不是要求 SMTP 服务器成为开放的中继,尽管 SMTP 服务器支持身份验证,不过还是得确保它的配置正确。像配置服务器来中继消息或添加删除邮件账号这类任务的实现,JavaMail API 中并不支持。

    POP

    POP 代表邮局协议(Post Office Protocol)。目前用的是版本 3,也称 POP3,RFC 1939定义了这个协议。POP 是一种机制,因特网上大多数人用它得到邮件。它规定每个用户一个邮箱的支持。这就是它所能做的,而这也造成了许多混淆。使用 POP 时,用户熟悉的许多性能并不是由 POP 协议支持的,如查看有几封新邮件消息这一性能。这些性能内建于如 Eudora 或 Microsoft Outlook 之类的程序中,它们能记住一些事,诸如最近一次收到的邮件,还能计算出有多少是新的。所以当使用 JavaMail API 时,如果您想要这类信息,您就必须自己算。

    IMAP

    IMAP 是更高级的用于接收消息的协议。在RFC 2060中被定义,IMAP 代表因特网消息访问协议(Internet Message Access Protocol),目前用的是版本 4,也称 IMAP4。在用到 IMAP 时,邮件服务器必需支持这个协议。不能仅仅把使用 POP 的程序用于 IMAP,并指望它支持 IMAP 所有性能。假设邮件服务器支持 IMAP,基于 JavaMail 的程序可以利用这种情况 — 用户在服务器上有多个文件夹(folder),并且这些文件夹可以被多个用户共享。

    因为有这一更高级的性能,您也许会认为所有用户都会使用 IMAP。事实并不是这样。要求服务器接收新消息,在用户请求时发送到用户手中,还要在每个用户的多个文件夹中维护消息。这样虽然能将消息集中备份,但随着用户长期的邮件夹越来越大,到磁盘空间耗尽时,每个用户都会受到损失。使用 POP,就能卸载邮件服务器上保存的消息了。

    MIME

    MIME 代表多用途因特网邮件扩展标准(Multipurpose Internet Mail Extensions)。它不是邮件传输协议。但对传输内容的消息、附件及其它的内容定义了格式。这里有很多不同的有效文档:RFC 822RFC 2045RFC 2046RFC 2047。作为一个 JavaMail API 的用户,您通常不必对这些格式操心。无论如何,一定存在这些格式而且程序会用到它。

    二、实现发邮件的功能

    这里讲到的是使用 JavaMail 功能、操作,发送邮件。

    JavaMail 中用于发送邮件的类有 Session 类和 Transport 类,当然也少不了 Message 类。它们之间的进行工作的关系和步骤如下:

    各个类的关系与操作流程:

    1、创建一个 Properties 对象,该类在 java.util 包中,以键-值对的形式设置邮件发送中需要用到的传输协议,如 SMTP 协议等;一般的 smtp 服务器都需要用户身份认证,所以这也要设置为 true ,以便向 smtp 服务器提交用户名、密码等信息;

    2、先使用 Session 类中静态的 getInstance() 或getDefaultInstance() 获得自身对象,此时调用这两个方法应该传入上面创建的 Properties 对象;

    3、再用 Session 对象调用 getTransport() 方法获得 Transport 抽象类的具体实现子类对象,如 MimeTransport 类;

    4、将 Sesson 对象作为参数创建 MimeMessage 对象,即一封邮件,前面的文章已经有所讲述;

    5、使用 MimeTransport 对象调用相关方法将 MimeMessage 对象发送出去。

    由于前面的文章已经写了创建各类邮件的代码,所以在这里就直接拿来用而不再编写了,创建邮件的代码放在本文的最后面。我们使用到了上篇文章中的 WithAttachmentMessage 类作为一封邮件,稍稍修改一下 from 和 to 就可以从不同的邮箱发送给不同的邮箱了。

    以下为邮件发送的工具类

    (以163网易邮箱为例,当然qq邮箱、新浪等也是可以的)

    package com.qianfeng.common.email;

    import java.util.Properties;

    import javax.mail.Message;

    import javax.mail.Session;

    import javax.mail.Transport;

    import javax.mail.internet.InternetAddress;

    import javax.mail.internet.MimeMessage;

    public class SendEmail {

    public static void sendEmailToUser(String sendAddress,String title,String content) throws Exception{

    Properties properties = new Properties();

    //设置服务器地址

    properties.setProperty("mail.host", "smtp.163.com");

    //设置邮件传输协议

    properties.setProperty("mail.transport.protocol", "smtp");

    //设置是否需要认证服务器的用户名和密码

    properties.setProperty("mail.smtp.auth", "true");

    //创建一个Session对象

    Session session = Session.getInstance(properties);

    //得到发送邮件的对象 transport

    Transport transport = session.getTransport();

    //连接服务器

    //参数1和参数2 是需要个人去163网易邮箱中去获取的授权码

    transport.connect("smtp.163.com", " 参数1", "参数2 ");

    //创建message对象

    Message message = createSimpleEmail(session,sendAddress,title,content);

    //发送邮件

    transport.sendMessage(message, message.getAllRecipients());

    transport.close();

    }

    private static Message createSimpleEmail(Session session, String sendAddress, String title, String content) throws Exception {

    MimeMessage message = new MimeMessage(session);

    //设置发件人

    message.setFrom(new InternetAddress("xxx@163.com")); //参数为个人的邮箱名字

    //设置邮件的接收人

    message.setRecipient(Message.RecipientType.TO, new InternetAddress(sendAddress));

    //设置邮件标题

    message.setSubject(title);

    //设置邮件内容

    message.setContent(content, "text/html;charset=utf-8");

    return message;

    }

    }

    相关文章

      网友评论

          本文标题:使用java发送邮件

          本文链接:https://www.haomeiwen.com/subject/zwyufxtx.html