javaMail(二)

嗯,更深的理解一下javaMail吧。
首先还是奉上大佬链接。
http://www.cnblogs.com/CryOnMyShoulder/p/9351382.html
https://blog.csdn.net/ghsau/article/category/1834295
然后开始写一下笔记。

javaMail分为两个部分,第一部分是API接口。第二部分是service provider,服务提供者(实现类)。包括SMTP,POP3,IMAP。
API中常用四部分。
Session:记录环境信息:主机名,端口号,协议名称,身份验证。
Message:记录邮件信息:主题,内容,发件人,发送抄送密送,附件。
Transport:连接邮箱的SMTP服务器,用来发送邮件。
Store:连接邮箱的POP3服务器,用来接收邮件。

服务器信息可以设置到Session中,也可以设置到Transport中。
收件人信息可以设置到Message中,也可以设置到Transport中。

接下来按发邮件的顺序记录知识点。

//0、MailBean类。
public class MailBean  {
    private String smtpHost = "";//服务器地址
    private String smtpPort = "";//服务器端口号
    private String smtpAddr = "";//发件人邮箱地址
    private String userName = "";//用户名
    private String password = "";//用户密码
    private String smtpAuth = "";//身份验证
    private String smtpDebug = "";//开启debug调试
}
//发送邮件
public static void send(String to, String cs, String ms, 
    String subject,String content, MailBean mailBean, String fileList[]) {

    //1、建立会话,将环境信息放进Session中。
    Properties p = new Properties();          
    p.put("mail.smtp.auth", mailBean.getSmtpAuth());//身份验证
    p.put("mail.transport.protocol", "smtp");//发送邮件协议名
    p.put("mail.smtp.host", mailBean.getSmtpHost());//邮件服务器主机名
    p.put("mail.smtp.port", mailBean.getSmtpPort());//邮件服务器端口
    Session session = Session.getInstance(p);

    //2、创建邮件对象
    Message msg = new MimeMessage(session);
    msg.setFrom(new InternetAddress(mailBean.getSmtpAddr()));//new一个邮件地址,发件人
    Multipart multipart = new MimeMultipart();//邮件正文框(包括附件)
    BodyPart messageBodyPart = new MimeBodyPart();//邮件组成部分
    //发送
    if(to != null) {
    InternetAddress[] iaToList = new InternetAddress().parse(to);
    msg.setRecipients(Message.RecipientType.TO, iaToList); // 收件人
    }
    //抄送
    if(cs != null) {
        InternetAddress[] iaToListcs = new InternetAddress().parse(cs);
        msg.setRecipients(Message.RecipientType.CC, iaToListcs); // 抄送人
    }
    //密送
    if(ms != null) {
        InternetAddress[] iaToListms = new InternetAddress().parse(ms);
        msg.setRecipients(Message.RecipientType.BCC, iaToListms); // 密送人
        }
    msg.setSentDate(new Date()); // 发送日期
    msg.setSubject(subject); // 主题
    msg.setText(content); // 内容
    messageBodyPart.setContent(content, "text/html;charset=gbk");
    multipart.addBodyPart(messageBodyPart);//将body部分放在mult里
    //添加附件
    for(int index = 0; index < fileList.length; index++)
    {
        BodyPart mailArchieve = new MimeBodyPart();
        FileDataSource fds = new FileDataSource(fileList[index]);
        mailArchieve.setDataHandler(new DataHandler(fds));
        mailArchieve.setFileName(MimeUtility.encodeText(fds.getName(),"GBK", "B"));
        multipart.addBodyPart(mailArchieve);
    }
    msg.setContent(multipart);

    //3、邮件服务器进行验证并发送邮件
    Transport tran = session.getTransport("smtp");
    tran.connect(mailBean.getSmtpHost(), mailBean.getUserName(), mailBean.getPassword());
    tran.sendMessage(msg, msg.getAllRecipients()); //发送
    System.out.println("邮件发送成功");
    tran.close();
}

剖析一下Message。
按代码写的顺序,Message从头到尾set进来的值分别是:
1>setFrom(发件人地址)
2>setRecipients(发送,抄送,密送人邮箱)
3>setSentDate(发送日期)
4>setSubject(主题)
5>setText(内容)——>纯文本首选
6>setContent(multipart)——>由附件或者HTML文件格式消息首选

上面提到了multipart,就来说一下。把Message比喻成一个箱子,那么multipart就是箱子所有东西的集合。bodyPart就是箱子里每一个东西。

然后来说每个东西bodyPart。在代码里bodyPart一共用过两次:第一次是messageBodyPart,这个东西是正文。第二次是mailArchieve,这个东西的每个附件。

最后东西存在集合里,集合放在箱子里。
multipart.addBodyPart(messageBodyPart);
multipart.addBodyPart(mailArchieve);
msg.setContent(multipart);
补充:Message,Multipart,BodyPart 都是抽象类,实例化的时候必须实例化一个子类。MimeMessage,MimeMultipart,MimeBodyPart。

new InternetAddress() 和 new InternetAddress().parse() 区别。前者单发,后者群发。注意群发时,邮箱地址之间用逗号分隔就好。

FileDataSource对象,下面这个图能说明一切。


javaMail(二)_第1张图片

你可能感兴趣的:(javaMail(二))