JAVA成鬼之JAVA MAIL

本文详细介绍如何使用JavaMail API通过QQ邮箱服务器发送简易、带附件及包含图片的富文本邮件,涵盖配置邮件服务器、身份验证、SSL加密、邮件内容构建等关键步骤。

show me your code

java mail +腾讯邮箱

简易邮件

public static void main(String[] args) throws GeneralSecurityException {
        Properties props = new Properties();

        // 开启debug调试
        props.setProperty("mail.debug", "true");
        // 发送服务器需要身份验证
        props.setProperty("mail.smtp.auth", "true");
        // 设置邮件服务器主机名
        props.setProperty("mail.host", "smtp.qq.com");
        // 发送邮件协议名称
        props.setProperty("mail.transport.protocol", "smtp");

        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        props.put("mail.smtp.ssl.enable", "true");
        // 使用ssl登录必需字段
        props.put("mail.smtp.ssl.socketFactory", sf);

        Session session = Session.getInstance(props);

        Message msg = new MimeMessage(session);
        try {
            msg.setSubject("主题");
            Transport transport = session.getTransport();
            
            // password 为授权码
            transport.connect("smtp.qq.com", "xxxx@qq.com", "password");
            
			// 邮件xxxx发给yyyy
            transport.sendMessage(msg, new Address[] { new InternetAddress("yyyyy@qq.com") });
            transport.close();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

带附件邮件

MimeMultipart 包裹附件MimeBodyPart

 public static void main(String[] args) throws GeneralSecurityException {
        Properties props = new Properties();

        // 开启debug调试
        props.setProperty("mail.debug", "true");
        // 发送服务器需要身份验证
        props.setProperty("mail.smtp.auth", "true");
        // 设置邮件服务器主机名
        props.setProperty("mail.host", "smtp.qq.com");
        // 发送邮件协议名称
        props.setProperty("mail.transport.protocol", "smtp");

        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        props.put("mail.smtp.ssl.enable", "true");
        props.put("mail.smtp.ssl.socketFactory", sf);

        Session session = Session.getInstance(props);

        Message msg = new MimeMessage(session);
        try {
            msg.setSubject("主题");
            msg.setText("test");
            msg.setFrom(new InternetAddress("xxxx@qq.com"));
            
            // 主内容
            MimeMultipart mm = new MimeMultipart();

            // 添加简易附件
            MimeBodyPart singleAttachment = new MimeBodyPart();
            // 读取本地文件
            DataHandler dh2 = new DataHandler(new FileDataSource("C:\\Users\\zorpz\\Desktop\\201901.png"));
            // 将附件数据添加到"节点"
            singleAttachment.setDataHandler(dh2);
            // 设置附件的文件名(需要编码)
            singleAttachment.setFileName(MimeUtility.encodeText(dh2.getName()));
			// 如果有多个附件,可以创建多个多次添加
            mm.addBodyPart(singleAttachment);     
            msg.setContent(mm);

            Transport transport = session.getTransport();
            transport.connect("smtp.qq.com", "xxxx@qq.com", "password");

            transport.sendMessage(msg, new Address[] { new InternetAddress("xxxx@qq.com") });
            transport.close();
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

    }
}

图文邮件(邮件正文包含图片)

把图片做附件上传并设置cid与正文关联

public static void main(String[] args) throws GeneralSecurityException {
        Properties props = new Properties();

        // 开启debug调试
        props.setProperty("mail.debug", "true");
        // 发送服务器需要身份验证
        props.setProperty("mail.smtp.auth", "true");
        // 设置邮件服务器主机名
        props.setProperty("mail.host", "smtp.qq.com");
        // 发送邮件协议名称
        props.setProperty("mail.transport.protocol", "smtp");

        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        props.put("mail.smtp.ssl.enable", "true");
        props.put("mail.smtp.ssl.socketFactory", sf);

        Session session = Session.getInstance(props);

        Message msg = new MimeMessage(session);
        try {
            msg.setSubject("主题");
            
            msg.setText("test");
            msg.setFrom(new InternetAddress("774797836@qq.com"));

            // 主内容
            MimeMultipart mm = new MimeMultipart();

           // 添加图文附件
            String path = "C:\\Users\\zorpz\\Desktop\\go.png";
            File file = new File(path);
            String strFileName = file.getName();
            MimeBodyPart mimebodypart = new MimeBodyPart();
            mimebodypart.setDataHandler(new DataHandler(new FileDataSource(
                    path)));
            mimebodypart.setFileName(MimeUtility.encodeText(strFileName));
            mimebodypart.setHeader("Content-ID", "test");

            mm.addBodyPart(mimebodypart);

            String content = "这是一张图片<br/><a href='http://www.baidu.com'><img src='cid:test'/></a>" ;
            MimeBodyPart mimebodypart1 = new MimeBodyPart();
            mimebodypart1.setDataHandler(new DataHandler(content,
                    "text/html;charset=GBK"));
            mm.addBodyPart(mimebodypart1);

            msg.setContent(mm);

            Transport transport = session.getTransport();
            transport.connect("smtp.qq.com", "xxxx@qq.com", "xxxxx");

            transport.sendMessage(msg, new Address[] { new InternetAddress("xxxx@qq.com") });
            transport.close();
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

    }
}
先展示下效果 https://pan.quark.cn/s/5061241daffd 在使用Apache HttpClient库发起HTTP请求的过程中,有可能遇到`HttpClient`返回`response`为`null`的现象,这通常暗示着请求未能功执行或部分资源未能得到妥善处理。 在本文中,我们将详细研究该问题的因以及应对策略。 我们需要掌握`HttpClient`的运作机制。 `HttpClient`是一个功能强大的Java库,用于发送HTTP请求并接收响应。 它提供了丰富的API,能够处理多种HTTP方法(例如GET、POST等),支持重试机制、连接池管理以及自定义请求头等特性。 然而,一旦`response`对象为`null`,可能涉及以下几种情形:1. **连接故障**:网络连接未功建立或在请求期间中断。 需要检查网络配置,确保服务器地址准确且可访问。 2. **超时配置**:若请求超时,`HttpClient`可能不会返回`response`。 应检查连接和读取超时设置,并根据实际需求进行适当调整。 3. **服务器故障**:服务器可能返回了错误状态码(如500内部服务器错误),`HttpClient`无法解析该响应。 建议查看服务器日志以获取更多详细信息。 4. **资源管理**:在某些情况下,如果请求的响应实体未被正确关闭,可能导致连接被提前释放,进而使后续的`response`对象为`null`。 在使用`HttpClient 3.x`版本时,必须手动调用`HttpMethod.releaseConnection()`来释放连接。 而在`HttpClient 4.x`及以上版本中,推荐采用`EntityUtils.consumeQuietly(respons...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值