一、JavaMail概述:
JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类。但它并没有包含在JDK中,而是作为JavaEE的一部分。
厂商所提供的JavaMail服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括:
-
SMTP:简单邮件传输协议,用于发送电子邮件的传输协议;
-
POP3:用于接收电子邮件的标准协议;
-
IMAP:互联网消息协议,是POP3的替代协议。
这三种协议都有对应SSL加密传输的协议,分别是SMTPS,POP3S和IMAPS。
除JavaMail服务提供程序之外,JavaMail还需要JAF(JavaBeans Activation Framework)来处理不是纯文本的邮件内容,这包括MIME(多用途互联网邮件扩展)、URL页面和文件附件等内容。
mail.jar:此JAR文件包含JavaMail API和Sun提供的SMTP、IMAP和POP3服务提供程序;
activation.jar:此JAR文件包含JAF API和Sun的实现。
二、发送邮件的两种方式
1.用telnet指令
1.在控制台下用telnet指令发送。这里采用smtp协议,在此之前要注册sina邮箱,然后设置邮箱开启smtp、pop3协议
2.telnet smtp.sina.com 25 //端口号
或者
telnet pop3.sina.com 110
3、用base64加密的邮箱和登录密码字符串(126用授权码,qq用独立密码)与smtp服务器验证身份 注:此处可以用php中的base64_encode()函数来获取。
>auth login //开始验证身份
>cGhwamlhb31ZWRldkBhbGl5dW4uY29t //这是邮箱的base64编码字符串
>YWxpZW1haWwMjM= //这是邮箱的base64编码字符串
4、身份验证成功之后就可以写邮件了
>mail from:<test@aliyun.com> //发件人的邮箱地址
>rcpt to:<test@sina.com> //收件人的邮箱地址
5、输入DATA指令开始写邮件
(data可选项:
-
输入from:发件人名称,此项可以任意填入,将显示在收件箱的发件人一栏。
-
输入to:收件人名称,可任意填入,将显示在收件箱的收件人一栏。
-
输入subject:信件主题,显示在收件箱的主题一栏中。
-
写完subject需要空一行,即在一空行直接回车,表示正文部分的开始。
-
空行后输入信件的正文内容。
-
按下回车 . 回车,邮件就发出去了。
-
最后quit就可以退出。
)
//>DATA //开始撰写邮件
细化的写:
>from:aliyun
>to:sina
>subject:this is a demo //主题
> //空行不能少
>this is email content //正文
> //空行不能少
>. //点不能少
> //此处返回250表示邮件已经发送成功了
>quit
这里附上常出现的(521、550等参数),参考链接https://www.alibabacloud.com/help/zh/faq-detail/44499.htm
2.在eclispe上
针对不同的的邮件协议,JavaMail规定了服务提供者必须支持一系列属性,下表是针对SMTP协议的一些常见属性(属性值都以String类型进行设置,属性类型栏仅表示属性是如何被解析的):
属性名 | 属性类型 | 说明 |
mail.smtp.host | String | SMTP服务器地址,如smtp.sina.com.cn |
mail.smtp.port | int | SMTP服务器端口号,默认为25 |
mail.smtp.auth | boolean | SMTP服务器是否需要用户认证,默认为false |
mail.smtp.user | String | SMTP默认的登陆用户名 |
mail.smtp.from | String | 默认的邮件发送源地址 |
mail.smtp.socketFactory.class | String | socket工厂类类名,通过设置该属性可以覆盖提供者默认的实现,必须实现javax.net.SocketFactory接口 |
mail.smtp.socketFactory.port | int | 指定socket工厂类所用的端口号,如果没有规定,则使用默认的端口号 |
mail.smtp.socketFactory.fallback | boolean | 设置为true时,当使用指定的socket类创建socket失败后,将使用java.net.Socket创建socket,默认为true |
mail.smtp.timeout | int | I/O连接超时时间,单位为毫秒,默认为永不超时 |
2.1了解邮件发送原理,以及javamail.api
2.2发送一封只包含文本的简单邮件
package com.test.mail;
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;
/**
* @ClassName: Sendmail
* @Description: 发送Email
* @author: 55044
* @date: 2015-1-12 下午9:42:56
*
*/
public class mail {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.sina.com");
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");
//使用JavaMail发送邮件的5个步骤
//1、创建session
Session session = Session.getInstance(prop);
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2、通过session得到transport对象
Transport ts = session.getTransport();
//3、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。
ts.connect("smtp.sina.com", "star_sky@sina.com", "密码");
//4、创建邮件
Message message = createSimpleMail(session);
//5、发送邮件
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}
/**
* @Method: createSimpleMail
* @Description: 创建一封只包含文本的邮件
* @Anthor:55044
*
* @param session
* @return
* @throws Exception
*/
public static MimeMessage createSimpleMail(Session session)
throws Exception {
//创建邮件对象
MimeMessage message = new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("star_sky@sina.com"));
//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
message.setRecipient(Message.RecipientType.TO, new InternetAddress("star_sky@sina.com"));
//邮件的标题
message.setSubject("只包含文本的简单邮件");
//邮件的文本内容
message.setContent("你好啊!", "text/html;charset=UTF-8");
//返回创建好的邮件对象
return message;
}
}
2.3发送包含内嵌图片的邮件
//创建邮件
MimeMessage message = new MimeMessage(session);
// 设置邮件的基本信息
//发件人
message.setFrom(new InternetAddress("star_sky@sina.com"));
//收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("star_sky@sina.com"));
//邮件标题
message.setSubject("带图片的邮件");
// 准备邮件数据
// 准备邮件正文数据
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是一封邮件正文带图片<img src='taaarannn_1.png'>的邮件", "text/html;charset=UTF-8");
// 准备图片数据
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("src\\taaarannn_1.png"));
image.setDataHandler(dh);
image.setContentID("taaarannn_1.png");
// 描述数据关系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType("related");
message.setContent(mm);
message.saveChanges();
//将创建好的邮件写入到E盘以文件的形式进行保存
message.writeTo(new FileOutputStream("E:\\ImageMail.eml"));
//返回创建好的邮件
return message;