не может ссылаться на не окончательную переменную пароля - PullRequest
0 голосов
/ 21 июля 2011

Я пишу автономный код для отправки почты из Java.В этой программе я принимаю всю информацию от пользователя на консоли.но здесь проблема с аутентификационной частью.Я передаю имя пользователя и пароль, которые на самом деле являются почтовым идентификатором и паролем отправителя.но он показывает ошибку, которая не может ссылаться на не финальную переменную Password и From.

, если я сделаю это final, то я не смогу получить ее от пользователяПожалуйста, помогите мне, что мне делать?

package mypackage;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendMailSSL {
    public static void main(String[] args) throws IOException {
        Properties props = new Properties();
        String host="";
        String port="";
        String s_port="";
        String to ="";
        final String from="";
        final String password="";
        String subject="";
        String context="";
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("CONFIGURATION.... ");
        System.out.println("mail.smtp.host=");
        host = in.readLine();
        System.out.println("mail.smtp.socketfactoryport=");
        s_port=in.readLine();
        props.put("mail.smtp.host", host);
        props.put("mail.debug", "true");
        props.put("mail.smtp.socketFactory.port", s_port);
        props.put("mail.smtp.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        System.out.println("mail.smtp.port=");
        port=in.readLine();
        props.put("mail.smtp.port", port);

        System.out.println("AUTHENTICATION....");
        System.out.println("Username=");
        from=in.readLine();
        System.out.println("Password=");
        password = in.readLine();
        Session session = Session.getDefaultInstance(props,
            new javax.mail.Authenticator()
        {
                String from = "";
                String password="";
                protected PasswordAuthentication getPasswordAuthentication()
                {
                    return new PasswordAuthentication(from,password);
                }
            });

        try {
            System.out.println("Mail Sending Process..");
            System.out.println("To=");
            to=in.readLine();

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse(to));
            System.out.println("Subject=");
            subject=in.readLine();
            message.setSubject(subject);
            System.out.println("Context=");
            context = in.readLine();
            message.setText(context);

            Transport.send(message);
            Transport.send(message);

            System.out.println("Done");

        } catch (MessagingException e) {
            System.out.println("in catch blk");
            throw new RuntimeException(e);
        }
    }
}

Ваша помощь будет очень полезна для меня.Заранее спасибо.

1 Ответ

0 голосов
/ 21 июля 2011

Итак, ключевое слово final заключается в том, что оно делает ваши переменные доступными только для записи / только для чтения.Это также означает, что внутренние классы могут ссылаться на них.Вам следует изменить код, который читает информацию, следующим образом:

System.out.println("AUTHENTICATION....");
System.out.println("Username=");
final String from = in.readLine();
System.out.println("Password=");
final String password = in.readLine();

Затем удалите объявления переменных в своем анонимном экземпляре Authenticator.Теперь он будет читать последние переменные, которые мы только что объявили во внешнем блоке кода.Имеет смысл?

Кстати, ты больше привык к программированию на C?Похоже, что то, что вас обескураживает, пытается объявить все ваши переменные перед началом работы с вашей логикой, но в Java это совсем не обязательно.Фактически, это часто затрудняет чтение вашего кода!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...