I am writing a standalone code for Sending mail from java. In this program I am taking all info by user on console . but here problem is with Authentication part.
I am passing user name and password which is actually mail id and passwrd of sender. but it is showing error that can.t refer to non final variable Password and From.
if I do it final then I can’t take it from user. Plz help me what should I do?
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);
}
}
}
Your help would be precious for me.
Thanks in advance.
So the thing about the
finalkeyword is that it makes your variables write-once/read-only. It also means that inner classes can reference them. What you should do is modify the code that reads the info as follows:Then remove the variable declarations in your anonymous
Authenticatorinstance. It will now be reading the final variables we just declared in the outer code block. Make sense?By the way, are you more accustomed to programming in C? It looks like what’s fouling you up is trying to have all your variables declared before starting in on your logic, but that’s not at all necessary in java. In fact, it often makes your code harder to read!