java中使用javamail发送邮件

时间:2023-03-08 21:41:39

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 服务器地址,:
    java中使用javamail发送邮件
四. 创建并发送电子邮件

  邮件创建步骤:

    创建一个邮件对象(MimeMessage);
    设置发件人,收件人,可选增加多个收件人,抄送人,密送人;
    设置邮件的主题(标题);
    设置邮件的正文(内容,附件);
    设置显示的发送时间;
    保存到本地。

 import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties; import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart; import org.apache.commons.lang.StringUtils; public class SendEmailUtil {
/**
* 发送邮件的方法
*
* @param serverAddress
* 服务器地址
* @param user
* 服务器用户名
* @param pwd
* 服务器密码
* @param from
* 发送人
* @param subject
* 标题
* @param emailReceiver
* 接收人
* @param htmlContents
* 发送内容
* @param ucode
* 编码格式
* @param fileName
* 附件名称
* @throws java.lang.Exception
*/
public boolean sendEmail(String serverAddress, String user, String pwd,
String from, String subject, List emailReceiver,
String htmlContents, String ucode, String fileName) {
boolean flag = false;
htmlContents = htmlContents+ "       (此邮件为自动发送,请勿回复)";
try {
// 创建Properties对象
Properties props = System.getProperties();
// 创建信件服务器
props.put("mail.smtp.auth", "true");
// 得到默认的对话对象
Session session = Session.getDefaultInstance(props, null);
// 创建一个消息,并初始化该消息的各项元素
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
// 编码方式
if (ucode.indexOf("GBK") != -1) {
String tempFrom = new String(from.getBytes("GBK"), "UTF-8");
message.setFrom(new InternetAddress(tempFrom));
}
// 准备收件人地址
InternetAddress[] address = new InternetAddress[emailReceiver.size()];
for (int i = 0; i < address.length; i++) {
address[i] = new InternetAddress((String) emailReceiver.get(i));
}
System.out.println(address[0]);
message.setRecipients(Message.RecipientType.TO, address);
/*// Cc: 抄送(可选)
message.setRecipient(MimeMessage.RecipientType.CC,
new InternetAddress("ee@receive.com", "USER_EE", "UTF-8"));
// Bcc: 密送(可选)
message.setRecipient(MimeMessage.RecipientType.BCC,
new InternetAddress("ff@receive.com", "USER_FF", "UTF-8"));*/ // 邮件主题
message.setSubject(subject);
System.out.println(message.getSubject());
// 设置内容
BodyPart bp = new MimeBodyPart();
bp.setContent(htmlContents, ucode);
// 后面的BodyPart将加入到此处创建的Multipart中
Multipart mp = new MimeMultipart();
mp.addBodyPart(bp);
// 保存附件
addFileAffix(mp, fileName);
// Multipart加入到信件
message.setContent(mp);
System.out.println(message.getContent());
// 设置信件头的发送日期
message.setSentDate(new Date());
System.out.println(message.getSentDate());
//保存对message设置
message.saveChanges(); //保存邮件到本地
OutputStream out = new FileOutputStream("MyEmail.eml");
message.writeTo(out);
out.flush();
out.close();
// 发送信件
Transport trans = session.getTransport("smtp");
trans.connect(serverAddress, user, pwd);
trans.sendMessage(message, message.getAllRecipients());
trans.close();
flag = true;
} catch (Exception e) {
System.out.println("error:邮件服务器连接错误!");
e.printStackTrace();
} finally {
// 删除临时文件
if (StringUtils.isNotBlank(fileName)){}
deleteFile(fileName);
}
return flag;
} /**
* 发送附件
*
* @param mp
* 邮件信息
* @param fileName
* 附件全路径(包括文件名称)
* @return
*/
public boolean addFileAffix(Multipart mp, String fileName) {
try {
String newName = "";
newName = fileName.substring(fileName.lastIndexOf(File.separator) + 1,
fileName.length());
if (StringUtils.isEmpty(fileName))
return false;
BodyPart bp = new MimeBodyPart(); FileDataSource fileds = new FileDataSource(fileName); bp.setDataHandler(new DataHandler(fileds));
// bp.setFileName("=?GBK?B?"+ enc.encode(fileName.getBytes()) + "?=");
bp.setFileName(newName);
mp.addBodyPart(bp); return true; } catch (Exception e) { return false; }
} /**
* 删除文件
*
* @param fileName
*/
public void deleteFile(String fileName) {
if (StringUtils.isEmpty(fileName))
return;
File file = new File(fileName);
if (file.isFile()) {
file.delete();
}
} public static void main(String[] args) {
SendEmailUtil sendEmail = new SendEmailUtil();
List receiverList = new ArrayList<String>();
receiverList.add("yyy@qq.com");
receiverList.add("zzz@qq.com");
sendEmail.sendEmail("smtp.163.com", "xxx@163.com", "xxx", "xxx@163.com", "测试邮件",
receiverList, "这是一封测试邮件", "GBK", "C:/222.rar");
}
}