当前位置: 首页 > news >正文

javax.mail 遇到501 mail from address must be same as authorization user 的問題

使用不同的兩個帳戶发送email时,第一个账户可以发送成功,但到第二个账户的时候就报出了501 mail from address must be same as authorization user的错误。

具体代码如下:
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class MailSend {
    private String host = "smtp.qq.com";
    /**
     * 发送邮件
     * @param receiver 接收人
     * @param title    标题
     * @param content  内容
     * @throws Exception
     */
    public void send(String receiver,String title,String content,String sendUser,String sendUserId,String sendPassword) throws Exception{
        try
        {         
            Properties props = new Properties(); // 获取系统环境
            Authenticator auth = new MailAutherticator(sendUserId,sendPassword); // 进行邮件服务器用户认证
            props.put("mail.smtp.host", host);
            props.put("mail.smtp.auth", "true");
            Session session = Session.getDefaultInstance(props, auth);
            MimeMessage message = new MimeMessage(session);// 设置session,和邮件服务器进行通讯。
            message.setSubject(title); // 设置邮件主题
            message.setText(content); // 设置邮件正文
            message.setSentDate(new Date()); // 设置邮件发送日期
            Address address = new InternetAddress(sendUser);
            message.setFrom(address); // 设置邮件发送者的地址
            message.reply(false);
            //处理多用户发送
            Address[] multipleAddress = null;
            String[] receivers = receiver.split(",");
            if(receivers.length>0){
             multipleAddress = new Address[receivers.length];
             for(int i=0;i<receivers.length;i++){
             String tmpReceiver = receivers[i].trim();
             Address toAddress = new InternetAddress(tmpReceiver);
             multipleAddress[i] = address;
             }
            }
            message.addRecipients(Message.RecipientType.TO, multipleAddress); //收件人
            Transport.send(message); // 发送邮件
            
        } catch (Exception ex){
            ex.printStackTrace();
            throw new Exception(ex.getMessage());
        }
    }
    

/**
 * 测试邮件
 * @param args
 */
public static void main(String[] args) {
MailSend sendMail = new MailSend();
try {
String receiver = "XXXXXX@qq.com" ;//多封邮件请用逗号隔开
String title = "主题-测试邮件";
String content = "邮件内容-测试邮件";

        String sendUser = "XXXXXX@qq.com";
        String sendPassword = "XXXXXX";
        String SendUserId = "XXXXXX";
                                 sendMail.send(receiver,title,content,sendUser,SendUserId,sendPassword);//发送邮件
System.out.println("发送成功!");
            
        sendUser = "XXXXXXXX@qq.com";
        sendPassword = "XXXXXXX";
        SendUserId = "XXXXXXXX";
/*运行到此处时就会报错,但前一个send不执行的话,此处就正常运行*/         sendMail.send(receiver,title,content,sendUser,SendUserId,sendPassword);//发送邮件
        System.out.println("发送成功!");
} catch (Exception e) {
e.printStackTrace();
}

}

Session session = Session.getDefaultInstance(props, auth);
以上改成
Session session = Session.getInstance(props, auth);
就可以了

何谓getDefaultInstance?
从处理流程中可以看出,首先是从缓存中查找是否有properties存在
如果存在,则加载默认的properties
如果不存在才加载用户自己定义的properties,
所以当一个应用为每个用户独立创建properties的时候,还是应该调用getInstance,
除非你希望有一个默认的properties让用户使用

问 题找到了,因为它会首先去内存和系统文件中去找properties,所以不管我在页面改几次数据,其实在后台中生成session时都和系统启动时的一 样,所以在MailUtil.sendTextMessage(mailSession,RptTaskMailConfig.Sender,
receiver,null,mail_subject,mail_content,"GB2312",null);时session里的sender和传入的sender不一致,因此出错,修改Session.getDefaultInstance(props, authentic);为Session.getInstance(props, authentic);后,可以正确发送修改帐号,密码等资料后的邮件.OK

最后再补充一下,session.getdefaultinstance和getinstance的区别 :

 如果想要同时使用两个帐号发送javamail,比如使用1@a.com发送1#邮件,使用2@a.com发送2#邮件,这时候,你就需要同时创建两个java.mail.Session对象。但是如果你仍然使用Session.getDefaultInstance创建session对象的话,你会发现,第二个username:2@a.com创建的session永远都和第一个一样,这是为什么呢?因为,getDefaultInstance是真正单例模式,而且,里面的username和password属性是final型的,无法更改。所以,你会发现两封email都是由1@a.com发出来的。所以这个时候你要使用javax.mail.Session.getInstance()方法来创建session对象。

相关文章:

javax.mail 遇到501 mail from address must be same as authorization user 的問題

使用不同的兩個帳戶发送email时&#xff0c;第一个账户可以发送成功&#xff0c;但到第二个账户的时候就报出了501 mail from address must be same as authorization user的错误。 具体代码如下&#xff1a; import java.util.Date; import java.util.List; import java.util.…...

【Python】网络编程

Socket Socket (简称 套接字)是进程之间通信一个工具&#xff0c;进程之间想要进行网络通信需要socket。Socket负责进程之间的网络数据传输&#xff0c;好比数据的搬运工。 客户端和服务端 2个进程之间通过Socket进行相互通讯&#xff0c;就必须有服务端和客户端 Socket服务…...

客户端开发常用框架

在Unity游戏开发中&#xff0c;客户端常用的框架包括以下几种&#xff1a; 1.Unity的网络框架&#xff1a;Unity自带了网络框架&#xff0c;包括Unity Networking、Unity Matchmaker和Unity Remote等。这些框架可以帮助我们进行游戏的联机对战、排行榜、跨平台等功能的设计和实…...

数据分析综述

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…...

区块链技术与应用 - 学习笔记2【密码学基础】

大家好&#xff0c;我是比特桃。本系列笔记只专注于探讨研究区块链技术原理&#xff0c;不做其他违反相关规定的讨论。 区块链技术已被纳入国家十四五规划&#xff0c;在“加快数字发展 建设数字中国”篇章中&#xff0c;区块链被列为“十四五”七大数字经济重点产业之一&#…...

制作Linux发行版安装镜像:复刻centos镜像安装ISO

制作Linux发行版安装镜像&#xff1a;复刻centos镜像安装ISO 我们平时经常下载Linux各个发行版&#xff0c;下载ISO&#xff0c;安装使用。那么ISO到底是如何制作的&#xff1f;安装过程是什么原理&#xff1f; 近来打算讲镜像制作的过程、原理&#xff0c;通过一个专栏分享一…...

【复习socket】每天40min,我们一起用70天稳扎稳打学完《JavaEE初阶》——29/70 第二十九天

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示:重难点★✔ 蓝色文字表示:思路以及想法★✔   如果大家觉得有帮助的话,感谢大家帮忙 点…...

postgresql-常用数学函数

postgresql-常用数学函数 案例 案例 --求余 1 select 5%2 as t; --绝对值 17.4 select abs(-17.4) as t2; -- 大于等于最小整数 -42 select ceil(-42.8) as t3; -- 小于等于的最大整数 42 select floor(42.3) as t4; -- 四舍五入 44 select round(43.6) as t5; -- 向零取整 12…...

Docker实战技巧(一):常用命令与最佳实践

一、原理   1、Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层&#xff0c;可允许多个操作系统和应用共享一套基础物理硬件&#xff0c;它能直接访问物理设备&#xff0c;会给每一台虚拟机分配内存、CPU、网络、磁盘等资源&#xff0c;也可以确保虚拟机对应的硬…...

使用CUDA计算GPU的理论显存带宽

文章目录 一、显存带宽和理论显存带宽1. 显存带宽2. 理论显存带宽1&#xff09;计算公式2&#xff09;举例 二、利用CUDA计算理论显存带宽 一、显存带宽和理论显存带宽 1. 显存带宽 显存带宽是指显存和GPU计算单元之间的数据传输速率。 显存带宽越大&#xff0c;意味着数据传…...

npm install依赖冲突解决办法

今天npm的时候发现报错&#xff0c;原来是依赖冲突了 npm后面加上这个指令就可以顺利的安装依赖了。问题主因就是不同开发用了不同版本node导致依赖版本不同&#xff0c;出现了成功冲突&#xff0c;这是段指令&#xff1b;它告诉npm忽略项目中引入的各个依赖模块之间依赖相同但…...

植物大战僵尸各种僵尸攻略

前言 此文章为“植物大战僵尸”专栏中的009刊&#xff08;2023年9月第八刊&#xff09;&#xff0c;欢迎订阅。版权所有。 注意&#xff1a; 1.本博客适用于pvz无名版&#xff1b; 2.pvz指植物大战僵尸&#xff08;Plants VS Zonbies)&#xff1b; 3.本文以耗费低做标准&am…...

Scrum敏捷开发企业实战培训

课程简介 Scrum是目前运用最为广泛的敏捷开发方法&#xff0c;是一个轻量级的项目管理和产品研发管理框架。 这是一个两天的实训课程&#xff0c;面向研发管理者、项目经理、产品经理、研发团队等&#xff0c;旨在帮助学员全面系统地学习Scrum和敏捷开发, 帮助企业快速启动敏…...

uniapp 下拉框数据回显的问题

问题 : 现在是下拉框数据回显不了, 绑定的v-model 原因 : uniui 下拉框数据绑定要是 value text 这种格式的 解决办法: 将获取到的后端数据 转换为 需要的格式 ,再进行绑定 下拉框的数据 遍历...

使用php 获取时间今天、明天、昨天时间戳的详解

使用php获取时间今、明天、昨天时间戳 <?php echo "今天:".date("Y-m-d").""; echo "昨天:".date("Y-m-d",strtotime("-1 day")), ""; echo "明天:".date("Y-m-d&qu…...

IIS解析漏洞复现

文章目录 漏洞复现总结 漏洞复现 打开虚拟机&#xff0c;在C:\inetpub\wwwroot\8000_test目录下放一个phpinfo.php文件&#xff1a; 在服务器管理器中打开IIS管理器&#xff0c;选择处理映射程序&#xff1a; 点击添加模块映射&#xff1a; 配置映射模板&#xff0c;php文件…...

生活随笔-吐槽篇

前言 &#x1f618;个人主页&#xff1a;曲终酣兴晚^R的小书屋&#x1f971; &#x1f615;作者介绍&#xff1a;一个莽莽撞撞的&#x1f43b; &#x1f496;专栏介绍&#xff1a;日常生活&往事回忆 &#x1f636;‍&#x1f32b;️每日金句&#xff1a;被人暖一下就高热&…...

vscode debug python launch.json添加args不起作用

问题 为了带入参数调试python 程序&#xff0c;按照网上搜到的教程配置了lauch.json文件&#xff0c;文件中添加了"args": [“model” “0” “path”] {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: h…...

信息化发展23

加密解密 1 、加密技术包括两个元素&#xff1a; 算法和密钥。 2 、发信者将明文数据加密成密文&#xff0c; 然后将密文数据送入网络传输或存入计算机文件&#xff0c; 而且只给合法收信者分配密钥。合法收信者接收到密文后&#xff0c; 实行与加密变换相逆的变换&#xff0c…...

FlinkCDC 菜鸟教程-文章目录

系列文章目录 背景篇 环境篇 准备一台已经安装了 Docker 的 Linux 或者 MacOS 电脑。准备教程所需要的组件版本对应关系安装环境检查 工具篇 flinkkibana 概念篇 Docker 介 绍Docker Compose 介 绍Kibana介 绍 实践篇 演示: Mysql CDC 导入 Elasticsearch 启动服务准备…...

从零开始-与大语言模型对话学技术-gradio篇(4)

前言 本文介绍「星火杯」认知大模型场景创新赛中的落选项目- AI命理分析系统&#xff0c;属于个人娱乐练手。总结提炼了往期文章精华并发掘出新的知识。 包括本地部署版本和Web在线版本&#xff0c;两种打包方式基于 半自动化使用.bat手动打包迁移python项目 如何把 Gradio …...

OpenCV项目实战(1)— 如何去截取视频中的帧

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。针对一段视频&#xff0c;如何去截取视频中的帧呢&#xff1f;本节课就给大家介绍两种方式&#xff0c;一种方式是按一定间隔来截取视频帧&#xff0c;另一种方式是截取视频的所有帧。希望大家学习之后能够有所收获&#x…...

「程序员必须掌握的算法」动态规划「上篇」

动态规划详解 动态规划 (Dynamic Programming) 是一种算法思想&#xff0c;用于解决一些复杂的问题。本文将介绍动态规划的分类、概念和经典例题讲解。 动态规划的分类 动态规划可以分为以下两种类型&#xff1a; 0/1背包问题&#xff1a;该问题是动态规划的一种基本类型。…...

什么是Linux

什么是Linux&#xff1f; 不知道大家是什么时候开始接触Linux&#xff0c;我记得我是大三的时候&#xff0c;那时候通过国嵌、韦东山的教学视频&#xff0c;跟着搭bootloader&#xff0c;修改内核&#xff0c;制作根文件系统&#xff0c;一步步&#xff0c;视频真的很简单&…...

学习笔记|定时器|STC中断|定时器时间计算|STC32G单片机视频开发教程(冲哥)|第十一集:定时器的作用和意义

文章目录 1.定时器的作用和意义定时器中断定时器是定时器和计数器的统称。 2.STC32G单片机定时器使用原理2.1 先设置功能为定时器/计数器(本质都是加法计数器)2.2、在定时器模式下&#xff0c;设置不分频或者12分频∶Tips&#xff1a;选择不分频还是12分频2.3、定时器的工作模式…...

第28节-PhotoShop基础课程-图层操作

文章目录 前言1.像素图层2.删除 Delete3.合并 Ctrl E4.盖印 Ctrl Shift Alt5.图层顺序-拖动就可以6.编组-Ctrl G 管理图层-分类存放7.锁定图层-背景图层8.不透明度9.查找图层 2.智能图层1.能保持图片放大缩小&#xff08;Ctrl T&#xff09;的时候不丢失分辨率2.和滤镜配合使…...

CGAL 闵可夫斯基和(Minkowski Sums)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 假设给定两个集合 A , B ∈ R d A,B∈R^d A,B...

Layui快速入门之第二节布局容器(固定宽度与完整宽度)

目录 一&#xff1a;固定宽度 二&#xff1a; 完整宽度 一&#xff1a;固定宽度 将栅格放入一个带有 class"layui-container" 的特定容器中&#xff0c;以便在小屏幕以上的设备中固定宽度&#xff0c;让列可控(两侧有留白效果) <!--固定宽度(两侧有留白效果)--&…...

异地容灾系统和数据仓库中数据同步的设计软件的功能模型

&#xff08; 1&#xff09;初始同步模块 该模块主要是在表进行初始同步时使用的&#xff1b;它能够根据实际需要生成物化视图 及其索引的创建语句&#xff0c;并完成表的初始同步。如果没有特别的要求&#xff0c;则调用普通初 始同步子模块进行目的端表的初始同步&#xff…...

分布式调度 Elastic-job

分布式调度 Elastic-job 1.概述 1.1什么是任务调度 我们可以思考一下下面业务场景的解决方案: 某电商平台需要每天上午10点&#xff0c;下午3点&#xff0c;晚上8点发放一批优惠券某银行系统需要在信用卡到期还款日的前三天进行短信提醒某财务系统需要在每天凌晨0:10分结算…...

网站购物车作用/手机网站建设平台

水仙花数&#xff08;Narcissistic number&#xff09;也被称为超完全数字不变数&#xff08;pluperfect digital invariant, PPDI&#xff09;、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数&#xff08;Armstrong number&#xff09;&#xff0c;水仙花数是指一个 n 位数&#…...

武汉品牌网站建设公司哪家好/seo全网优化指南

let arr [{a:1},{a:2},{a:3},{a:4},{a:5}];// 1.while循环 let sum 0; let num 1; while(num < 1){ if (num 5) { num; continue // containue必须写在后面,否则会进入死循环,因为在while中continue之后,是执行条件判断 // break // 支持break …...

网站运行时错误如何做/网站推广优化招聘

最近在接手elasticsearch 方面的工作&#xff0c;其中向已有的mapping添加新的字段的时候&#xff0c;一开始在网上找 资料&#xff0c;发现 网上 的资料都是关于更新mapping中已有字段类型的&#xff0c;所以写 一篇关于向 已有mapping添加新 字段的文章&#xff0c;仅供elast…...

湖北高端网站建设/浏览器直接进入网站的注意事项

Matplotlib subplot2grid()函数详解 matplotlib.pyplot 模块提供了 subplot2grid() &#xff0c;该函数能够在画布的特定位置创建 axes 对象&#xff08;即绘图区域&#xff09;。不仅如此&#xff0c;它还可以使用不同数量的行、列来创建跨度不同的绘图区域。与 subplot() 和…...

查找手机网站/代写文章

Python教程全套&#xff0c;现在分享给大家&#xff0c;入门到精通(Python全栈开发教程) 黑马程序员Python教程_600集Python从入门到精通教程 [小甲鱼]零基础入门学习Python 更多资料请关注公众号&#xff1a;计算机视觉与图形学实战 Python教程全套&#xff0c;现在分享给大…...

怎么查网站建设是哪家公司/宁波网络营销有哪些

本系列文章的目的是希望能够系统的将C#及面向对象开发的本质讲解给大家&#xff0c;也当是我自己的一次全面的总复习。 OK,你终于安装成功了.NET Framework&#xff0c;但是该如何开始呢? 那就让我们先从最简单的Hello World开始吧&#xff01; 可能你对Visual Studio软件还不…...