这里有新鲜出炉的Java函数式编程,程序狗速度看过来!
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。
本文介绍了在利用Java发送邮件过程中遇到的的两个问题,以及如何解决这两个问题。如果大家也遇到了这些问题,可以来参考借鉴。
前言
发送邮件的代码是我从以前的一个应用上直接拷贝过来的。以前使用的腾讯的邮件服务,程序执行起来没有任何问题。后来修改为微软office365邮件服务后,却遇到了两个问题。
问题一,tls加密设置
异常信息如下:
- Exception in thread "main" com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM
这个解决起来比较容易。找了些资料,添加如下配置即可:
- mail.smtp.starttls.enable = true
问题二,提示协议为null:
异常信息如下:
- Exception in thread "main" javax.mail.NoSuchProviderException: Invalid protocol: null
- at javax.mail.Session.getProvider(Session.java:449)
- at javax.mail.Session.getTransport(Session.java:667)
- at javax.mail.Session.getTransport(Session.java:648)
- at javax.mail.Session.getTransport(Session.java:634)
这个问题是在将应用部署到生产环境后才遇到的。经检查后发现调用的jar包不是我在maven中指定的版本。后来确认是应用使用的jar包和容器(就是jetty)使用的jar包冲突了。容器使用的jar版本较旧,不过默认优先加载容器的jar。这样问题解决思路有两个:
依赖容器的jar重新写代码;
更新容器的jar。
第二个选择多少有些危险,就采用第一个选项好了,只需要修改一行即可:
- Transport transport = session.getTransport("smtp");
这个问题在javax.mail 1.4版本中会出现。之后较高的版本会默认采用SMTP协议发送邮件。
修改后的程序:
- package com.zhyea.zytools;
- import java.util.Date;
- import java.util.Properties;
- import javax.mail.Message;
- import javax.mail.Session;
- import javax.mail.Transport;
- import javax.mail.internet.InternetAddress;
- import javax.mail.internet.MimeMessage;
- public class MailSender {
- private static final String MAIL_SMTP_HOST = "smtp.exmail.qq.com";
- private static final Integer MAIL_SMTP_PORT = 587;
- private static final Boolean MAIL_SMTP_AUTH = true;
- private static final String MAIL_SMTP_USER = "robin@zhyea.com";
- private static final String MAIL_SMTP_PASSWORD = "robinzhyea";
- private static Properties props = new Properties();
- static {
- props.put("mail.smtp.host", MAIL_SMTP_HOST);
- props.put("mail.smtp.auth", MAIL_SMTP_AUTH);
- props.put("mail.smtp.user", MAIL_SMTP_USER);
- props.put("mail.smtp.password", MAIL_SMTP_PASSWORD);
- props.put("mail.smtp.starttls.enable", true);
- }
- /**
- * 发送邮件
- */
- public static void send(String to, String title, String content) {
- try {
- Session session = Session.getInstance(props); //创建邮件会话
- MimeMessage message = new MimeMessage(session); //由邮件会话新建一个消息对象
- message.setFrom(new InternetAddress(MAIL_SMTP_PASSWORD)); //设置发件人的地址
- message.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); //设置收件人,并设置其接收类型为TO
- //设置信件内容
- //message.setText(mailContent); //发送 纯文本 邮件 TODO
- message.setSubject(title); //设置标题
- message.setContent(content, "text/html;charset=gbk"); //发送HTML邮件,内容样式比较丰富
- message.setSentDate(new Date()); //设置发信时间
- message.saveChanges(); //存储邮件信息
- //发送邮件
- Transport transport = session.getTransport("smtp");
- transport.connect(MAIL_SMTP_USER, MAIL_SMTP_PASSWORD);
- transport.sendMessage(message, message.getAllRecipients()); //发送邮件,其中第二个参数是所有已设好的收件人地址
- transport.close();
- } catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
- package com.zhyea.zytools;
- import java.util.Date;
- import java.util.Properties;
- import javax.mail.Message;
- import javax.mail.Session;
- import javax.mail.Transport;
- import javax.mail.internet.InternetAddress;
- import javax.mail.internet.MimeMessage;
- public class MailSender {
- private static final String MAIL_SMTP_HOST = "smtp.exmail.qq.com";
- private static final Integer MAIL_SMTP_PORT = 587;
- private static final Boolean MAIL_SMTP_AUTH = true;
- private static final String MAIL_SMTP_USER = "robin@zhyea.com";
- private static final String MAIL_SMTP_PASSWORD = "robinzhyea";
- private static Properties props = new Properties();
- static {
- props.put("mail.smtp.host", MAIL_SMTP_HOST);
- props.put("mail.smtp.auth", MAIL_SMTP_AUTH);
- props.put("mail.smtp.user", MAIL_SMTP_USER);
- props.put("mail.smtp.password", MAIL_SMTP_PASSWORD);
- props.put("mail.smtp.starttls.enable", true);
- }
- /**
- * 发送邮件
- */
- public static void send(String to, String title, String content) {
- try {
- Session session = Session.getInstance(props); //创建邮件会话
- MimeMessage message = new MimeMessage(session); //由邮件会话新建一个消息对象
- message.setFrom(new InternetAddress(MAIL_SMTP_PASSWORD)); //设置发件人的地址
- message.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); //设置收件人,并设置其接收类型为TO
- //设置信件内容
- //message.setText(mailContent); //发送 纯文本 邮件 TODO
- message.setSubject(title); //设置标题
- message.setContent(content, "text/html;charset=gbk"); //发送HTML邮件,内容样式比较丰富
- message.setSentDate(new Date()); //设置发信时间
- message.saveChanges(); //存储邮件信息
- //发送邮件
- Transport transport = session.getTransport("smtp");
- transport.connect(MAIL_SMTP_USER, MAIL_SMTP_PASSWORD);
- transport.sendMessage(message, message.getAllRecipients()); //发送邮件,其中第二个参数是所有已设好的收件人地址
- transport.close();
- } catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
来源: http://www.phperz.com/article/17/1118/360193.html