JAVA发送邮件

本文介绍了如何使用JAVA MAIL API发送邮件,详细讲解了Session、Message、Address等核心类的用法,并提供QQ邮箱发送邮件的示例源码,包括创建邮件、设置收件人、发送邮件的步骤。此外,还提供了资源下载链接。

JAVA MAIL邮件发送简介及用途

JAVA MAIL是利用现有的邮箱账户向指定邮箱发送邮件信息,项目实际用途还是比较多的,如用户账户密码找回验证,登录验证,邮箱注册等.....本文以QQ邮箱为例向大家展示如何通过javax.mail.jar来实现邮件推送。

JAVA MAIL资源下载

大家可以从SUN官网下载javax.mail.jar,也可以从我的个人资源处下载该固件:

http://download.csdn.net/download/brianang/10044961

本文档源码Demo同步下载:

http://download.csdn.net/download/brianang/10044974

JAVA MAIL API主要内容

在JavaMail中存放的核心类:

Session,Message,Address,Authenticator,Transposrt,Store,Folder;在javax\mail\internet文件夹下存放着常用的子类。

Session

Session类定义邮件的基本会话,获取方式可以通过Session提供的getDefaultInstance()或getInstance()静态工厂方法获取Session会话对象

EXP:

Properties properties = new Properties();
Session session = Session.getDefaultInstance();
或
Session session = Session.getInstance();

我们可以通过Session的setDebug()来设置是否启用调试监控模式

EXP:

session.setDebug(true);

Message

创建Session后即可创建邮件信息体,SUN公司提供了Message这个类来帮助开发者完成信息体构建,但由于Message是一个抽象类,在具体使用时我们通过internet下的MimeMesage来具体实现信息体的构建。

EXP:

MimeMessage mimeMessage = new MimeMessage(session);
创建好MimeMessage后便开始设置邮件信息体的具体参数:

setFrom():设置发件人信息,需传入Address信息体,也可以通过setReplyTo()设置发件人信息

EXP:

mimeMessage.setFrom(new InternetAddress(sendAccount,sendUserName,"utf-8"));
mimeMessage.setReplyTo(new InternetAddress(sendAccount,sendUserName,"utf-8"));

setRecipient():设置收件人信息

EXP:

mimeMessage.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveAccount,receiveUserName,"utf-8"));

addRecipient():添加收件人信息

EXP:

mimeMessage.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveAccount,receiveUserName,"utf-8"));

setSubject():设置邮件主题

EXP:

mimeMessage.setSubject("测试邮件","utf-8"));

setContent():设置邮件内容,也可以通过setText()方法设置邮件内容

EXP:

mimeMessage.setContent("<p>这是一条测试邮件!</p>","text/html")
或
mimeMessage.setText("这是一条测试邮件!");

可以看出这两个方法是有区别的,setText只能设置简单的文本信息,而setContext还可以设置超文本标签语言,所以在实际的使用中根据自己的实际情况来选择使用什么方法。
setSentDate():设置发件时间

EXP:

mimeMessage.setSentDate(emailSendDate);

添加带有附件的邮件

EXP:

Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject("Hello JavaMail Attachment");

BodyPart messageBodyPart = new MimeBodyPart();

messageBodyPart.setText("Pardon Ideas");

Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);

messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);

message.setContent(multipart);

Transport.send(message);

Address

Address即邮件地址类,和Message一样Address也是一个抽象类,所以要通过InternetAddress子类来构建邮件地址对象,构建邮件地址对象时可以传入用户名,也可以不传

EXP:

Address address = new InternetAddress("123321@QQ.com");
或
Address address = new InternetAddress("123321@qq.com","wangjunwei");
收件人配置
  1. 邮件地址创建后通过上文可以看到我们可以通过Message的setFrom或setReplyTo来设置发件人信息,如果存在多个发件人通过addFrom方法来实现。
  2. 可以通过Message的setRecipient方法来设置收件人信息,在设置收件人信息是我们通过Message.RecipientType来区分收件人:
  • Message.RecipientType.TO:发送
  • Message.RecipientType.CC:抄送
  • Message.RecipientType.BCC:密送

Authenticator

Java Mail API通过Authenticator授权者类来访问收保护的资源(邮件服务器),在使用Authenticator抽象类是我们需要通过集成Authenticator抽象类的方式并且子类必须具有返回 PasswordAuthentication对象(用户存储认证授权时使用的用户名、密码)getPasswordAuthentication()方法,在构建Session时将授权信息传入:
EXP:
Properties properties = new Properties();
Authenticator authenticator = new MyAuthenticator();
Session session = Session.getDefaultInstance(properties,authenticator);

Transport

我们通过Transport类来进行邮件的发送,Transport实现了邮件信息发送的协议(通常为SMTP),该类是一个抽象类,我们可以通过该类的静态方法send()进行邮件发送。
EXP:
Transport.send();
我们也可以通过Session类活动相应协议的Transport实例,并公国传递用户名、密码、邮件服务器等参数的方式与邮件服务器取得连接,通过sendMessage()方法进行邮件发送(推荐使用这种方法,因为在同一个邮件服务器发送多封邮件时这种方式更为高效)。
EXP:
mimeMessage.saveChanges();
Transport transport = session.getTransport("smtp");
transport.connect(host, username, password);
transport.sendMessage(message, message.getAllRecipients());
transport.close();

JAVA MAIL邮件发送源码展示

以下提供我个人的源码:

创建邮件

/**
 * 创建邮件
 * @param session 邮件会话
 * @param sendAccount 发送账号
 * @param sendUserName 发送用户名
 * @param receiveAccount 接收账号
 * @param receiveUserName 接收用户名
 * @param emailTitel 邮件标题
 * @param emailContent 邮件内容
 * @param emailSendDate 邮件发送时间
 * @return 邮件对象
 * @throws Exception
 */
public static MimeMessage createMimeMessage(Session session,String sendAccount,String sendUserName,String receiveAccount,
String receiveUserName,String emailTitel,String emailContent,Date emailSendDate) throws Exception{
	MimeMessage mimeMessage = new MimeMessage(session);
	mimeMessage.setFrom(new InternetAddress(sendAccount,sendUserName,"utf-8"));
//		收件人
	mimeMessage.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveAccount,receiveUserName,"utf-8"));
//		添加收件人
	mimeMessage.addRecipient(MimeMessage.RecipientType.TO,new InternetAddress(receiveAccount,receiveUserName,"utf-8"));
//		设置抄送
	mimeMessage.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress(receiveAccount,receiveUserName,"utf-8"));
//		设置密送
	mimeMessage.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress(receiveAccount,receiveUserName,"utf-8"));
	
//		设置标题
	mimeMessage.setSubject(emailTitel,"utf-8");
//		设置邮件正文
	mimeMessage.setContent(emailContent,"text/html;charset=UTF-8");
//		设置发件时间
	mimeMessage.setSentDate(emailSendDate);
	
//		保存邮件设置
	mimeMessage.saveChanges();
	return mimeMessage;
}

发送邮件

private static String EmailSendAccount = "misslove3290@qq.com";
private static String EmailSendAccountPWD = "eonpaepqktxubfbi";
private static String EmailSendSMTPHOST = "smtp.qq.com";

public static void SendEmail(String sendAccount,String sendUserName,String receiveAccount,
String receiveUserName,String emailTitel,String emailContent,Date emailSendDate) throws Exception{
	Properties properties = new Properties();
	properties.setProperty("mail.transport.protocol", "smtp");//设置邮件协议
	properties.setProperty("mail.smtp.host", EmailSendSMTPHOST);//设置邮件授权参数
	properties.setProperty("mail.smtp.auth", "true");//设置认证方式
	
	// PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
	//     如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
	//     打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。
	
	// SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
	//                  需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
	//                  QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
	/*
	final String smtpPort = "465";
	properties.setProperty("mail.smtp.port", smtpPort);
	properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
	properties.setProperty("mail.smtp.socketFactory.fallback", "false");
	properties.setProperty("mail.smtp.socketFactory.port", smtpPort);
	*/
	
	
//		根据配置创建会话对象, 用于和邮件服务器交互
	Session session = Session.getDefaultInstance(properties);
//      设置为debug模式, 可以查看详细的发送 log
	session.setDebug(true);

//      创建一封邮件
	MimeMessage mimeMessage = createMimeMessage(session, sendAccount, sendUserName, receiveAccount,
receiveUserName, emailTitel, emailContent, emailSendDate);
//      创建邮件传输对象
	Transport transport = session.getTransport();
	transport.connect(EmailSendAccount, EmailSendAccountPWD);
	transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
	transport.close();
}

测试

public static void main(String[] args) throws Exception {
	Email.SendEmail("misslove3290@qq.com","王俊伟","524579270@qq.com", "wangjunwei", "测试邮件", "测试邮件正文。。。", new Date());
}

注意:

如果你的邮箱没有开启SMTP协议,一定要先在邮箱设置中开启,EmailSendAccountPWD可以为你的邮箱账户密码,如果邮箱与有独立密码保护请使用独立密码,如果还是获取授权请使用你开启SMTP协议时的授权码。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值