class com.sun.mail.smtp.SMTPAddressFailedException: 550 5.1.1 recipient is not exist

问题场景: 在一个系统的流程节点中 用户点击后发现查不到下一个流程节点,后台查看Linux日志,报SMTP的错误

class com.sun.mail.smtp.SMTPAddressFailedException: 550 5.1.1 recipient is not exist_第1张图片

错误原因: 由于流程走向下一个节点需要发送邮件,这个 500 5.1.1 报的是邮件地址不正确,并不存在该邮件地址,进而报发送错误。 

 

解决方案:

1、 必须查出哪个用户的邮件地址有问题,也就是必须过滤掉可用的邮件,用排除法,我这里的log日志有几百行的发送记录,如果直接找是搞不定的。

class com.sun.mail.smtp.SMTPAddressFailedException: 550 5.1.1 recipient is not exist_第2张图片

2、 我将其这几百行关于发送方法的记录copy出来,放在一个文本中,根据数据的特点,用IO进行过滤。

这里是我写的IO代码,File文件行处理即可。

public class GrepLine {

	public static void FileOperateTest() throws IOException {
		File dfile = new File("E:\\mailerror.txt");
		

		FileReader fr = new FileReader(dfile);
		BufferedReader br = new BufferedReader(fr);

		File writeFile = new File("E:\\writeFile\\" + dfile.getName());
		// 新建文件
		if (!writeFile.exists()) {
			writeFile.createNewFile();
		}

		FileWriter fw = new FileWriter(writeFile);
		BufferedWriter bw = new BufferedWriter(fw);
		int linenum = 0;
		String str = null;
		try {
			while ((str = br.readLine()) != null) {
				// 这里对每行数据进行操作
				if (str.length() > 15) {
					StringBuffer newStr = new StringBuffer();
					int i = 0;
					newStr.append("'");
					for (char c : str.toCharArray()) {
						i++;
						if (c == '@'){
							newStr.append("',");
							newStr.append(" \n ");
							break;
						}
						newStr.append(c);
						if (i > 15)
							break;
					}
					if (i < 15)
						str = newStr.toString();
					else
						str = "";
				} else
					str = "";
				bw.write(str);

				if (linenum++ == 100) {
					bw.flush();
					linenum = 0;
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			// 注意先关闭写入流 并且buffer缓存流必须最先关闭,不然就会报错,后再关闭读取流,记住先打开的后关闭
			if (bw != null)
				bw.close();
			if (fw != null)
				fw.close();

			if (fr != null)
				fr.close();
			if (br != null)
				br.close();
		}
	}

	public static void main(String[] args) {
		try {
			FileOperateTest();
			System.out.println("过滤成功!");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

这样执行发现,成功发送了用户是哪些

class com.sun.mail.smtp.SMTPAddressFailedException: 550 5.1.1 recipient is not exist_第3张图片

 然后在数据库中进行过滤,你肯定知道你这个SMTP邮件错误产生取的要发送的用户列表的,我这里是从流程历史表中取的

一过滤查找,用PLSQL进行过滤

SELECT FH.APPROVER_EMP, FH.Approver_Name_Eng
  FROM FLOW_HISTORY FH
 WHERE BASE_UID = '190700000578'
   AND FH.APPROVER_DEPT = '000000003000'
   AND FH.APPROVER_NAME_ENG NOT IN
       (SELECT S.ALTERNATE_NAME
          FROM USER_DETAILS S
         WHERE S.REAL_NAME IN
               ('tcheng', 'yhuang', 'lshuang', 'wye', 'ybai', 'yzhang4',
                'ttzhou', 'tfzhou', 'cftan', 'lhyan', 'yliu1', 'jliu3',
                'apren', 'dsliao', 'sqxie', 'zlyu', 'yxzhang', 'mxliu',
                'swang', 'ylniu', 'gccheng', 'xfzeng')))

查出最终有两个用户已离职,邮箱被注销,当在该系统中他的账户仍然还在启用,在业务中涉及到他们两个人就的邮件发送就出现该 BUG了。

其实这种在中小公司是很常见的,数千人的公司,人资系统将其员工注销了,当可能未与其他的业务系统对接,其他业务系统运行该员工相关信息导致出现错误。

你可能感兴趣的:(Java)