用java发送电子邮件
我正在尝试使用Java发送电子邮件:
import java.util.*; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; public class SendEmail { public static void main(String [] args) { // Recipient's email ID needs to be mentioned. String to = "abcd@gmail.com"; // Sender's email ID needs to be mentioned String from = "web@gmail.com"; // Assuming you are sending email from localhost String host = "localhost"; // Get system properties Properties properties = System.getProperties(); // Setup mail server properties.setProperty("mail.smtp.host", host); // Get the default Session object. Session session = Session.getDefaultInstance(properties); try{ // Create a default MimeMessage object. MimeMessage message = new MimeMessage(session); // Set From: header field of the header. message.setFrom(new InternetAddress(from)); // Set To: header field of the header. message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); // Set Subject: header field message.setSubject("This is the Subject Line!"); // Now set the actual message message.setText("This is actual message"); // Send message Transport.send(message); System.out.println("Sent message successfully...."); }catch (MessagingException mex) { mex.printStackTrace(); } } }
我收到错误:
javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25; nested exception is:java.net.ConnectException: Connection refused: connect at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1706) at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:525)
此代码是否可以发送电子邮件?
以下代码适用于Google SMTP服务器。 您需要提供您的Google用户名和密码。
import com.sun.mail.smtp.SMTPTransport; import java.security.Security; import java.util.Date; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; /** * * @author doraemon */ public class GoogleMail { private GoogleMail() { } /** * Send email using GMail SMTP server. * * @param username GMail username * @param password GMail password * @param recipientEmail TO recipient * @param title title of the message * @param message message to be sent * @throws AddressException if the email address parse failed * @throws MessagingException if the connection is dead or not in the connected state or if the message is not a MimeMessage */ public static void Send(final String username, final String password, String recipientEmail, String title, String message) throws AddressException, MessagingException { GoogleMail.Send(username, password, recipientEmail, "", title, message); } /** * Send email using GMail SMTP server. * * @param username GMail username * @param password GMail password * @param recipientEmail TO recipient * @param ccEmail CC recipient. Can be empty if there is no CC recipient * @param title title of the message * @param message message to be sent * @throws AddressException if the email address parse failed * @throws MessagingException if the connection is dead or not in the connected state or if the message is not a MimeMessage */ public static void Send(final String username, final String password, String recipientEmail, String ccEmail, String title, String message) throws AddressException, MessagingException { Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory"; // Get a Properties object Properties props = System.getProperties(); props.setProperty("mail.smtps.host", "smtp.gmail.com"); props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY); props.setProperty("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.port", "465"); props.setProperty("mail.smtp.socketFactory.port", "465"); props.setProperty("mail.smtps.auth", "true"); /* If set to false, the QUIT command is sent and the connection is immediately closed. If set to true (the default), causes the transport to wait for the response to the QUIT command. ref : http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package-summary.html http://forum.java.sun.com/thread.jspa?threadID=5205249 smtpsend.java - demo program from javamail */ props.put("mail.smtps.quitwait", "false"); Session session = Session.getInstance(props, null); // -- Create a new message -- final MimeMessage msg = new MimeMessage(session); // -- Set the FROM and TO fields -- msg.setFrom(new InternetAddress(username + "@gmail.com")); msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientEmail, false)); if (ccEmail.length() > 0) { msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(ccEmail, false)); } msg.setSubject(title); msg.setText(message, "utf-8"); msg.setSentDate(new Date()); SMTPTransport t = (SMTPTransport)session.getTransport("smtps"); t.connect("smtp.gmail.com", username, password); t.sendMessage(msg, msg.getAllRecipients()); t.close(); } }
2015年12月11日更新
用户名+密码不再是推荐的解决scheme。 这是因为
我试过这个,Gmail在这段代码中发送了用作用户名的电子邮件,表示我们最近封锁了一个login尝试到您的Google帐户,然后指示我到这个支持页面:support.google.com/accounts/answer/6010255所以它看起来工作,被用来发送电子邮件帐户需要降低自己的安全
Google发布了Gmail API – https://developers.google.com/gmail/api/?hl=zh-CN 。 我们应该使用oAuth2方法,而不是用户名+密码。
以下是使用Gmail API的代码段。
GoogleMail.java
import com.google.api.client.util.Base64; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.Message; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Properties; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; /** * * @author doraemon */ public class GoogleMail { private GoogleMail() { } private static MimeMessage createEmail(String to, String cc, String from, String subject, String bodyText) throws MessagingException { Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); MimeMessage email = new MimeMessage(session); InternetAddress tAddress = new InternetAddress(to); InternetAddress cAddress = cc.isEmpty() ? null : new InternetAddress(cc); InternetAddress fAddress = new InternetAddress(from); email.setFrom(fAddress); if (cAddress != null) { email.addRecipient(javax.mail.Message.RecipientType.CC, cAddress); } email.addRecipient(javax.mail.Message.RecipientType.TO, tAddress); email.setSubject(subject); email.setText(bodyText); return email; } private static Message createMessageWithEmail(MimeMessage email) throws MessagingException, IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); email.writeTo(baos); String encodedEmail = Base64.encodeBase64URLSafeString(baos.toByteArray()); Message message = new Message(); message.setRaw(encodedEmail); return message; } public static void Send(Gmail service, String recipientEmail, String ccEmail, String fromEmail, String title, String message) throws IOException, MessagingException { Message m = createMessageWithEmail(createEmail(recipientEmail, ccEmail, fromEmail, title, message)); service.users().messages().send("me", m).execute(); } }
要通过oAuth2构build授权的Gmail服务,请参阅代码片段。
Utils.java
import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.HttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.GmailScopes; import com.google.api.services.oauth2.Oauth2; import com.google.api.services.oauth2.model.Userinfoplus; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.nio.file.Files; import java.nio.file.Paths; import java.security.GeneralSecurityException; import java.util.HashSet; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.yccheok.jstock.engine.Pair; /** * * @author yccheok */ public class Utils { /** Global instance of the JSON factory. */ private static final GsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); /** Global instance of the HTTP transport. */ private static HttpTransport httpTransport; private static final Log log = LogFactory.getLog(Utils.class); static { try { // initialize the transport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); } catch (IOException ex) { log.error(null, ex); } catch (GeneralSecurityException ex) { log.error(null, ex); } } private static File getGmailDataDirectory() { return new File(org.yccheok.jstock.gui.Utils.getUserDataDirectory() + "authentication" + File.separator + "gmail"); } /** * Send a request to the UserInfo API to retrieve the user's information. * * @param credentials OAuth 2.0 credentials to authorize the request. * @return User's information. * @throws java.io.IOException */ public static Userinfoplus getUserInfo(Credential credentials) throws IOException { Oauth2 userInfoService = new Oauth2.Builder(httpTransport, JSON_FACTORY, credentials).setApplicationName("JStock").build(); Userinfoplus userInfo = userInfoService.userinfo().get().execute(); return userInfo; } public static String loadEmail(File dataStoreDirectory) { File file = new File(dataStoreDirectory, "email"); try { return new String(Files.readAllBytes(Paths.get(file.toURI())), "UTF-8"); } catch (IOException ex) { log.error(null, ex); return null; } } public static boolean saveEmail(File dataStoreDirectory, String email) { File file = new File(dataStoreDirectory, "email"); try { //If the constructor throws an exception, the finally block will NOT execute BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")); try { writer.write(email); } finally { writer.close(); } return true; } catch (IOException ex){ log.error(null, ex); return false; } } public static void logoutGmail() { File credential = new File(getGmailDataDirectory(), "StoredCredential"); File email = new File(getGmailDataDirectory(), "email"); credential.delete(); email.delete(); } public static Pair<Pair<Credential, String>, Boolean> authorizeGmail() throws Exception { // Ask for only the permissions you need. Asking for more permissions will // reduce the number of users who finish the process for giving you access // to their accounts. It will also increase the amount of effort you will // have to spend explaining to users what you are doing with their data. // Here we are listing all of the available scopes. You should remove scopes // that you are not actually using. Set<String> scopes = new HashSet<>(); // We would like to display what email this credential associated to. scopes.add("email"); scopes.add(GmailScopes.GMAIL_SEND); // load client secrets GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(Utils.JSON_FACTORY, new InputStreamReader(Utils.class.getResourceAsStream("/assets/authentication/gmail/client_secrets.json"))); return authorize(clientSecrets, scopes, getGmailDataDirectory()); } /** Authorizes the installed application to access user's protected data. * @return * @throws java.lang.Exception */ private static Pair<Pair<Credential, String>, Boolean> authorize(GoogleClientSecrets clientSecrets, Set<String> scopes, File dataStoreDirectory) throws Exception { // Set up authorization code flow. GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( httpTransport, JSON_FACTORY, clientSecrets, scopes) .setDataStoreFactory(new FileDataStoreFactory(dataStoreDirectory)) .build(); // authorize return new MyAuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); } public static Gmail getGmail(Credential credential) { Gmail service = new Gmail.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName("JStock").build(); return service; } }
为了提供用户友好的oAuth2身份validation方式,我使用了JavaFX来显示以下input对话框
显示用户友好的oAuth2对话框的关键可以在MyAuthorizationCodeInstalledApp.java和SimpleSwingBrowser.java中find
以下代码为我工作。
import java.io.UnsupportedEncodingException; 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.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class SendMail { public static void main(String[] args) { final String username = "your_user_name@gmail.com"; final String password = "yourpassword"; Properties props = new Properties(); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.port", "587"); Session session = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); try { Message message = new MimeMessage(session); message.setFrom(new InternetAddress("your_user_name@gmail.com")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("to_email_address@domain.com")); message.setSubject("Testing Subject"); message.setText("Dear Mail Crawler," + "\n\n No spam to my email, please!"); Transport.send(message); System.out.println("Done"); } catch (MessagingException e) { throw new RuntimeException(e); } } }
import java.util.Date; import java.util.Properties; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class SendEmail extends Object{ public static void main(String [] args) { try{ Properties props = new Properties(); props.put("mail.smtp.host", "smtp.mail.yahoo.com"); // for gmail use smtp.gmail.com props.put("mail.smtp.auth", "true"); props.put("mail.debug", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.port", "465"); props.put("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.socketFactory.fallback", "false"); Session mailSession = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("username@yahoo.com", "password"); } }); mailSession.setDebug(true); // Enable the debug mode Message msg = new MimeMessage( mailSession ); //--[ Set the FROM, TO, DATE and SUBJECT fields msg.setFrom( new InternetAddress( "fromusername@yahoo.com" ) ); msg.setRecipients( Message.RecipientType.TO,InternetAddress.parse("tousername@gmail.com") ); msg.setSentDate( new Date()); msg.setSubject( "Hello World!" ); //--[ Create the body of the mail msg.setText( "Hello from my first e-mail sent with JavaMail" ); //--[ Ask the Transport class to send our mail message Transport.send( msg ); }catch(Exception E){ System.out.println( "Oops something has gone pearshaped!"); System.out.println( E ); } } }
必需的jar文件
- 的mail.jar
- 的activation.jar
- additionnal.jar
点击这里 – 如何添加外部jar子
简短的回答 – 不。
长答案 – 不,因为代码依赖于在本地计算机上运行的SMTP服务器的存在,并监听端口25. SMTP服务器(技术上说是MTA或邮件传输代理)负责与邮件用户代理(MUA,在这种情况下是Java进程)接收外发电子邮件。
现在,MTA通常负责接收来自特定域的用户的邮件。 因此,对于域gmail.com,它将是负责validation邮件用户代理的Google邮件服务器,并将邮件传输到GMail服务器上的收件箱。 我不确定GMail是否信任开放邮件中继服务器,但在Google上执行身份validation并将邮件转发到GMail服务器当然不是一件容易的事情。
如果您阅读关于使用JavaMail访问GMail的JavaMail FAQ ,您会注意到主机名和端口正好指向GMail服务器,当然不是指向本地主机。 如果您打算使用本地机器,则需要执行中继或转发。
如果您打算在任何地方获得SMTP,您可能需要深入了解SMTP协议。 您可以从关于SMTP的维基百科文章开始,但是任何进一步的进展都将实际上需要针对SMTP服务器进行编程。
这已经过了很长一段时间了。 但截至2012年11月13日,我可以validation端口465仍然有效。
请参阅GaryM在此论坛上的回答。 我希望这可以帮助更多的人。
/* * Created on Feb 21, 2005 * */ import java.security.Security; 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 GoogleTest { private static final String SMTP_HOST_NAME = "smtp.gmail.com"; private static final String SMTP_PORT = "465"; private static final String emailMsgTxt = "Test Message Contents"; private static final String emailSubjectTxt = "A test from gmail"; private static final String emailFromAddress = ""; private static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory"; private static final String[] sendTo = { ""}; public static void main(String args[]) throws Exception { Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); new GoogleTest().sendSSLMessage(sendTo, emailSubjectTxt, emailMsgTxt, emailFromAddress); System.out.println("Sucessfully mail to All Users"); } public void sendSSLMessage(String recipients[], String subject, String message, String from) throws MessagingException { boolean debug = true; Properties props = new Properties(); props.put("mail.smtp.hostTP_HOST_NAME); props.put("mail.smtp.authrue"); props.put("mail.debugrue"); props.put("mail.smtp.portTP_PORT); props.put("mail.smtp.socketFactory.portTP_PORT); props.put("mail.smtp.socketFactory.classL_FACTORY); props.put("mail.smtp.socketFactory.fallbackalse"); Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("xxxxxx", "xxxxxx"); } }); session.setDebug(debug); Message msg = new MimeMessage(session); InternetAddress addressFrom = new InternetAddress(from); msg.setFrom(addressFrom); InternetAddress[] addressTo = new InternetAddress[recipients.length]; for (int i = 0; i < recipients.length; i++) { addressTo = new InternetAddress(recipients); } msg.setRecipients(Message.RecipientType.TO, addressTo); // Setting the Subject and Content Type msg.setSubject(subject); msg.setContent(message, "text/plain"); Transport.send(msg); } }
你需要一个SMTP服务器来发送邮件。 有些服务器可以在您自己的电脑上本地安装,或者您可以使用许多在线服务器之一。 Google的其中一个更为人所知的服务器是:
我刚刚使用Simple Java Mail的第一个示例成功testing了允许的Google SMTPconfiguration :
final Email email = new Email(); email.setFromAddress("lollypop", "lol.pop@somemail.com"); email.addRecipient("C.Cane", "candycane@candyshop.org", RecipientType.TO); email.setText("We should meet up!"); email.setTextHTML("<b>We should meet up!</b>"); email.setSubject("hey"); new Mailer("smtp.gmail.com", 25, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email); new Mailer("smtp.gmail.com", 587, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email); new Mailer("smtp.gmail.com", 465, "your user", "your password", TransportStrategy.SMTP_SSL).sendMail(email);
注意各种港口和运输策略(为您处理所有必要的属性)。
奇怪的是,谷歌也需要端口25上的TLS,即使谷歌的说明另有说明 。
此代码是否可以发送电子邮件?
那么,不,不是没有改变一些部分,因为你得到一个错误。 您目前正在尝试通过在本地主机上运行的SMTP服务器发送邮件,但是您没有运行任何ConnectException
。
假设代码是好的(我没有真正检查),你将不得不运行本地SMTP服务器,或使用(远程)(从你的ISP)。
关于代码,您可以在常见问题中提到的JavaMail下载包中find示例:
我在哪里可以find一些示例程序,展示如何使用JavaMail?
问:我在哪里可以find一些示例程序来展示如何使用JavaMail?
答: JavaMail下载包中包含许多示例程序,包括简单的命令行程序,说明JavaMail API的各个方面,基于Swing的GUI应用程序,简单的基于Servlet的应用程序以及使用JSP页面的完整Web应用程序,以及一个标签库。
下面的代码工作得非常好。请尝试使用javamail-1.4.5.jar作为java应用程序
import javax.mail.*; import javax.mail.internet.*; import java.util.*; public class MailSender { final String senderEmailID = "typesendermailid@gmail.com"; final String senderPassword = "typesenderpassword"; final String emailSMTPserver = "smtp.gmail.com"; final String emailServerPort = "465"; String receiverEmailID = null; static String emailSubject = "Test Mail"; static String emailBody = ":)"; public MailSender(String receiverEmailID, String emailSubject, String emailBody) { this.receiverEmailID=receiverEmailID; this.emailSubject=emailSubject; this.emailBody=emailBody; Properties props = new Properties(); props.put("mail.smtp.user",senderEmailID); props.put("mail.smtp.host", emailSMTPserver); props.put("mail.smtp.port", emailServerPort); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.socketFactory.port", emailServerPort); props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.socketFactory.fallback", "false"); SecurityManager security = System.getSecurityManager(); try { Authenticator auth = new SMTPAuthenticator(); Session session = Session.getInstance(props, auth); MimeMessage msg = new MimeMessage(session); msg.setText(emailBody); msg.setSubject(emailSubject); msg.setFrom(new InternetAddress(senderEmailID)); msg.addRecipient(Message.RecipientType.TO, new InternetAddress(receiverEmailID)); Transport.send(msg); System.out.println("Message send Successfully:)"); } catch (Exception mex) { mex.printStackTrace(); } } public class SMTPAuthenticator extends javax.mail.Authenticator { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(senderEmailID, senderPassword); } } public static void main(String[] args) { MailSender mailSender=new MailSender("typereceivermailid@gmail.com",emailSubject,emailBody); } }
试试这个。 它适合我。 确保在发送电子邮件之前,您需要为您的Gmail帐户提供访问安全性较低的应用程序。 所以去下面的链接,并试用这个Java代码。
激活Gmail不太安全的应用程序
您需要将javax.mail.jar文件和activation.jar文件导入到您的项目中。
这是用java发送电子邮件的完整代码
import javax.mail.*; import javax.mail.internet.*; import java.util.*; public class SendEmail { final String senderEmail = "your email address"; final String senderPassword = "your password"; final String emailSMTPserver = "smtp.gmail.com"; final String emailServerPort = "587"; String receiverEmail = null; String emailSubject = null; String emailBody = null; public SendEmail(String receiverEmail, String Subject, String message) { this.receiverEmail = receiverEmail; this.emailSubject = Subject; this.emailBody = message; Properties props = new Properties(); props.put("mail.smtp.user", senderEmail); props.put("mail.smtp.host", emailSMTPserver); props.put("mail.smtp.port", emailServerPort); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.socketFactory.port", emailServerPort); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); SecurityManager security = System.getSecurityManager(); try { Authenticator auth = new SMTPAuthenticator(); Session session = Session.getInstance(props, auth); Message msg = new MimeMessage(session); msg.setText(emailBody); msg.setSubject(emailSubject); msg.setFrom(new InternetAddress(senderEmail)); msg.addRecipient(Message.RecipientType.TO, new InternetAddress(receiverEmail)); Transport.send(msg); System.out.println("send successfully"); } catch (Exception ex) { System.err.println("Error occurred while sending.!"); } } private class SMTPAuthenticator extends javax.mail.Authenticator { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(senderEmail, senderPassword); } } public static void main(String[] args) { SendEmail send = new SendEmail("receiver email address", "subject", "message"); } }
我已经将我的工作gmail Java类放在pastebin中供您审阅,请特别注意“startSessionWithTLS”方法,并且您可能会调整JavaMail以提供相同的function。 http://pastebin.com/VE8Mqkqp
除了设置与SMTP服务器的连接之外,您的代码也可以工作。 您需要一个正在运行的邮件(SMTP)服务器来向您发送电子邮件。
这是你修改的代码。 我注释了不需要的部分,并更改了会话创build,因此需要身份validation器。 现在只需找出您想使用的SMPT_HOSTNAME,USERNAME和PASSWORD(您的Internet提供商通常会提供这些)。
我总是这样做(使用我知道的远程SMTP服务器),因为在Windows下运行本地邮件服务器并不是那么简单(在Linux下显然是相当容易的)。
import java.util.*; import javax.mail.*; import javax.mail.internet.*; //import javax.activation.*; public class SendEmail { private static String SMPT_HOSTNAME = ""; private static String USERNAME = ""; private static String PASSWORD = ""; public static void main(String[] args) { // Recipient's email ID needs to be mentioned. String to = "abcd@gmail.com"; // Sender's email ID needs to be mentioned String from = "web@gmail.com"; // Assuming you are sending email from localhost // String host = "localhost"; // Get system properties Properties properties = System.getProperties(); // Setup mail server properties.setProperty("mail.smtp.host", SMPT_HOSTNAME); // Get the default Session object. // Session session = Session.getDefaultInstance(properties); // create a session with an Authenticator Session session = Session.getInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(USERNAME, PASSWORD); } }); try { // Create a default MimeMessage object. MimeMessage message = new MimeMessage(session); // Set From: header field of the header. message.setFrom(new InternetAddress(from)); // Set To: header field of the header. message.addRecipient(Message.RecipientType.TO, new InternetAddress( to)); // Set Subject: header field message.setSubject("This is the Subject Line!"); // Now set the actual message message.setText("This is actual message"); // Send message Transport.send(message); System.out.println("Sent message successfully...."); } catch (MessagingException mex) { mex.printStackTrace(); } } }
事实上,465的工作,你得到的例外,可能是由于未开放的SMTP端口25.默认情况下,端口号是25.但您可以使用可用作开源的邮件代理configuration它 – 水星
为了简单起见,只需使用下面的configuration,你会没事的。
// Setup your mail server props.put("mail.smtp.host", SMTP_HOST); props.put("mail.smtp.user",FROM_NAME); props.put("mail.smtp.ssl.enable", "true"); props.put("mail.smtp.port", "25"); props.put("mail.debug", "true"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable","true"); props.put("mail.smtp.EnableSSL.enable","true"); props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.port", "465"); props.setProperty("mail.smtp.socketFactory.port", "465");
为了更多:从头开始查看完整的工作示例
这里是工作解决scheme兄弟。 这是保证
1)首先打开你想发送邮件的gmail帐号,如“xyz@gmail.com”
2)在https://support.google.com/accounts/answer/6010255?hl=zh_CN打开此链接;
3)点击“我的帐户”中的“转到”安全性较低的应用“部分”。 选项
4)然后打开它
5)就是这样(:
这是我的代码
import javax.mail.*; import javax.mail.internet.*; import java.util.*; public class SendEmail { final String senderEmailID = "Sender Email id"; final String senderPassword = "Sender Pass word"; final String emailSMTPserver = "smtp.gmail.com"; final String emailServerPort = "465"; String receiverEmailID = null; static String emailSubject = "Test Mail"; static String emailBody = ":)"; public SendEmail(String receiverEmailID, String emailSubject, String emailBody) { this.receiverEmailID=receiverEmailID; this.emailSubject=emailSubject; this.emailBody=emailBody; Properties props = new Properties(); props.put("mail.smtp.user",senderEmailID); props.put("mail.smtp.host", emailSMTPserver); props.put("mail.smtp.port", emailServerPort); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.socketFactory.port", emailServerPort); props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.socketFactory.fallback", "false"); SecurityManager security = System.getSecurityManager(); try { Authenticator auth = new SMTPAuthenticator(); Session session = Session.getInstance(props, auth); MimeMessage msg = new MimeMessage(session); msg.setText(emailBody); msg.setSubject(emailSubject); msg.setFrom(new InternetAddress(senderEmailID)); msg.addRecipient(Message.RecipientType.TO, new InternetAddress(receiverEmailID)); Transport.send(msg); System.out.println("Message send Successfully:)"); } catch (Exception mex) { mex.printStackTrace(); } } public class SMTPAuthenticator extends javax.mail.Authenticator { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(senderEmailID, senderPassword); } } public static void main(String[] args) { SendEmail mailSender; mailSender = new SendEmail("Receiver Email id","Testing Code 2 example","Testing Code Body yess"); } }
你得到了同样的例外。 原因是没有启动和运行smpt服务器在您的机器(因为您的主机是本地主机)。 如果你使用Windows 7,它没有SMTP服务器。 所以你将不得不下载,安装和configuration与域和创buildaccounts.I使用hmailserver作为smtp服务器安装和configuration在我的本地机器。 https://www.hmailserver.com/download
你可以在这里find一个完整的,非常简单的java类用于发送电子邮件使用谷歌(Gmail)帐户,
使用Java和Google帐户发送电子邮件
它使用以下属性
Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.port", "587");