邮件发送

二、base64编码:
采用Base64编码可以把任何字节转换为字符
原理:3字节----》4字节
注意:要在libraries里设置Access为Accessible,Rule Pattern 为**
BASE64Encoder base = new BASE64Encoder();
System.out.println(base.encode("is ok".getBytes()));
base64实际是一个码表  
二、邮件开发
**SMTP:Simple Message Transfer Protocol 简单消息传输协议(发送邮件协议)
25

手工发送一封邮件:(熟知SMTP协议)
准备:
1、两个邮箱和密码
[email protected]   iamsorry
[email protected] iamsorry
2、Base64编码工具:对用户名itheimacloud 和密码进行编码
itheimacloud
aXRoZWltYWNsb3Vk


iamsorry
aWFtc29ycnk=


3、客户端telnet
手发邮件:
telnet smtp.163.com 25
-------------------------------------------
ehlo wzhting
auth login             #请求认证
aXRoZWltYWNsb3Vk
aWFtc29ycnk=

mail from:
rcpt to:

data                   #邮件内容开始
*******************************************邮件内容也得符合格式RFC822规范
subject:主题
from:[email protected]
to:[email protected]                     cc:抄送  bcc:密送

aaaaaaabbbbbbb
cccccccddddddd

*******************************************
.                      #邮件内容结束
-------------------------------------------
quit
SMTP协议:ehlo 主机名 (smtp2代)
 auth login //经过base64编码后的用户名和密码
 mail from: 谁发的
 rcpt to: 发给谁
 Data  邮件内容开始邮件内容也得符合格式Rfc822规范
  .号代表邮件内容的结束
 quit 代表退出
Rfc822规范:
邮件头和邮件体,两者使用空格分隔
邮件头:
from字段(发件人地址);
to字段(收件人地址);
subject字段(邮件标题);
cc(抄送)、bcc字段(暗送);





POP:Post Office Protocal 邮局协议(接收邮件协议)
110userusername 
passpassword  
stat 返回邮箱的统计信息
list[msg#]返回某一封邮件的统计信息
retrmsg#  最重要的一个命令
quit 



一、JavaMail简介
面向对象的思想实现SMTP和POP协议的收发邮件的过程。
JavaMail API是由SUN提供的标准规范


mail.jar
activation.jar(JDK1.6+就不需要了 Java Activation Framework Java激活框架)


二、创建各种邮件:
最后发现是和Java EE 5 Libraries/javaee.jar/mail冲突,找到病原那就立刻诊治:
    用解压文件打开C:\Program Files\Genuitec\Common\plugins\com.genuitec.eclipse.j2eedt.core_8.5.0.me201003231033\data\libraryset\EE_5\javaee.jar,删除其中的mail就好了,我这个是以myeclipse8.5为例子的,因为我用的是8.5,但是方法都一样,
    注意:打开javaee.jar包时用好压软件是打不开的,要用WinRAR软件!希望碰到这样问题的朋友都可以解决!
1、只有文本的邮件
1.配置环境
Properties properties = new Properties();//配置文件
Session session = Session.getInstance(properties);//发邮件的环境
MimeMessage message= new MimeMessage(session);//代表一封邮件
2.添加邮件内容:
设置邮件的主题,from,to
message.setSubject("这是一封只有文本的邮件");  //邮件的主题
message.setFrom(new InternetAddress("[email protected]"));//邮件头里邮件发送人地址
message.setRecipients( Message.RecipientType.TO, "[email protected]");//邮件收信地址和收信类型
message.setText("bbbbbbbbbbbbbbb");//写邮件内容
message.saveChanges();//邮件内容包含在一个文件夹里
2、文本中内嵌图片的邮件
enctype="multipart/form-data"
请求正文是由多部分组成的,每部分使用的MIME协议描述的

-----------------------------7dd1992b30844
Content-Disposition: form-data; name="name"

abc
-----------------------------7dd1992b30844
Content-Disposition: form-data; name="author"

123
-----------------------------7dd1992b30844
Content-Disposition: form-data; name="price"

456
-----------------------------7dd1992b30844
Content-Disposition: form-data; name="image"; filename="a.txt"
Content-Type: text/plain

aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-----------------------------7dd1992b30844
Content-Disposition: form-data; name="description"

def
-----------------------------7dd1992b30844
Content-Disposition: form-data; name="categoryId"

GRYW277KKSWWRAOMZ0CEZEIU6A91KT1P
-----------------------------7dd1992b30844--

邮件内容如果包含多部分的话,也是这样描述数据的。
------------------------sadflk234324
Content-Type:text/html;
aaaaaa
------------------------sadflk234324
Content-Type:image/jpg;
Content-Id:mm

sdlkflkdsfdsf   Base64编码
ddsfds
fds
f
ds
fds
f
dsfdsf
------------------------sadflk234324--

在JavaMail中:
BodyPart:代表每一部分内容
1.文件环境
Properties properties = new Properties();//配置文件
Session session = Session.getInstance(properties);//发邮件的环境
MimeMessage message= new MimeMessage(session);//代表一封邮件
2.文件标头(邮件主题、发送人、收信人)
message.setSubject("这是一封只有文本的邮件");  //邮件的主题
message.setFrom(new InternetAddress("[email protected]"));//邮件头里邮件发送人地址
message.setRecipients( Message.RecipientType.TO, "[email protected]");//邮件收信地址和收信类型
3两个MimeBodyPart通过MimeMultipart联系一起是有关系的联系在一起
//文本部分
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent("aaaaaa", "text/html");
MimeBodyPart imgPart = new MimeBodyPart();
//JAF 框架,要嵌入图片部分
DataHandler dh = new DataHandler(new FileDataSource("src/DSC_0428.JPG"));
imgPart.setDataHandler(dh);//jaf会自动探测到读取文件的mime类型
imgPart.setContentID("mm");
//关联起来
MimeMultipart mmpart = new MimeMultipart();//描述多部分间的关系
mmpart.addBodyPart(bodyPart);
mmpart.addBodyPart(imgPart);
mmpart.setSubType("related");
4.放进message里
message.setContent(mmpart);
message.saveChanges();//邮件内容包含在一个文件夹里
3、文本中内嵌图片,还有附件的邮件
原理:bodyPart和图片bodyPart通过MimuMultipart用关系related联系在一起,再把MimeMultipart放进bodyPart中,附件的bodyPart,两个bodyPart
再通过MimeMultilpart的复杂关系mix联系一起,最后放进message里

//附件部分
MimeBodyPart attachmentPart = new MimeBodyPart();
dh = new DataHandler(new FileDataSource("f:/360Downloads/凌波教学软件.rar"));
attachmentPart.setDataHandler(dh);

//嵌入图片和文字关联bodyPart
MimeBodyPart imgtex= new MimeBodyPart();
imgtex.setContent(mmpart);

//和附近关系起来
MimeMultipart attT = new MimeMultipart();
attT.addBodyPart(attachmentPart);//附件部分
attT.addBodyPart(imgtex);//嵌入图片和附件部分
attT.setSubType("mixed");
//放进message里
message.setContent(attT);
三、发送邮件
配置信息内容
properties.setProperty("mail.transport.protocol", "smtp"); 发送协议
properties.setProperty("mail.host", "smtp.163.com"); //主机名 
properties.setProperty("mail.smtp.auth", "true");//请求服务器认证


//发送代码
Transport ts = session.getTransport();
ts.connect("itheimacloud", "iamsorry");
ts.sendMessage(message,message.getAllRecipients());

设置乱码:
1.正文乱码:
bodyPart.setContent("就是我出来aaa", "text/html;charset=UTF-8");
后面添加后缀
2.附件名乱码:
//附件部分
MimeBodyPart attachmentPart = new MimeBodyPart();
DataHandler dhh = new DataHandler(new FileDataSource("f:/360Downloads/中文.html"));
String name = dhh.getName();
attachmentPart.setDataHandler(dhh);
attachmentPart.setFileName(MimeUtility.encodeText(name)); 解决乱码给设置进去

发送方式二:
//属于第二种发送邮件方式写的session,传入用户名和密码
Session session = Session.getInstance(properties,new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("itheimacloud","iamsorry");
}

});
//发送方式二:用静态方法发送

Transport.send(message);


完整代码:

要activation.jar、mail.jar包,本资源有

/**创建内嵌图片和附件的邮件
 * @author Administrator
 *
 */
public class SendEmbedImageAttaMail {


public static void main(String[] args) throws Exception {
Properties properties = new Properties();//配置文件
properties.setProperty("mail.transport.protocol", "smtp");
properties.setProperty("mail.host", "smtp.163.com");
properties.setProperty("mail.smtp.auth", "true");//请求服务器认证
// Session session = Session.getInstance(properties);//发邮件的环境
//属于第二种发送邮件方式写的session,传入用户名和密码
Session session = Session.getInstance(properties,new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("itheimacloud","iamsorry");
}

});
MimeMessage message= new MimeMessage(session);//代表一封邮件
message.setSubject("内嵌图片和附件的邮件");  //邮件的主题
message.setFrom(new InternetAddress("[email protected]"));//邮件头里邮件发送人地址
message.setRecipients( Message.RecipientType.TO, "[email protected]");//邮件收信地址和收信类型
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent("就是我出来aaa", "text/html;charset=UTF-8");
//图片bodyPart部分
MimeBodyPart imgPart = new MimeBodyPart();
//JAF 框架
DataHandler dh = new DataHandler(new FileDataSource("src/美女.JPG"));
imgPart.setDataHandler(dh);//jaf会自动探测到读取文件的mime类型
imgPart.setContentID("mm");
//图片嵌入关联起来
MimeMultipart mmpart = new MimeMultipart();//描述多部分间的关系
mmpart.addBodyPart(bodyPart);
mmpart.addBodyPart(imgPart);
mmpart.setSubType("related");

//附件部分
MimeBodyPart attachmentPart = new MimeBodyPart();
DataHandler dhh = new DataHandler(new FileDataSource("f:/360Downloads/中文.html"));
String name = dhh.getName();
attachmentPart.setDataHandler(dhh);
attachmentPart.setFileName(MimeUtility.encodeText(name));

//嵌入图片和文字关联bodyPart
MimeBodyPart imgtex= new MimeBodyPart();
imgtex.setContent(mmpart);

//和附近关系起来
MimeMultipart attT = new MimeMultipart();
attT.addBodyPart(imgtex);//嵌入图片和文字部分
attT.addBodyPart(attachmentPart);//附件部分
attT.setSubType("mixed");
//放进message里
message.setContent(attT);
message.saveChanges();//邮件内容包含在一个文件夹里

//发送方式一:
/*Transport ts = session.getTransport();
ts.connect("itheimacloud", "iamsorry");
ts.sendMessage(message,message.getAllRecipients());*/
//发送方式二:
Transport.send(message);
}


}

你可能感兴趣的:(邮件发送)