使用JavaMail发送邮件

Posted AntzUhl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用JavaMail发送邮件相关的知识,希望对你有一定的参考价值。

 

使用JavaMail的API发送邮件~!

  1 import org.apache.commons.collections.CollectionUtils;
  2 import org.apache.log4j.Logger;
  3 import org.springframework.stereotype.Service;
  4 import javax.mail.*;
  5 import javax.mail.internet.AddressException;
  6 import javax.mail.internet.InternetAddress;
  7 import javax.mail.internet.MimeMessage;
  8 import javax.mail.internet.MimeUtility;
  9 import java.io.UnsupportedEncodingException;
 10 import java.util.*;
 11 import java.util.List; 
 12 
 13 
 14 
 15 @Service
 16 public class MailService {
 17     private final String MAIL_SMTP_HOST="********@qq.com";
 18     private final String MAIL_SMTP_PORT="465";//465端口是为SMTPS(SMTP-over-SSL)协议服务开放的
 19     private final String MAIL_SENDER_MAIL="[email protected]";
 20     private final String MAIL_SENDER_PASS="*******";
 21     private final String MAIL_SENDER_NICKNAME="腾讯邮箱平台";
 22     private Logger logger = Logger.getLogger(MailService.class);
 23 
 24     public static void main(String[] args) {
 25         MailService m = new MailService();
 26         List<String> recipients = new ArrayList<String>();
 27         l.add("***@alibaba-inc.com");
 28 
 29         List<String> copyToRecipients = new ArrayList<String>();
 30         l1.add("***@alibaba-inc.com");
 31 
 32         try {
 33             m.sendMail("title","content",recipients,copyToRecipients,null);
 34         } catch (MessagingException e) {
 35             e.printStackTrace();
 36         } catch (UnsupportedEncodingException e) {
 37             e.printStackTrace();
 38         }
 39     }
 40 
 41     /**
 42      * 初始化Session
 43      * @return
 44      */
 45     private Session getMailSession(){
 46         Properties props = new Properties();
 47 
 48         props.put("mail.smtp.host", MAIL_SMTP_HOST);
 49         props.put("mail.smtp.port", MAIL_SMTP_PORT);
 50         props.put("mail.smtp.auth", "true");
 51         props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
 52 
 53         Session session = Session.getDefaultInstance(props, new Authenticator() {
 54             protected PasswordAuthentication getPasswordAuthentication() {
 55                 return new PasswordAuthentication(MAIL_SENDER_MAIL, MAIL_SENDER_PASS);
 56             }
 57         });
 58 
 59         return session;
 60     }
 61 
 62     /**
 63      *
 64      * @param title 邮件标题
 65      * @param content  邮件内容
 66      * @param recipients 收件人邮箱列表
 67      * @param copyToRecipients 抄送人邮箱列表
 68      * @param secretCopyToRecipients 密送人邮箱列表
 69      * @throws MessagingException
 70      * @throws UnsupportedEncodingException
 71      */
 72     public boolean sendMail(String title,String content,Collection<String> recipients,
 73                             Collection<String> copyToRecipients,Collection<String> secretCopyToRecipients) throws AddressException, MessagingException, UnsupportedEncodingException {
 74         // 初始化收件人、抄送、密送邮箱列表
 75         List<InternetAddress> toAddresses = parseStringToAddress(recipients);
 76         List<InternetAddress> ccAddresses = parseStringToAddress(copyToRecipients);
 77         List<InternetAddress> bccAddresses = parseStringToAddress(secretCopyToRecipients);
 78         //初始化邮件内容
 79         Message message = new MimeMessage(getMailSession());
 80         message.setFrom(new InternetAddress(MAIL_SENDER_MAIL, MAIL_SENDER_NICKNAME));
 81         String subject = MimeUtility.encodeWord(title, "UTF-8", "Q");//设置标题编码
 82         message.setSubject(subject);
 83         message.setContent(content, "text/html; charset=utf-8");
 84 
 85         // 收件人
 86         message.setRecipients(Message.RecipientType.TO, toAddresses.toArray(new InternetAddress[toAddresses.size()]));
 87 
 88         // 抄送
 89         message.setRecipients(Message.RecipientType.CC, ccAddresses.toArray(new InternetAddress[ccAddresses.size()]));
 90 
 91         // 密送
 92         message.setRecipients(Message.RecipientType.BCC, bccAddresses.toArray(new InternetAddress[bccAddresses.size()]));
 93 
 94         message.saveChanges();
 95 
 96         Transport.send(message);
 97 
 98         return true;//不报异常表示邮件发送成功
 99     }
100 
101     /**
102      * 将字符串类型的邮箱地址转成InternetAddress类型的邮箱地址
103      * @param mailStrings
104      * @return List<InternetAddress>
105      */
106     private List<InternetAddress> parseStringToAddress(Collection<String> mailStrings) throws AddressException {
107 
108         if(CollectionUtils.isEmpty(mailStrings)){
109             return Collections.emptyList();
110         }
111         List<InternetAddress> addressList = new ArrayList<InternetAddress>();
112 
113         for(String mailString:mailStrings){
114             InternetAddress internetAddress =  new InternetAddress(mailString);
115             addressList.add(internetAddress);
116         }
117         return addressList;
118     }
119 
120 }

可能出现的错误:Could not connect to SMTP host: smtp.***.com, port: 465, response: -1

  在使用javamail进行邮件发送的时候,报错:

Could not connect to SMTP host: smtp.***.com, port: 465, response: -1

  原因:

1 props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

  扩展-邮件服务端口:

  25端口(SMTP):25端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务所开放的,是用于发送邮件。如今绝大多数邮件服务器都使用该协议。当你给别人发送邮件时,你的机器的某个动态端口(大于1024)就会与邮件服务器的25号端口建立一个连接,你发送的邮件就会通过这个连接传送到邮件服务器上,保存起来。

  109端口(POP2):109端口是为POP2(Post Office Protocol Version 2,邮局协议2)服务开放的,是用于接收邮件的。

  110端口(POP3):110端口是为POP3(Post Office Protocol Version 3,邮局协议3)服务开放的,是用于接收邮件的。

  143端口(IMAP):143端口是为IMAP(INTERNET MESSAGE ACCESS PROTOCOL)服务开放的,是用于接收邮件的。

目前POP3使用的比POP2广得多,POP2几乎被淘汰,也有某些服务器同时支持POP2和POP3协议。

客户端可以使用POP3协议来访问服务端的邮件服务,如今ISP的绝大多数邮件服务器都是使用POP3协议(极少用POP2协议)。

在使用邮件客户端程序的时候,会要求输入POP3服务器地址,默认情况下使用的就是110端口。

当你用邮件客户端(比如、Thunderbird、foxmail、MS Outlook Express以及各类邮件精灵)登录时,

你的机器就会自动用机器的某一个动态端口(大于1024)连接邮件服务器的110端口,服务器就把别人给你发的邮件(之前保存在邮件服务器上),

发送到你机器,这样你就可以看到你客户端工具上的收件箱里的新邮件了。 IMAP协议,和POP3协议一样是用来接收邮件的,但是它有它的特别和新颖之处,它是面向用户的,

它和POP3协议的主要区别是:用户可以不用把所有的邮件内容全部下载,而是只下载邮件标题和发件人等基本信息,

用户可以由标题等基本信息,去决定是否下载邮件全文,用户可以通过客户端的浏览器直接对服务器上的邮件进行操作

(比如:打开阅读全文、丢进垃圾箱、永久删除、整理到某文件夹下、归档、)。

再简单来说就是:浏览器用的IMAP协议(143端口)来为你接收邮件以及让你很方便的操作服务器上的邮件。

邮件客户端用的POP3协议(110端口)来为你接收邮件的全部信息和全文内容保存到你的本地机器成为一个副本,

你对邮件客户端上的副本邮件的任何操作都是在副本上,不干涉邮件服务器上为你保存的邮件原本。 上面介绍的SMTP协议、POP2协议、POP3协议、IMAP协议都是不安全的协议。

因考虑到网络安全的因素,下面给你介绍基于SSL(Secure Sockets Layer 安全套接层)协议的安全的邮件收发协议。

你的邮件在传输过程中可能被网络黑客截取邮件内容,如果你的邮件机密性非常强,不想被收件人以外的任何人和任何黑客截取,或者是涉及国家机密安全的,等等。

那么你的邮件就不该使用上述的三种协议进行收发。

若你采用SMTP协议发邮件,那么你发出的邮件从你的机器传到服务器的过程中,可能被黑客截取从而泄露。****若你采用POP2或者POP3协议收取邮件,那么你的邮件从服务器传至你当前机器的过程可能被黑客截取从而泄露。

465端口(SMTPS):465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPS和SMTP协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。

995端口(POP3S):995端口是为POP3S(POP3-over-SSL)协议服务开放的,这是POP3协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。POP3S和POP3协议一样,也是用来接收邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件接收方抗抵赖功能。防止收件者收件之后删除已收邮件,拒不承认收到过这样一封邮件。

993端口(IMAPS):993端口是为IMAPS(IMAP-over-SSL)协议服务开放的,这是IMAP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。IMAPS和IMAP协议一样,也是用来接收邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件接收方抗抵赖功能。防止收件者收件之后删除已收邮件,拒不承认收到过这样一封邮件。

以上是关于使用JavaMail发送邮件的主要内容,如果未能解决你的问题,请参考以下文章

JavaMail:利用JavaMail发送复杂邮件

javamail电子邮件不发送

Spring集成JavaMail并利用线程池发送邮件

如何使用 JavaMail 发送带有附件的 html 电子邮件

如何使用 JavaMail 发送 html 电子邮件?

使用javamail 发送邮件