JAVA WEB从入门到精通 day23 使用java发送邮件

JAVA邮件的发送

邮件发送的原理

客户端通过SMTP协议发送邮件到SMTP服务器,然后其他客户端再通过POP3,IMAP等协议接收也就是下载服务器上的邮件。 

邮件协议

        SMTP协议: 
        SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。SMTP 服务器就是遵循SMTP协议的发送邮件服务器。用来发送邮件的协议。


        POP3协议:
        邮局协议的第三版本。电子邮件用户要从邮件服务器读取或下载邮件时必须要有邮件读取协议。 用来接收邮件的协议。 
        要求邮件服务器完成下面几种任务之一:
        1.从邮件服务器中检索邮件并从服务器中删除这个邮件;从邮件服务器中检索邮件但不删除它;
        2.不检索邮件,只是询问是否有新邮件到达。 

        POP协议支持多用户互联网邮件扩展,后者允许用户在电子邮件上附带二进制文件,如文字处理文件和电子表格文件等,实际上这样就可以传输任何格式的文件了,包括图片和声音文件等。
        在用户阅读邮件时,POP命令所有的邮件信息立即下载到用户的计算机上,不在服务器上保留。

        IMAP协议:
        和POP一样,MAP也能下载邮件、从服务器中删除邮件或询问是否有新邮件,但IMAP克服了POP的一些缺点。 

        例如,它可以决定客户机请求邮件服务器提交所收到邮件的方式,请求邮件服务器只下载所选中的邮件而不是全部邮件。客户机可先阅读邮件信息的标题和发送者的名字再决定是否下载这个邮件。 

        通过用户的客户机电子邮件程序,IMAP可让用户在服务器上创建并管理邮件文件夹或邮箱、删除邮件、查询某封信的一部分或全部内容,完成所有这些工作时都不需要把邮件从服务器下载到用户的个人计算机上。 

邮件服务器的名称

smtp服务器的端口号为25,服务器名称为smtp.xxx.xxx
pop3服务器额端口号为110,服务器名称为pop3.xxx.xxx

        例如:
        163:smtp.163.com和pop3.163.com 
        qq:  smtp.qq.com和pop3.qq.com
        sina: smtp.sina.com和pop3.sina.com 等等 

JavaMail

JavaMail是java提供的一组用来处理email的API。进行一些常用的邮件传输。 
虽然JavaMail是Sun的API之一,但它目前还没有被加在标准的java开发工具包中(JDK)
所以我们需要从官网下载javaMail的jar包。
使用JavaMail的时候需要Javabean Activation Framework的支持,因此你也需要下载JAF 

核心类  

    Session:一个基本的邮件会话。得到它相当于与邮件服务器连接。 

    MimeMessage:表示一个邮件对象,可以调用方法设置发件人收件人,主题,正文等邮件信息。

    Transport:只有一个功能,发邮件。 

JavaMail的简单使用

第一步:获得Session 

Session session = Session.getInstance(Properties prop, Authenticator auth); 
其中prop需要指定两个键值,一个是指定服务器主机名,另一个是指定是否需要认证。我们当然需要认证。 
Properties prop = new Properties(); 
prop.setProperty(“mail.host”, “smtp.163.com”);//设置服务器主机名
prop.setProperty(“mail.smtp.auth”, “true”);//设置需要认证

其中Authenticator是一个接口表示认证器,即校验客户端的身份。我们需要自己来实现这个接口,实现这个接口需要使用账户和密码。
Authenticator auth = new Authenticator() {
    public PasswordAuthentication getPasswordAuthentication () {
        new PasswordAuthentication(“邮箱用户名”, “密码”);//用户名和密码
}
};
通过上面的准备,现在可以获取得Session对象了:
Session session = Session.getInstance(prop, auth);

第二步:创建MimeMessage对象 

创建MimeMessage需要使用Session对象来创建:
MimeMessage msg = new MimeMessage(session);
然后需要设置发信人地址、收信人地址、主题,以及邮件正文。 

msg.setFrom(new InternetAddress(“xxx”));//设置发信人
msg.addRecipients(RecipientType.TO, “xxx”);//设置收信人
msg.addRecipients(RecipientType.CC, “xxx”);//设置抄送
msg.addRecipients(RecipientType.BCC, ”xxx”);//设置暗送
msg.setSubject(“这是一封测试邮件”);//设置主题(标题)
msg.setContent(“hello world!”, “text/plain;charset=utf-8”);//设置正文

第三步:发送邮件
Transport.send(msg);//发送邮件 
public class Demo1 {

    public static void main(String[] args) throws AddressException, MessagingException {
        Properties prop=new Properties();          //创建properties,设置键值对
        prop.setProperty("mail.host", "smtp.163.com");
        prop.setProperty("mail.smtp.auth", "true");

        Authenticator auth=new Authenticator() {  //得到Authenticator对象
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("邮箱账号", "密码");
            }
        }; 

        Session session=Session.getInstance(prop, auth); //得到session
        MimeMessage msg=new MimeMessage(session);   //获取MimeMessage对象
        msg.setFrom(new InternetAddress("xxx"));   //设置发件人
        msg.setRecipients(RecipientType.TO, "xxx");  //设置收件人

        msg.setSubject("测试邮件");  //设置主题
        msg.setContent("垃圾邮件", "text/html;charset=utf-8"); //设置正文


        Transport.send(msg); //发送邮件


    }

}

发送带附件的邮件

一封邮件可以包含正文、附件N个,所以正文与N个附件都是邮件的一个部份。 

上面的hello world案例中,只是发送了带有正文的邮件!所以在调用setContent()方法时直接设置了正文,如果想发送带有附件邮件,那么需要设置邮件的内容为MimeMultiPart。 

MimeMulitpart parts = new MimeMulitpart();//多部件对象,可以理解为是部件的集合
msg.setContent(parts);//设置邮件的内容为多部件内容。 

然后我们需要把正文、N个附件创建为“主体部件”对象(MimeBodyPart),添加到MimeMuiltPart中即可。
MimeBodyPart part1 = new MimeBodyPart();//创建一个部件
part1.setCotnent(“这是正文部分”, “text/html;charset=utf-8”);//给部件设置内容
parts.addBodyPart(part1);//把部件添加到部件集中。

下面我们创建一个附件:
MimeBodyPart part2 = new MimeBodyPart();//创建一个部件
part2.attachFile(“F:\\a.jpg”);//设置附件
part2.setFileName(“hello.jpg”);//设置附件名称
parts.addBodyPart(part2);//把附件添加到部件集中

注意,如果在设置文件名称时,文件名称中包含了中文的话,那么需要使用MimeUitlity类来给中文编码:
part2.setFileName(MimeUitlity.encodeText(“美女.jpg”)); 
public class Demo2 {

    public static void main(String[] args) throws MessagingException, IOException {
        Properties prop=new Properties();
        prop.setProperty("mail.host", "smtp.163.com");  //设置properties键值对
        prop.setProperty("mail.smtp.auth", "true");

        Authenticator auth=new Authenticator() {   //得到Authticator对象
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("邮箱账号", "邮箱密码");
            }
        }; 

        Session session=Session.getInstance(prop, auth);   //得到Session
        MimeMessage msg=new MimeMessage(session);    //得到MimeMessage对象
        MimeMultipart list=new MimeMultipart();      //得到多部件对象

        MimeBodyPart part1=new MimeBodyPart();     //创建一个正文部件
        part1.setContent("包含附件的邮件", "text/html;charset=utf-8");//设置正文
        list.addBodyPart(part1);   //添加到多部件对象中

        MimeBodyPart part2=new MimeBodyPart();  //创建一个附件部件
        part2.attachFile(new File("f://a.jpg")); //指定发送的文件
        part2.setFileName(MimeUtility.encodeText("照片A.jsp"));//设置文件名字,并对中文进行编码
        list.addBodyPart(part2);   //添加到多部件对象中
        msg.setFrom(new InternetAddress("xxx")); //设置发件人
        msg.setRecipients(RecipientType.TO, "xxx");//设置收件人
        msg.setContent(list);  //将多部件对象放进来

        Transport.send(msg);  //发送邮件


    }

}

你可能感兴趣的:(java,邮件服务器)