资讯专栏INFORMATION COLUMN

java通过smtp服务 给指定邮箱发送邮件含附件

mingzhong / 1848人阅读

摘要:其中部分第三方邮箱可以实现用自己的域名来接发邮件,例如本文中介绍的是第二种方法,用腾讯企业邮箱为例参考借鉴的大神的原文地址这里重点只说明一下,腾讯企业邮箱来实现发邮件,代码的部分。


用程序发邮件首先需要一个smtp服务器,

虽然说网上也有自建服务器的教程,但是由于工程量大,

还要兼容各大邮箱厂商,有可能发送失败或被归为垃圾邮件。

所以不推荐自建smtp服务器实现。

推荐是有2种方法来实现 第三方邮箱发邮件

1、买类似阿里云的smtp资源包(阿里云 1000条 / 2元)

2、申请一个腾讯、网易163的邮箱,开通smtp服务端口,借由他们的服务器来转发。

(其中部分第三方邮箱可以实现用自己的域名来接发邮件,例如service@baidu.com)

本文中介绍的是第二种方法,用腾讯企业邮箱为例

参考借鉴的大神的原文地址:https://www.cnblogs.com/LUA123/p/5575134.html

这里重点只说明一下,腾讯企业邮箱 + javamail 来实现发邮件,代码的部分。

其他邮箱,例如个人的qq邮箱 163邮箱也可以用这个方法实现,申请和设置方法借鉴百度吧

补充一下!腾讯企业邮箱和qq邮箱方法有几个不同,我在末尾加了qq邮箱的方案

正文开始

先说腾讯企业邮箱

maven


    javax.mail
    mail
    1.4.7

另外我用到了一个 StringUtils.isNotBlank() 方法 可以选择引入以下maven依赖,也可以改写成 xxx != null && !"".equals(xxx) 等价的代码


    org.apache.commons
    commons-lang3
    3.7

java 工具类

需要把 用户名、密码、发件人别名 等参数填成你自己申请的

package com.gemini.common.utils;
 
 
import com.sun.mail.util.MailSSLSocketFactory;
import org.apache.commons.lang.StringUtils;
 
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Properties;
 
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
 
public class EmailUtils {
 
    // 腾讯企业邮箱 也可以换成别家的
    private static final String protocol = "smtp";// 协议
    private static final String host = "smtp.exmail.qq.com";// 地址
    private static final String port = "465";// 端口
    private static final String account = "用户名";// 用户名
    private static final String pass = "密码";// 密码
    private static final String personal = "发件人别名(选填)";// 发件人别名,不需要设为空串或null
 
    // 权限认证
    static class MyAuthenricator extends Authenticator {
        String u = null;
        String p = null;
 
        public MyAuthenricator(String u, String p) {
            this.u = u;
            this.p = p;
        }
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(u, p);
        }
    }
 
    /**
     * 发送邮件工具方法
     *
     * @param recipients 收件人
     * @param subject    主题
     * @param content    内容
     * @param fileStr    附件路径
     * @return true/false 发送成功
     */
    public static boolean sendEmail(String recipients, String subject, String content, String fileStr) {
        Properties prop = new Properties();
        //协议
        prop.setProperty("mail.transport.protocol", protocol);
        //服务器
        prop.setProperty("mail.smtp.host", host);
        //端口
        prop.setProperty("mail.smtp.port", port);
        //使用smtp身份验证
        prop.setProperty("mail.smtp.auth", "true");
        //使用SSL,企业邮箱必需!
        //开启安全协议
        MailSSLSocketFactory mailSSLSocketFactory = null;
        try {
            mailSSLSocketFactory = new MailSSLSocketFactory();
            mailSSLSocketFactory.setTrustAllHosts(true);
        } catch (GeneralSecurityException e1) {
            e1.printStackTrace();
        }
        prop.put("mail.smtp.ssl.enable", "true");
        prop.put("mail.smtp.ssl.socketFactory", mailSSLSocketFactory);
 
        Session session = Session.getDefaultInstance(prop, new MyAuthenricator(account, pass));
        session.setDebug(true);
        MimeMessage mimeMessage = new MimeMessage(session);
        try {
            //发件人
            if (StringUtils.isNotBlank(personal))
                mimeMessage.setFrom(new InternetAddress(account, personal));//可以设置发件人的别名
            else
                mimeMessage.setFrom(new InternetAddress(account));//如果不需要就省略
            //收件人
            mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(recipients));
            //主题
            mimeMessage.setSubject(subject);
            //时间
            mimeMessage.setSentDate(new Date());
            //容器类,可以包含多个MimeBodyPart对象
            Multipart mp = new MimeMultipart();
 
            //MimeBodyPart可以包装文本,图片,附件
            MimeBodyPart body = new MimeBodyPart();
            //HTML正文
            body.setContent(content, "text/html; charset=UTF-8");
            mp.addBodyPart(body);
 
            //添加图片&附件
            if(StringUtils.isNotBlank(fileStr)){
                body = new MimeBodyPart();
                body.attachFile(fileStr);
                mp.addBodyPart(body);
            }
 
            //设置邮件内容
            mimeMessage.setContent(mp);
            //仅仅发送文本
            //mimeMessage.setText(content);
            mimeMessage.saveChanges();
            Transport.send(mimeMessage);
            // 发送成功
            return true;
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }
 
    public static void main(String[] args) {
        sendEmail("你的邮箱地址","test","test",null);
    }
}

关于上述方案,适用于一般的邮箱申请(腾讯企业邮箱、网易邮箱),但不适用于qq邮箱,原因是qq邮箱目前只接受授权码方案登录,官方的解释是“温馨提示:在第三方登录QQ邮箱,可能存在邮件泄露风险,甚至危害Apple ID安全,建议使用QQ邮箱手机版登录。 继续获取授权码登录第三方客户端邮箱 。”

使用上述方法登录qq邮箱会遇到报错

javax.mail.AuthenticationFailedException: 535 Error: ÇëʹÓÃÊÚȨÂëµÇ¼¡£ÏêÇéÇë¿´: http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256

如图

意思就是不支持直接用默认密码登录,必须去申请一个授权码作为密码登录

其实流程和工具类都一样就重点说 2个不一样的地方

1、密码不是你的邮箱密码了,而是授权码。

获取方式 [登录邮箱] - [设置] - [账户] ,然后如下图找到POP3/SMTP服务的下面,有一句温馨提示 先点 [生成授权码] ,再根据提示获取到授权码。

授权码就是javamail里的password

2、host不同

腾讯企业邮箱的host是

private static final String host = "smtp.exmail.qq.com";// 地址

普通qq邮箱的host是

private static final String host = "smtp.qq.com";// 地址

修改这两个地方即可适用于个人普通的qq邮箱

最终效果如下

另外本文也发布在了我的个人博客: https://zzzmh.cn/single?id=49

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73048.html

相关文章

  • 简单三步,用 Python 发邮件

    摘要:使用脚本发送邮件并不复杂。以下为思路导图模块与发送邮件相关的模块是关于简单邮件传输协议的操作模块,在发送邮件的过程中起到服务器之间互相通信的作用。 0. 前言 发送电子邮件是个很常见的开发需求。比如你写了个监控天气的脚本,发现第二天要下雨,或者网站上关注的某个商品降价了,就可以发个邮件到邮箱来提醒自己。 使用 Python 脚本发送邮件并不复杂。不过由于各家邮件的发送机制和安全策略不同...

    haobowd 评论0 收藏0
  • python发送邮件

    摘要:参数分别表示主机和端口。注意也可以在参数中指定端口号如,这样就没必要给出参数。当需要发送附件的时候使用的就是这个类的一个子类。主要用来发送图片普通文本邮件文本对象,其中是邮件内容,邮件类型,可以是普通文本邮件,邮件编码,可以是等等。 python发送邮件 准备 python中发送邮件主要用的是smtplib和email两个模块,下面主要对这两个模块进行讲解 在讲解之前需要准备至少两个...

    mengera88 评论0 收藏0
  • Spring Boot 2.x (十八):邮件服务一文打尽

    摘要:前景介绍在日常的工作中,我们经常会用到邮件服务,比如发送验证码,找回密码确认,注册时邮件验证等,所以今天在这里进行邮件服务的一些操作。 前景介绍 在日常的工作中,我们经常会用到邮件服务,比如发送验证码,找回密码确认,注册时邮件验证等,所以今天在这里进行邮件服务的一些操作。 大致思路 我们要做的其实就是把Java程序作为一个客户端,然后通过配置SMTP协议去连接我们所使用的发送邮箱(fr...

    idealcn 评论0 收藏0
  • 结合Spring发送邮件的四种正确姿势,你知道几种?

    摘要:我拿网易邮箱账号举例子,那么我们如何才能让你的邮箱账号可以利用第三方发送邮件这里的第三方就是我们即将编写的程序。 一 前言 测试所使用的环境 测试使用的环境是企业主流的SSM 框架即 SpringMVC+Spring+Mybatis。为了节省时间,我直接使用的是我上次的SSM项目中整合Echarts开发该项目已经搭建完成的SSM环境。 标题说的四种姿势指的是哪四种姿势? 发送text...

    doodlewind 评论0 收藏0
  • 利用Python自动发送邮件

    摘要:自动发送邮件我们把报表做出来以后一般都是需要发给别人查看,对于一些每天需要发的报表或者是需要一次发送多份的报表,这个时候可以考虑借助来自动发送邮件。一份邮件的组成下图是中发送一份邮件的界面,主要包含发件人收件人抄送人主题正文附件这几部分。 ...

    leo108 评论0 收藏0

发表评论

0条评论

mingzhong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<