您的位置:首页 > 其它

邮件开发

2015-09-25 18:56 323 查看
JavaMail开发:JavaEE技术之一

一、邮件开发用到的协议:SMTP、POP、RFC822、MIME

SMTP: Simple Message Transfer Protocal 简单消息传输协议。

发送邮件时使用的协议。描述了数据该如何表示。默认使用的端口:25

通常将处理用户SMTP请求的邮件服务器成为SMTP服务器

POP : ost Office Protocal邮局协议。

接收邮件时使用的协议。默认使用的端口:110

通常将处理用户POP请求的邮件服务器成为POP3服务器

二、 邮件的发送过程及用到的协议



三、 手工发送邮件和接收邮件(熟练SMTP等协议的)

0、 准备:

QQ邮箱服务器地址:SMTP:smtp.qq.com ; POP3:pop.qq.com

将用户名和密码进行Base64编码

1、DOS命令行手工发送邮件的过程:telnet (了解)

telnet smtp.qq.com 25

------------------------------------------------------------以下属于SMTP协议的内容

ehlo wzt //向服务器打招呼(主机名称)

auth login //请求认证

// 提示输入用户名和密码(Base64编码后的)

aXRoZWltYWNsb3Vk

aWFtc29ycnk=

mail from:<963353706@qq.com>

rcpt to:<963353706@qq.com>

data //说明邮件的开始

//邮件内容是要遵循一定格式的:RFC822规范

from:itheimacloud@163.com //邮件头 此处可以冒充别人发送邮件(fengjie@163.com)

to:itheima14@163.com

subject:这是一封手工发送的邮件 //主题

// 头体用空行分隔

aaaaaaaaaaaaaaaaaa //邮件体

bbbbbbbbbbbbbbbbbb

. // .用于结束邮件内容

------------------------------------------------------------

quit

2、手工收取邮件(POP协议)

telnet pop.qq.com 110

----------------------------------以下属于POP协议的东东

user 963353706

pass iamsorry

stat //返回邮箱的统计信息

list 邮件编号 //返回某一封的邮件统计信息

retr 邮件编号 //取出某一封邮件的内容

----------------------------------

quit

四、 JavaMail的核心API简介

准备: 导入jar包:mail.jar (注意:Javamail的API依赖jaf(Java Activation Framework)框架,

还需要导入jaf的jar包activation.jar。如果使用的是JDK6及以上版本,就不需要了)

Session: 代表邮件的环境

Message: 代表邮件内容部分

BodyPart: 代表复杂邮件中的每一部分

Multipart:描述由多个BodyPart组成的邮件的关系

五、 复杂邮件的组成原理图



六、 创建邮件:(卫星)

例:

① 只有文本的邮件

-------------------------------------------------------------------------------------------------

// JavaMail创建邮件过程,并将其保存到磁盘上

public class MailDemo1 {

public static void main(String[] args) throws Exception {

// 创建一封邮件

Properties props = new Properties(); // 环境变量设置,发送邮件时才需要

Session session = Session.getDefaultInstance(props);

MimeMessage message = new MimeMessage(session); // 代表一封邮件

// 设置发件人

message.setFrom(new InternetAddress("963306@qq.com"));

// 设置收件人

message.setRecipients(Message.RecipientType.TO, "963306@qq.com");

// 设置主题

message.setSubject("这是javamail发出的第一封邮件");

// 设置邮件的正文内容

message.setText("嘿嘿,javaMail发送的邮件1哦");

// 把邮件存储到磁盘上 注: 邮件的扩展名为.eml

message.writeTo(new FileOutputStream("c:/1.eml"));

}

}

-------------------------------------------------------------------------------------------------

② 既有文本,文本中还内嵌图片的邮件(MIME协议描述的) related

分割线:------------------------------238748932bc07

------------------------------238748932bc07

//文本部分

//头 Content-Type:text/html;

//体aaa<img src='cid:mm'/>aaa

------------------------------238748932bc07

//图片部分

Content-Type:image/jpeg

Content-Id:mm

jsdlkfjlkdslkjfds(base64编码)

dsfds

f

dsf

dsfds

f

dsfds

------------------------------238748932bc07--

-------------------------------------------------------------------------------------------------

// 创建文本中内嵌图片的邮件

public class MailDemo2 {

public static void main(String[] args) throws Exception {

Properties props = new Properties();

Session session = Session.getDefaultInstance(props);

MimeMessage message = new MimeMessage(session);

message.setFrom(new InternetAddress("963306@qq.com"));

message.setRecipients(Message.RecipientType.TO, "963706@qq.com");

message.setSubject("这是一封文本中内嵌图片的邮件");

// 文本部分 注: 该文本内嵌id为mm的图片

MimeBodyPart textPart = new MimeBodyPart();

textPart.setContent("aaa<img src='cid:mm'/>aaa","text/html");

// 图片部分

MimeBodyPart imagePart = new MimeBodyPart();

// 借助JAF框架将磁盘上的文件读取过到邮件中

DataHandler dh = new DataHandler(new FileDataSource("c:/1.jpg"));

// 注: 通过jaf读取到的文件,不需要设置其MIME类型,JAF框架会自动探测到 且之后与原图片无关

imagePart.setDataHandler(dh);

imagePart.setContentID("mm");

// 将文本部分和图片部分整合到一个mmpart中,顺便说明俩者的关系

MimeMultipart mmpart = new MimeMultipart();

mmpart.addBodyPart(textPart);

mmpart.addBodyPart(imagePart);

mmpart.setSubType("related"); // 说明俩者有关系

// 将mmpart添加到邮件中,并保存改变

message.setContent(mmpart);

message.saveChanges();

message.writeTo(new FileOutputStream("c:/2.eml"));

}

}

-------------------------------------------------------------------------------------------------

③ 既有文本,文本中还内嵌图片的邮件,还有附件的邮件

注意: 主题、内容、附件名称的中文编码问题

主题和内容修改charset即可

附件名称采用解决编码的类MimeUtility.encodeText(filename)修改

-------------------------------------------------------------------------------------------------

// 创建一封包含文本、图片、附件的复杂邮件(参考 复杂邮件的组成原理图)

public class MailDemo3 {

public static void main(String[] args) throws Exception {

Properties props = new Properties();

Session session = Session.getDefaultInstance(props);

MimeMessage message = new MimeMessage(session);

message.setFrom(new InternetAddress("96306@qq.com"));

message.setRecipients(Message.RecipientType.TO,"963706@qq.com");

message.setSubject("这是一封包含文本、图片、附件的复杂邮件");

// 文本部分

MimeBodyPart textPart = new MimeBodyPart();

textPart.setContent("古风图片bbb<img src='cid:mm'/>bbb", "text/html;charset=UTF-8");

// 内嵌图片部分

MimeBodyPart imagePart = new MimeBodyPart();

DataHandler dh = new DataHandler(new FileDataSource("c:/1.jpg"));

imagePart.setDataHandler(dh);

imagePart.setContentID("mm");

// 文本和内嵌图片合体部分

MimeMultipart mpart1 = new MimeMultipart();

mpart1.addBodyPart(textPart);

mpart1.addBodyPart(imagePart);

mpart1.setSubType("related");

MimeBodyPart textImagePart = new MimeBodyPart();

textImagePart.setContent(mpart1);

// 附件部分

MimeBodyPart attachmentPart = new MimeBodyPart();

dh = new DataHandler(new FileDataSource("c:/附件.rar"));

String filename = dh.getName(); // 获取附件原文件名

attachmentPart.setDataHandler(dh);

// 手工设置附件文件名(原文件名称) 注: 中文文件名要注意编码

attachmentPart.setFileName(MimeUtility.encodeText(filename));

// 全部合体部分

MimeMultipart mpart2 = new MimeMultipart();

mpart2.addBodyPart(textImagePart); // 文本加内嵌图片部分

mpart2.addBodyPart(attachmentPart); // 附件部分

mpart2.setSubType("mixed"); // 复杂关系

message.setContent(mpart2);

message.saveChanges();

message.writeTo(new FileOutputStream("c:/3.eml"));

}

}

-------------------------------------------------------------------------------------------------

七、发送邮件的俩种方式(火箭):

方式1:

---------------------------------------------------------------------------------------------------

public class SendMail1 {

public static void main(String[] args) throws Exception {

// 创建邮件

Properties props = new Properties();// 环境变量设置,发送邮件时才需要

props.setProperty("mail.transport.protocol", "smtp"); // 发送使用的协议

props.setProperty("mail.host", "smtp.qq.com"); // 发送服务器的主机地址

props.setProperty("mail.smtp.auth", "true"); // 请求身份验证

Session session = Session.getDefaultInstance(props);

MimeMessage message = new MimeMessage(session);

message.setFrom(new InternetAddress("9706@qq.com"));

message.setRecipients(MimeMessage.RecipientType.TO, "96336@qq.com");

message.setSubject("这是我发送的一封简单邮件");

message.setText("嘿,马上要开学了~~~");

message.saveChanges();

// 发送邮件

Transport ts = session.getTransport(); // 得到火箭

ts.connect("963706@qq.com", "qq邮箱密码"); // 连接

ts.sendMessage(message, message.getAllRecipients()); // 发送给所有的用户

ts.close();

}

}

---------------------------------------------------------------------------------------------------

方式2:

---------------------------------------------------------------------------------------------------

public class SendMail2 {

public static void main(String[] args) throws Exception {

Properties props = new Properties();

props.setProperty("mail.transport.protocol","smtp"); // 发送使用的协议

props.setProperty("mail.host", "smtp.qq.com"); // 发送服务器的主机地址

props.setProperty("mail.smtp.auth", "true"); // 请求身份验证

Session session = Session.getDefaultInstance(props,new Authenticator() {

@Override

protected PasswordAuthentication getPasswordAuthentication() {

return new PasswordAuthentication("966@qq.com", "1877");

}

});

MimeMessage message = new MimeMessage(session);

message.setFrom(new InternetAddress("963353706@qq.com"));

message.setRecipients(MimeMessage.RecipientType.TO, "qq邮箱密码");

message.setSubject("这是我发送的第二封邮件哦");

message.setText("2 o my god tomorrow is learning~~~");

message.saveChanges();

Transport.send(message);

}

}

---------------------------------------------------------------------------------------------------

八、案例:用户注册,发送激活邮件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: