最近做的一个小的Java web项目,想实现当有人访问某个页面时,自动给我发送一条邮件这个功能。于时了解到java.mail中有一些现成的方法来实现邮件的发送。
一开始在本机测试很容易便发送成功了。但是当部署到服务器后就出现了各种问题,报错或者完全没有反应。
这里总结了自己搜集的一些问题及解决方法,希望能帮助到大家。
我测试使用的是新浪邮箱,其他邮箱可能会有差异。
情况一:25端口未开放,可以尝试打开25端口。
情况二:在尝试打开25端口后,仍然无法正常发送,就在终端输入命令telnet smtp.sina.com 25
测试一下25端口到底有没有通。如果返回有Connected则表示25端口没问题。如果没有则25端口可能被服务器供应商默认禁用了。这时候可以去服务器管理端尝试打开此端口。
情况三:如果25端口无法使用,可以切换465端口,同样需要确保465端口是开放的。
情况四:在确保端口没问题后,仍无法正常发送邮件,则很有可能与java环境的版本有关。
例如报错:java.lang.ClassNotFoundException:javax.activation.DataHandler,找不到这个类。
这是因为在Java比较高级的版本中,去除了java.mail的依赖包 activation.jar,所以需要将依赖包与项目整合到一起。由于我使用的是Tomcat部署Javaweb项目,所以只需要将activation.jar包放到Tomcat的lib目录下就能正常运行了。
附上activation.jar包 下载地址
如果以上情况都无法解决你的问题,就自己看看报错代码,不管是发送超时还是什么原因,一般都会报错的,找到这个报错代码!
下面贴上我的实现代码。
public class MailUtil {
public static String account = "此处发送邮件的邮箱账号@sina.com";
public static String password = "该邮箱账号的密码";
public static String myEmailSMTPHost = "smtp.sina.com.cn";//注意按需配置
public MailUtil() {
}
public static void main(String[] args) {
System.out.println("开始发送");
sendMail("此处接收邮件的邮箱@qq.com");
System.out.println("结束发送");
}
public static void sendMail(String to) {
Properties props = new Properties();
props.put("mail.smtp.port", "465");//配置端口465
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.smtp.host", myEmailSMTPHost);
props.setProperty("mail.smtp.auth", "true");
Session session = Session.getInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(MailUtil.account, MailUtil.password);
}
});
MimeMessage message = new MimeMessage(session);
try {
message.setFrom(new InternetAddress(account));
} catch (MessagingException var9) {
var9.printStackTrace();
}
try {
message.setRecipient(RecipientType.TO, new InternetAddress(to));
} catch (MessagingException var8) {
var8.printStackTrace();
}
try {
message.setSubject("有访客到来");//发送内容的主题
} catch (MessagingException var7) {
var7.printStackTrace();
}
try {
message.setContent("<h1>有访客访问页面", "text/html;charset=UTF-8");//发送邮件的内容
} catch (MessagingException var6) {
var6.printStackTrace();
}
try {
Transport.send(message);
} catch (MessagingException var5) {
var5.printStackTrace();
}
}
}