使用 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@example.com";


// Sender's email ID needs to be mentioned
String from = "web@example.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)

这个代码可以用来发送电子邮件吗?

315476 次浏览

这个代码可以用来发送电子邮件吗?

Well, no, not without changing some parts since you're getting an error. You are currently trying to send mail via a SMTP server running on localhost but you aren't running any hence the ConnectException.

假设代码没问题(我没有真正检查) ,那么您必须运行本地 SMTP 服务器,或者使用(远程)服务器(来自您的 ISP)。

Regarding the code, you can find samples in the JavaMail download package as mentioned in the 常见问题:

我在哪里可以找到一些例子 显示如何使用 JavaMail

问: 我在哪里可以找到一些例子 显示如何使用 JavaMail?
有很多例子 包含在 JavaMail 中的程序 下载包
,包括简单的 命令行程序 JavaMailAPI 的各个方面,一个 基于 Swing 的 GUI 应用程序,一个简单的 servlet-based application, and a complete web application using JSP 页和标记库。

下面的代码可以很好地使用 GoogleSMTP 服务器。

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();
}
}

二零一五年十二月十一日最新情况

用户名 + 密码不再是推荐的解决方案

我尝试了这个,Gmail 发送了这个代码中用作用户名的电子邮件 我们最近屏蔽了一个试图登录你的谷歌的邮件 帐户,并指示我到这个支持页面: Support.google.com/accounts/answer/6010255所以它看起来很有效, 电子邮件帐户被用来发送需要减少自己 security

谷歌已经发布了 Gmail API-https://developers.google.com/gmail/api/?hl=en。我们应该使用 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构建授权的 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;
}
}

To provide a user friendly way of oAuth2 authentication, I made use of JavaFX, to display the following input dialog

enter image description here

我的授权代码安装程序SimpleSwingBrowser.java中可以找到显示用户友好的 oAuth2对话框的键

我已经把我的 gmail java 类放在 pastebin 上供你查看,特别注意“ startSessionWithTLS”方法,你可以调整 JavaMail 来提供相同的功能。http://pastebin.com/VE8Mqkqp

简短的回答是,不。

长的答案是否定的,因为代码依赖于在本地计算机上运行的 SMTP 服务器的存在,并且监听端口25。SMTP 服务器(技术上是 MTA 或邮件传输代理)负责与邮件用户代理(MUA,在本例中是 Java 进程)通信以接收发出的电子邮件。

现在,MTA 通常负责接收来自特定域的用户的邮件。因此,对于 GMail.com 域来说,Google 邮件服务器负责验证邮件用户代理,从而将邮件传输到 GMail 服务器上的收件箱。我不确定 GMail 是否信任开放邮件中继服务器,但是代表 Google 执行身份验证,然后将邮件中继到 GMail 服务器肯定不是一件容易的事情。

如果读取 使用 JavaMail 访问 GMail 的常见问题解答,您会注意到主机名和端口正好指向 GMail 服务器,当然不是本地主机。如果您打算使用本地计算机,则需要执行中继或转发。

如果您打算在 SMTP 方面取得任何进展,那么您可能需要深入了解 SMTP 协议。您可以从 Wikipedia article on SMTP开始,但是任何进一步的进展实际上都需要针对 SMTP 服务器进行编程。

除了设置与 SMTP 服务器的连接之外,您的代码可以正常工作。您需要一个正在运行的邮件(SMTP)服务器来为您发送电子邮件。

这是您修改过的代码。我注释掉了不需要的部分,并更改了 Session 的创建,因此它需要一个 Authenticator。现在只需找到您想要使用的 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@example.com";


// Sender's email ID needs to be mentioned
String from = "web@example.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();
}
}
}

这已经有一段时间没有发布了。但是截至2012年11月13日,我可以确认端口465仍然可以工作。

请参考 这个论坛上 GaryM 的答案。 I hope this helps few more people.

/*
* 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.host", SMTP_HOST_NAME);
props.put("mail.smtp.auth", "true");
props.put("mail.debug", "true");
props.put("mail.smtp.port", SMTP_PORT);
props.put("mail.smtp.socketFactory.port", SMTP_PORT);
props.put("mail.smtp.socketFactory.class", SSL_FACTORY);
props.put("mail.smtp.socketFactory.fallback", "false");


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[i] = 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);
}
}
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 文件

点击这里-如何添加外部罐

下面的代码对我很有用。 < br/> < br/>

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@example.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);
}
}
}

Indeed 465 works and the exception that you're getting is may be due to the un open SMTP port 25. By default the port number is 25. Yet you can configure it using the mail agent that is available as open source - 水银

为了简单起见,只需使用以下配置即可。

// 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");

要了解更多信息,请从头开始查看完整的工作示例 在这里

你可以在这里找到一个完整且非常简单的 Java 类,用于使用 Google (gmail)帐户发送电子邮件,

使用 java 和 Google 帐户发送电子邮件

It uses following properties

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");

You need a SMTP server for sending mails. There are servers you can install locally on your own pc, or you can use one of the many online servers. One of the more known servers is Google's:

我刚刚使用来自 简单 Java 邮件的第一个示例成功地测试了允许的 Google SMTP 配置:

    final Email email = EmailBuilder.startingBlank()
.from("lollypop", "lol.pop@example.com")
.to("C.Cane", "candycane@candyshop.org")
.withPlainText("We should meet up!")
.withHTMLText("<b>We should meet up!</b>")
.withSubject("hey");


// starting 5.0.0 do the following using the MailerBuilder instead...
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);

注意各种端口和传输策略(它们为您处理所有必需的属性)。

奇怪的是,Google 在端口25上也要求使用 TLS,尽管 Google 的指令是 我可不这么认为

下面的代码工作得非常好

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");
}


}

这是可行的解决方案,兄弟,我保证。

  1. 首先打开你想发送邮件的 gmail 帐户,就像你的 xyz@gmail.com一样
  2. 打开以下连结:

    Https://support.google.com/accounts/answer/6010255?hl=en

  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 服务器(因为您的主机是 localhost)。如果您使用的是 Windows7,那么它没有 SMTP 服务器。所以你必须下载,安装和配置域和创建帐户。我使用 hmailserver 作为 smtp 服务器安装和配置在我的本地机器。 Https://www.hmailserver.com/download