Ошибка java.io.FileNotFoundException при отправке электронного письма RPGLE/Java

Я разрабатываю класс, который использует javax.mail, который просто получает некоторые параметры из моей программы AS400 RPGLE и отправляет электронное письмо, содержащее Subject. , Основная часть и Вложение.

В параметрах я передаю путь сервера (пример: '\\192.0.0.100\docs\new') и имя (пример: File.pdf) файла, который будет присоединен, в данном случае это файл .pdf. Чтобы прочитать файл внутри сервера, я аутентифицируюсь с помощью SmbFile, передавая домен, пользователя и пароль.

Я тестировал код несколько раз, запуская его локально в своем затмении, вызывая метод из моего основного класса, передавая жестко закодированные параметры, и он успешно отправляет электронное письмо, проблема начинается, когда я развертываю свой класс в производстве, я получаю javax .mail.MessagingException: IOException при отправке сообщения; вложенное исключение: java.io.FileNotFoundException: \\192.0.0.100\docs\new\File.pdf (Файл или каталог с таким именем не существует.).

Интересно то, что ошибка возникает, когда программа вызывает Transport.send(message);, перед отправкой письма я поставил if(sFileReader.exists()), и он не выдает ошибки.

Я также разместил несколько журналов для отслеживания значений, передаваемых через переменные, и все они правильные, точно такие же, как те, которые я использовал для своих локальных тестов. Пробовал также в производстве отправить электронное письмо без вложений, и это работает.

У вас есть идеи? Большое спасибо.

Ниже пример моего кода и того, как я вызывал свой метод локально:

public static void main(String[] args) throws Exception {
        
        sendEmail("192.0.0.100", "100", "user", "pwd", "[email protected]", 
                    "[email protected]", "Subject", "Body", "smb://192.0.0.100/doc/new/", "File.PDF",
                    "domain", "user", "pwd");
}

public static void sendEmail(String server_ip, String server_port, final String username_mail, final String password_mail, String EMAIL_FROM, String list_emails, String subject, String body, String attachment_path, String attachment_name, String domain_attach, String user_attach, String password_attach) throws AddressException, MessagingException {
        
            Session session = null;
            Properties properties = null;
            MimeMessage message = null;
            MimeBodyPart attachmentBodyPart = null, textBodyPart = null;
            Multipart multipart = null;
            NtlmPasswordAuthentication auth_attach = null;
            SmbFile sPathReader = null, sFileReader = null;
            DataSource source = null;
        
            properties = System.getProperties();  
            properties.setProperty("mail.smtp.host", server_ip);
            properties.put("mail.smtp.port", server_port);
        
            if(username_mail != "" && password_mail != "") {
                Authenticator auth = new Authenticator() {
                    public PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(username_mail, password_mail);
                    }
                };
                session = Session.getInstance(properties, auth);
            }else {
                session = Session.getDefaultInstance(properties);  
            }
            
            try {               
                
                // Authenticate to the server
                auth_attach = new NtlmPasswordAuthentication(domain_attach, user_attach, password_attach);
                sPathReader = new SmbFile(attachment_path, auth_attach);
                sFileReader = new SmbFile(sPathReader, attachment_name);
                
                if(sFileReader.exists()) {
                    message = new MimeMessage(session);  
                    message.setFrom(new InternetAddress(EMAIL_FROM));
                    
                    message.addRecipient(Message.RecipientType.TO,
                            new InternetAddress(list_emails)); 
                    
                    message.setSubject(subject); 
                    
                    textBodyPart = new MimeBodyPart();
                    
                    textBodyPart.setText(body);
                    
                    attachmentBodyPart = new MimeBodyPart();
                    multipart = new MimeMultipart();                
                    source = new FileDataSource(sFileReader.getUncPath());
                    
                    attachmentBodyPart.setDataHandler(new DataHandler(source));
                    attachmentBodyPart.setFileName(attachment_name);
                    
                    multipart.addBodyPart(textBodyPart);
                    multipart.addBodyPart(attachmentBodyPart);

                    message.setContent(multipart);
                    
             
                    // Send message  
                    Transport.send(message);
                }
                
            } catch (Exception e) {
                e.printStackTrace();
            }
            
}

person Henrique    schedule 08.10.2020    source источник


Ответы (1)


Я обнаружил проблему, моя программа работает правильно для тех, которым нужно получить файл с сервера в Windows, но в моем случае я вызывал свой класс из AS400 с помощью программы RPGLE, и у него другой способ доступа внешние URL-адреса, в пути требуется /QNTC/, например, /QNTC/192.0.0.100/docs/test.pdf, аутентификация в Java не требуется, это сделает IBM, поэтому в этом случае простая строка, содержащая Нужен URL.

У IBM есть хорошая документация по этому поводу, как настроить под IFS пути QNTC.

Я надеюсь, что это поможет кому-то.

person Henrique    schedule 09.10.2020