************本人水平有限,在学习时请用批判的态度学习,有问题给我留言************
前几天听的方立勋方老师javamail的课程,今天把代码详细注解写一下,加深一下印象,方老师不愧是对邮件发送有深入研究,讲了很多相关的知识,今天也一并记录下来。
方老师讲解javamail之前详细讲解了邮件发送的原理,这里我记录一下用telnet发送邮件的方法。
第一步和邮件服务器打招呼:
Ehlo 主机名(你的计算机名可以随意填写)
Auth login 登陆命令(回车后提示你输入用户名密码)
输入用户名(注意需要时base64编码过的用户名,可以用new sun.misc.BASE64Encoder()).encode( s.getBytes())转码
密码同用户名
Mail from:<你的邮件地址>
Rcpt to:<你发送的邮件地址>
Data(回车后输入正文)
.(结束正文输入)
Quit(结束邮件发送)
邮件中可以加入发送人的地址,可以和mail from中的不一样,也就是说你可以不用知道别人邮箱的密码就用别人的邮箱发送邮件了!!!
邮件服务器搭建
安装邮件服务器 在dns上注册A记录 mx记录
A记录是你的服务器给对方服务器发送邮件时对方服务器会查询的记录,如果记录上有你的邮件服务器的地址,对方将不会要求你输入用户名密码
Mx记录是对方服务器给你的服务器发送邮件是需要查询的记录,如果对方能在dns上查询到你的记录则给你发送邮件,如果查询不到则不发送。
Javamail邮件发送程序详解
package cn.itcast;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
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 javax.mail.internet.MimeUtility;
/**
* 邮件发送
* 详尽注释每一步做法和含义,方便大家学习
*
* @version 1.0
* @note caohua
* @company 传智博客
*/
public class ComplexMail {
public static void main(String[] args) throws Exception {
Properties prop = new Properties();//得到一个properties的实例 得到session的时候要用到
prop.put("mail.transport.protocol", "smtp");//协议
prop.put("mail.smtp.auth", "true");//是否用户登录 否的话就是邮件服务器之间的发送..........................?
//注意:这个session 不是 httpsession 更不是hibernate的session 这个事javamail api中的session 基本邮件会话
Session session = Session.getDefaultInstance(prop);//用Session类的一个静态方法得到session的实例
session.setDebug(true);//在控制台打印出和邮件服务器的交互过程
Transport transport = session.getTransport();//得到一个Transport的实例 这个类是一个抽象类,我们可以使用这个类的静态方法send()来发送消息
transport.connect("smtp.sina.com","caohua_1012", "9831012");
Message message = createMessage(session);//得到有内容的Message实例 内容的填充时调用createMessage方法
//InternetAddress是一个继承了Address接口的类
InternetAddress[] ia = new InternetAddress[]{new InternetAddress("caohua_1012@sina.com")};//得到一个地址数组
transport.sendMessage(message,ia);//发送邮件的方法需要两个参数 一个是内容类(Message)的实例 一个是地址数组(会发送给多个人所以是数组)
transport.close();//关闭通信
}
/**
* 填充Message类的内容
* @param session
* @return Message
* @throws Exception
*/
private static Message createMessage(Session session) throws Exception {
MimeMessage message = new MimeMessage(session);//得到一个message对象
message.setFrom(new InternetAddress("caohua_1012@sina.com"));//设置发件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("caohua_1012@sina.com"));//设置收件人
message.setSubject("javamail测试邮件");//邮件主题
/** 代表正文的bodypart
* <img src=cid:logo.gif>的调用方法是 cid:logo.gif在图片的bodypart定义类型时定义 在邮件正文的bodypart中需要这样调用 如果不调用则按照附件来处理
**/
MimeBodyPart text = new MimeBodyPart();//得到一个正文bodypart的实例
text.setContent("<html> 我是一个码农!!!<img src=cid:logo.gif>码农祖师爷的神像</html>", "text/html;charset=gb2312");//set内容 及返回的内容的contenttype
/** 代表正文所引用的图片的bodypart **/
MimeBodyPart image = new MimeBodyPart();//得到一个图片的bodypart实例
DataHandler dh1 = new DataHandler(new FileDataSource("E://aa.jpg"));//一种数据类型的处理类 初始化需要传入一个数据源
image.setDataHandler(dh1);//放入多媒体数据
image.setContentID("logo.gif");//定义正文内容引用id
/** 代表附件的bodypart **/
MimeBodyPart attach = new MimeBodyPart();//得到一个附件的bodypart类
DataHandler dh2 = new DataHandler(new FileDataSource("E://10635324.jpg"));//一种数据类型的处理类 初始化需要传入一个数据源
attach.setDataHandler(dh2);//放入多媒体数据
attach.setFileName(MimeUtility.encodeText(dh2.getName())); //要对中文文件名进行编码!!!
MimeMultipart text_image = new MimeMultipart();//数据容器 正文中有文本 + 图片需要先放到这个类中 然后再把这个类放入到 一个新的bodypart类中
text_image.addBodyPart(text);//将文本放入数据容器中
text_image.addBodyPart(image);//将图片放入数据容器中
text_image.setSubType("related");//设置数据容器类型 mixed(没关系) related(调用关系) alternative
MimeBodyPart text_image_body = new MimeBodyPart();//得到一个新的bodypart
text_image_body.setContent(text_image);//把数据容器放入新的bodypart中
/** 封装了所有邮件数据的容器 **/
MimeMultipart multipart = new MimeMultipart();//将附件 正文+图片的数据容器 合并放入这个数据容器
multipart.addBodyPart(text_image_body);//放入正文+图片的数据容器
multipart.addBodyPart(attach);//放入附件
multipart.setSubType("mixed");//设置混合类型
message.setContent(multipart);//将数据容器放入message类
message.saveChanges();//保存修改
return message;
}
}