最近做的一个小的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();
                                    项目中使用了JavaMail发送邮件,在本地测试无任何问题,但是上传到阿里云服务器上就报错:
com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.qq.com, 25; timeout -1; 
原因:阿里云出于安全考虑默认禁用25端口导致发邮件失败
解决办法:
配置文件中(根据自己的情况设置):
#JavaMailSender
spring.mail.host=smtp.qq.com
spring.ma
                                    最近写了一个javamail通过smtp发送邮件的代码,在本机测试一切OK,当我放到服务器上的时候,报AuthenticationFailedException异常,验证我也加上去了,找了半天也没找出原因,请大家帮忙看看,下面是我的代码
[code="java"]
public class SendMailAgent {
  private MimeMessage mimeMsg;  //...
                                    啥意思呢,这儿取的是域名信息,而内网没有域名啊,而连接邮箱服务器的时候它要带上系统域名信息,才能返回连接信息,邮箱服务器通了以后要跟主机互通,可是我的linux服务器的只通内网,内网也不需要域名啊,域名把打通信息带跑偏了,一直报错。看源码感觉日志里面这EHLo host-10-211-72-238.openstackloca7有问题,就是不知道问题在哪,这就取到主机名称,调到邮箱服务器以后,服务器根据主机名称找回到发送主机。其他情况文章很多,可以找到,我这种情况独特全网没有描述,所以记录一下,可以交流。
                                    今天做一个发送邮件的功能,在本机(Windows)环境下可以成功发送邮件,但部署Linux服务器上后不能成功发送,也不提示错误。通过修改代码,将方法 Session.getDefaultInstance() 改为 Session.getInstance(),具体如下:public class SimpleMailSender {public SimpleMailSender() {}publ...
                                    javamail发送邮件成功 但是却接收不到邮件?我用java写了一个发送邮件的程序,提示发送成功,但是发送到的邮箱却收到不邮件?这是为什么packagecn.itcast;importjava.util.Properties;importjavax.mail.Address;importjavax.mail.Message;importjavax.mail.Session;import...
  JavaMail的使用本身并不难,网上有不少案例,简单易懂,而且有详细的中文注解。但是由于JavaMail的机制设置不够完善,特别是异常出错时的参考信息太少,给初学者造成了不少麻烦,而我就是其中之一。在此,把我遇到过得那些坑总结出来,以免大家重蹈覆辙,浪费时间。(注:后续还有遇到新的问题,我会持续更新到这里)
一、JavaMai...
                                    530 A secure connection is requiered(such as ssl)出现该错误的原因主要是邮箱为了保证安全,有了黑名单制度,通过网站发来了一些邮件(包括验证邮件会被认为不安全),所以直接拦截处理掉解决的办法:1、如果是接收邮箱,则添加白名单,将测试发送邮箱改为白名单。2、如果是发送邮箱,建议使用客户端授权码,这个授权码替代上面代码部分的passwd即可成功发送邮件。...
                                    java发送邮件时报错误信息:javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher