1. 电子邮件协议
电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。
其中邮件的创建和发送只需要用到 SMTP协议,所有本文也只会涉及到SMTP协议。SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。
2. JavaMail
Java 官方也提供了对电子邮件协议封装的 Java 类库,就是JavaMail,但并没有包含到标准的 JDK 中,可以去 Java 或 Oracle 官网下载。
下载地址:
https://java.net/projects/javamail/pages/Home 或者 http://www.oracle.com/technetwork/java/javamail/index.html
我自己使用的jar包下载地址
三、发送邮件的前提
发送邮件首先需要有一个邮箱账号和密码(如果设置了客户端授权密码,此处的密码为客户端授权密码),并且邮箱账号必须要开启 SMTP 服务。
以163邮箱为例,在浏览器网页登录邮箱后一般在邮箱的“设置”选项中可以开启,并记下邮箱的 SMTP 服务器地址,:
四. 创建并发送电子邮件
邮件创建步骤:
创建一个邮件对象(MimeMessage);
设置发件人,收件人,可选增加多个收件人,抄送人,密送人;
设置邮件的主题(标题);
设置邮件的正文(内容,附件);
设置显示的发送时间;
保存到本地。
1 import java.io.File; 2 import java.io.FileOutputStream; 3 import java.io.OutputStream; 4 import java.util.ArrayList; 5 import java.util.Date; 6 import java.util.List; 7 import java.util.Properties; 8 9 import javax.activation.DataHandler; 10 import javax.activation.FileDataSource; 11 import javax.mail.BodyPart; 12 import javax.mail.Message; 13 import javax.mail.Multipart; 14 import javax.mail.Session; 15 import javax.mail.Transport; 16 import javax.mail.internet.InternetAddress; 17 import javax.mail.internet.MimeBodyPart; 18 import javax.mail.internet.MimeMessage; 19 import javax.mail.internet.MimeMultipart; 20 21 import org.apache.commons.lang.StringUtils; 22 23 public class SendEmailUtil { 24 /** 25 * 发送邮件的方法 26 * 27 * @param serverAddress 28 * 服务器地址 29 * @param user 30 * 服务器用户名 31 * @param pwd 32 * 服务器密码 33 * @param from 34 * 发送人 35 * @param subject 36 * 标题 37 * @param emailReceiver 38 * 接收人 39 * @param htmlContents 40 * 发送内容 41 * @param ucode 42 * 编码格式 43 * @param fileName 44 * 附件名称 45 * @throws java.lang.Exception 46 */ 47 public boolean sendEmail(String serverAddress, String user, String pwd, 48 String from, String subject, List emailReceiver, 49 String htmlContents, String ucode, String fileName) { 50 boolean flag = false; 51 htmlContents = htmlContents+ " (此邮件为自动发送,请勿回复)"; 52 try { 53 // 创建Properties对象 54 Properties props = System.getProperties(); 55 // 创建信件服务器 56 props.put("mail.smtp.auth", "true"); 57 // 得到默认的对话对象 58 Session session = Session.getDefaultInstance(props, null); 59 // 创建一个消息,并初始化该消息的各项元素 60 Message message = new MimeMessage(session); 61 message.setFrom(new InternetAddress(from)); 62 // 编码方式 63 if (ucode.indexOf("GBK") != -1) { 64 String tempFrom = new String(from.getBytes("GBK"), "UTF-8"); 65 message.setFrom(new InternetAddress(tempFrom)); 66 } 67 // 准备收件人地址 68 InternetAddress[] address = new InternetAddress[emailReceiver.size()]; 69 for (int i = 0; i < address.length; i++) { 70 address[i] = new InternetAddress((String) emailReceiver.get(i)); 71 } 72 System.out.println(address[0]); 73 message.setRecipients(Message.RecipientType.TO, address); 74 /*// Cc: 抄送(可选) 75 message.setRecipient(MimeMessage.RecipientType.CC, 76 new InternetAddress("ee@receive.com", "USER_EE", "UTF-8")); 77 // Bcc: 密送(可选) 78 message.setRecipient(MimeMessage.RecipientType.BCC, 79 new InternetAddress("ff@receive.com", "USER_FF", "UTF-8"));*/ 80 81 // 邮件主题 82 message.setSubject(subject); 83 System.out.println(message.getSubject()); 84 // 设置内容 85 BodyPart bp = new MimeBodyPart(); 86 bp.setContent(htmlContents, ucode); 87 // 后面的BodyPart将加入到此处创建的Multipart中 88 Multipart mp = new MimeMultipart(); 89 mp.addBodyPart(bp); 90 // 保存附件 91 addFileAffix(mp, fileName); 92 // Multipart加入到信件 93 message.setContent(mp); 94 System.out.println(message.getContent()); 95 // 设置信件头的发送日期 96 message.setSentDate(new Date()); 97 System.out.println(message.getSentDate()); 98 //保存对message设置 99 message.saveChanges(); 100 101 //保存邮件到本地 102 OutputStream out = new FileOutputStream("MyEmail.eml"); 103 message.writeTo(out); 104 out.flush(); 105 out.close(); 106 // 发送信件 107 Transport trans = session.getTransport("smtp"); 108 trans.connect(serverAddress, user, pwd); 109 trans.sendMessage(message, message.getAllRecipients()); 110 trans.close(); 111 flag = true; 112 } catch (Exception e) { 113 System.out.println("error:邮件服务器连接错误!"); 114 e.printStackTrace(); 115 } finally { 116 // 删除临时文件 117 if (StringUtils.isNotBlank(fileName)){} 118 deleteFile(fileName); 119 } 120 return flag; 121 } 122 123 /** 124 * 发送附件 125 * 126 * @param mp 127 * 邮件信息 128 * @param fileName 129 * 附件全路径(包括文件名称) 130 * @return 131 */ 132 public boolean addFileAffix(Multipart mp, String fileName) { 133 try { 134 String newName = ""; 135 newName = fileName.substring(fileName.lastIndexOf(File.separator) + 1, 136 fileName.length()); 137 if (StringUtils.isEmpty(fileName)) 138 return false; 139 BodyPart bp = new MimeBodyPart(); 140 141 FileDataSource fileds = new FileDataSource(fileName); 142 143 bp.setDataHandler(new DataHandler(fileds)); 144 // bp.setFileName("=?GBK?B?"+ enc.encode(fileName.getBytes()) + "?="); 145 bp.setFileName(newName); 146 mp.addBodyPart(bp); 147 148 return true; 149 150 } catch (Exception e) { 151 152 return false; 153 154 } 155 } 156 157 /** 158 * 删除文件 159 * 160 * @param fileName 161 */ 162 public void deleteFile(String fileName) { 163 if (StringUtils.isEmpty(fileName)) 164 return; 165 File file = new File(fileName); 166 if (file.isFile()) { 167 file.delete(); 168 } 169 } 170 171 public static void main(String[] args) { 172 SendEmailUtil sendEmail = new SendEmailUtil(); 173 List receiverList = new ArrayList<String>(); 174 receiverList.add("yyy@qq.com"); 175 receiverList.add("zzz@qq.com"); 176 sendEmail.sendEmail("smtp.163.com", "xxx@163.com", "xxx", "xxx@163.com", "测试邮件", 177 receiverList, "这是一封测试邮件", "GBK", "C:/222.rar"); 178 } 179 }