java自动发送邮件实例

来源:互联网 发布:淘宝单一天能刷多少单 编辑:程序博客网 时间:2024/06/04 19:19

最近项目中有用到系统自动给用户发邮件的功能,今天抽时间总结一下:

一、概述

使用Java发送邮件就要使用到JavaMail API,JavaMail API提供了一个独立于平台并且与协议无关的框架来构建邮件和消息传递应用程序。JavaMail API可用作与Java SE平台一起使用的可选软件包, 并且还包括在 Java EE平台中。

JavaMail API 是读取、撰写、发送电子信息的可选包,用它可以建立一般的如Foxmail、outlook、Google等邮件用户代理程序,

也称MUA(Mail User Agent),电子邮件用户日常用MUA程序来读写邮件,而MUA依赖着MTA处理邮件的递送。


二、相关协议:
如果要让JavaMail API与服务器通信,就需要为之提供协议。如:SMTP、POP、IMAP、MIME和NNTP等,下面让我们一个一个来看:
1、SMTP
简单邮件传输协议(SMTP)是用于传送电子邮件的机制。在JavaMail API环境中,基于JavaMail的程序将与公司或者Internet服务提供商
(ISP)的SMTP服务器通信。该SMTP服务器将会把消息转发给用作接收消息的SMTP服务器,最后用户可通过POP或IMAP协议获取该消息。由于支
持身份验证,所以不需要SMTP服务器是一种开放的转发器,但需要确保SMTP服务器配置正确。JavaMail API中没有集成用于处理诸如配置服务器以
转发消息或添加/删除电子邮件帐户这一类任务的功能。
2、POP
POP(Post Office Protocol)的含义是邮局协议,当前的版本为3,也称作POP3,该协议是在RFC 1939中定义的。POP是Internet上的大多数
人用来接收邮件的机制。它为每个用户的每个邮箱定义支持,这是它所做的全部工作,也是大多数问题的根源。在使用POP协议时,人们熟悉的很多
功能,如查看收到了多少新邮件消息的功能,POP根本不支持。这些功能都内置到诸如Eudora或Microsoft Outlook之类的邮件程序中,能为您记住
接收的上一封邮件,以及计算有多少新邮件这类信息。因此,使用JavaMail API时,如果想获取这类信息,将需要由自己进行计算。
3、IMAP
IMAP是用于接收消息的更加高级的协议,它是在RFC 2060中定义的。IMAP的含义是"Internet消息访问协议",当前版本是第4版,也称作
IMAP4。使用IMAP时,邮件服务器必须支持该协议。不能只是简单地把程序转变为支持IMAP,而不是支持POP,就指望能支持IMAP中的
一切。假定邮件服务器支持IMAP,那么基于JavaMail的程序就可利用在服务器上拥有多个文件夹的用户,并且这些文件夹可以被多个用户共享的
功能。
由于IMAP协议具有更高级的功能,也许我们会想IMAP应该被每一个人使用,但事实不是这样。因为IMAP会加重邮件服务器的负荷,它需要服务
器接收新消息,发送消息给请求的用户,并在多个文件夹中为每个用户维护这些消息。而这要集中备份,因而长期下去用户的文件夹会变得越来越大,
当磁盘空间用光了时,每个人都会遭受损失。而使用POP协议时,已保存消息可以解除服务器的重负。
4、MIME
MIME的含义是"多用途的网际邮件扩充协议"。它不是一种邮件传输协议,相反,它定义传输的内容:消息的格式、附件等。许多文档都定义了
MIME协议,包含:RFC 822、RFC 2045、RFC 2046和RFC 2047。作为JavaMail API的用户,一般不需要担心这些格式。但是,这些格式确实存在,
并为程序所用。
5、NNP和其他协议
由于JavaMail API分开了提供程序和其他部分,所以用户可以轻松地为附加协议添加支持。Sun公司提供第3方提供程序清单,这些提供程序要
利用 Sun公司不支持的少见的协议。在这份清单中,您将会看到对NNTP(网络新闻传输协议)[新闻组]、S/MIME(安全多用途的网际邮件扩充协
议)及其他协议的提供支持的第3方提供程序。

三、实例

1、jar包准备

我所用到的jar包为:javax.mail-1.5.2.jar,网上资源很多,随便搜索下就能下载。


2、具体代码

(1)初始化加载配置信息

/** * @author : hang.shao* @description : 发送邮件测试 * @date : 2017年8月29日 下午4:30:05* @version : 1.0* @return :*/public class SendEmailTest {// 邮件发送协议      private final static String PROTOCOL = "smtp";      // SMTP邮件服务器      private final static String HOST = "mail.cnpc.com.cn";      // SMTP邮件服务器默认端口      private final static String PORT = "25";      // 是否要求身份认证      private final static String IS_AUTH = "true";      // 是否启用调试模式(启用调试模式可打印客户端与服务器交互过程时一问一答的响应消息)      private final static String IS_ENABLED_DEBUG_MOD = "true";         // 发件人      private static String from = "hang.shao@126.com.cn";      private static String fromUserPassword = "123456";        // 初始化连接邮件服务器的会话信息      private static Properties props = null;        //初始化加载配置信息    static {          props = new Properties();          props.setProperty("mail.transport.protocol", PROTOCOL);          props.setProperty("mail.smtp.host", HOST);          props.setProperty("mail.smtp.port", PORT);          props.setProperty("mail.smtp.auth", IS_AUTH);          props.setProperty("mail.debug",IS_ENABLED_DEBUG_MOD);      }    public static void main(String[] args) {    String emailAddress = "hang.shao@163.com";    String userName = "123456";    String password = "123456";    try{    SendEmailTest.sendTextEmail(emailAddress, 11111111);    //SendEmailTest.sendHtmlEmail(emailAddress, userName,password);    }catch(Exception e){    e.printStackTrace();    }}}

(2)向邮件服务器提交认证信息

static class MyAuthenticator extends Authenticator {  private String username = "hang.shao";  private String password = "123456";  public MyAuthenticator() {  super();  }  public MyAuthenticator(String username, String password) {  super();  this.username = username;  this.password = password;  }  @Override  protected PasswordAuthentication getPasswordAuthentication() {  return new PasswordAuthentication(username, password);  }  }


(3)发送简单的文本邮件

public static boolean sendTextEmail(String to,int code) throws Exception {  try {// 创建Session实例对象  Session session = Session.getDefaultInstance(props); InternetAddress fromAddress = new InternetAddress(from);InternetAddress toAddress = new InternetAddress(to);// 创建MimeMessage实例对象  MimeMessage message = new MimeMessage(session);  // 设置发件人  message.setFrom(fromAddress);  // 设置邮件主题  message.setSubject("测试邮件");// 设置收件人  message.setRecipient(RecipientType.TO, toAddress);  // 设置发送时间  message.setSentDate(new Date());  // 设置纯文本内容为邮件正文  message.setText("您好:/t/n 这是测试邮件"+code+",请查收/t/n"+ "如有问题请邮件联系。/t/n 此致           /t/n  敬礼");  // 保存并生成最终的邮件内容  message.saveChanges();  // 获得Transport实例对象  Transport transport = session.getTransport();  // 打开连接  transport.connect(from, fromUserPassword);// 将message对象传递给transport对象,将邮件发送出去  transport.sendMessage(message, message.getAllRecipients());  // 关闭连接  transport.close(); return true;} catch (Exception e) {e.printStackTrace();return false;}}


(4)发送简单的html邮件

public static boolean sendHtmlEmail(String to, String userName, String password) throws Exception {  System.out.println("-----------------"+to+"--"+userName+"--"+password);// 创建Session实例对象  Session session = Session.getInstance(props, new MyAuthenticator());  InternetAddress fromAddress = new InternetAddress(from);InternetAddress toAddress = new InternetAddress(to);// 创建MimeMessage实例对象  MimeMessage message = new MimeMessage(session);  // 设置邮件主题  message.setSubject("你好,这是测试邮件");  // 设置发送人  message.setFrom(fromAddress);  // 设置发送时间  message.setSentDate(new Date());  // 设置收件人  message.setRecipient(RecipientType.TO, toAddress);  // 设置html内容为邮件正文,指定MIME类型为text/html类型,并指定字符编码为gbk  message.setContent("<div style='width: 700px;margin: 0 auto'>"+ "<p style='text-align:left; '>您好!这是测试邮件:</p>"+ "<p style='text-indent: 2em'>此致</p>"+ "<p >敬礼!</p>"+ "</div>","text/html;charset=utf-8");     //设置自定义发件人昵称 String nick="shaohang"; try { nick=javax.mail.internet.MimeUtility.encodeText("shaohang"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }message.setFrom(new InternetAddress(nick+" <"+from+">"));// 保存并生成最终的邮件内容  message.saveChanges();  // 发送邮件  try {Transport.send(message);return true;} catch (Exception e) {e.printStackTrace();return false;}   }

直接运行main方法即可自动发送邮件。


原创粉丝点击