我trying this example使用java发送电子邮件。
我需要知道代码在哪里使用属性文件的属性。 (如例所示)?并且,在代码中被引用的地方?
注意: 此外,我应该在属性文件中替换的值是什么,如果我要使用Google SMTP?
import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*;
/**
* Simple demonstration of using the javax.mail API.
*
* Run from the command line. Please edit the implementation
* to use correct email addresses and host name.
*/
public final class Emailer {
public static void main( String... aArguments ){
Emailer emailer = new Emailer();
//the domains of these email addresses should be valid,
//or the example will fail:
emailer.sendEmail(
"fromblah@blah.com", "toblah@blah.com",
"Testing 1-2-3", "blah blah blah"
);
}
/**
* Send a single email.
*/
public void sendEmail(
String aFromEmailAddr, String aToEmailAddr,
String aSubject, String aBody
){
//Here, no Authenticator argument is used (it is null).
//Authenticators are used to prompt the user for user
//name and password.
Session session = Session.getDefaultInstance( fMailServerConfig, null );
MimeMessage message = new MimeMessage( session );
try {
//the "from" address may be set in code, or set in the
//config file under "mail.from" ; here, the latter style is used
//message.setFrom( new InternetAddress(aFromEmailAddr) );
message.addRecipient(
Message.RecipientType.TO, new InternetAddress(aToEmailAddr)
);
message.setSubject( aSubject );
message.setText( aBody );
Transport.send( message );
}
catch (MessagingException ex){
System.err.println("Cannot send email. " + ex);
}
}
/**
* Allows the config to be refreshed at runtime, instead of
* requiring a restart.
*/
public static void refreshConfig() {
fMailServerConfig.clear();
fetchConfig();
}
// PRIVATE //
private static Properties fMailServerConfig = new Properties();
static {
fetchConfig();
}
/**
* Open a specific text file containing mail server
* parameters, and populate a corresponding Properties object.
*/
private static void fetchConfig() {
InputStream input = null;
try {
//If possible, one should try to avoid hard-coding a path in this
//manner; in a web application, one should place such a file in
//WEB-INF, and access it using ServletContext.getResourceAsStream.
//Another alternative is Class.getResourceAsStream.
//This file contains the javax.mail config properties mentioned above.
input = new FileInputStream( "C:\\Temp\\MyMailServer.txt" );
fMailServerConfig.load( input );
}
catch ( IOException ex ){
System.err.println("Cannot open and load mail server properties file.");
}
finally {
try {
if ( input != null ) input.close();
}
catch ( IOException ex ){
System.err.println( "Cannot close mail server properties file." );
}
}
}
}
答案 0 :(得分:0)
首次加载类时,static initializer block内的代码已执行。
static {
fetchConfig();
}
您会看到调用fetchConfig()
方法然后加载fMailServerConfig
属性。
private static Properties fMailServerConfig = new Properties();
private static void fetchConfig() {
// ...[omitted stuff]...
input = new FileInputStream( "C:\\Temp\\MyMailServer.txt" );
fMailServerConfig.load( input );
// ...[omitted stuff]...
}
请注意fetchConfig()
方法是static
- 它是从静态初始化程序调用的,所以它需要是静态的,因为还没有真正的类实例。此外,我们可能对所有实例使用相同的配置,因此不需要每个实例都有自己的配置。
另请注意,该方法为private
,因为我们不希望从其他任何位置调用该方法。
javax.mail
包将知道要使用的属性。即,mail.host
,mail.from
等(javax.mail documentation here)
关于使用Google Gmail for SMTP的说明
出于安全考虑,使用Google的SMTP服务器可能会有点棘手。谷歌如何知道你不仅仅是一些使用它们作为中继的垃圾邮件发送者?您可能需要先与他们进行身份验证 - 他们有example code for using Google Gmail APIs您可以阅读和使用,但这超出了我的javax.mail
内容。
答案 1 :(得分:0)
private static void fetchConfig() {
打开一个FileInputStream,将数据加载到fMailServerConfig
,定义为:
private static Properties fMailServerConfig = new Properties();
属性类负责阅读此内容。它使用以下代码生成一条消息:
Session session = Session.getDefaultInstance( fMailServerConfig, null );
MimeMessage message = new MimeMessage( session );
关于Properties
的细节,我不能说目的是什么。也许为该示例提供了更多代码。 Properties
是一个Java框架类吗?
答案 2 :(得分:0)
在 fetchConfig()中调整此行以加载您的设置:
input = new FileInputStream( "C:\\Temp\\MyMailServer.txt" );
对于第二个问题,请阅读此google configuration web page ...
这些方面的东西对我有用:
mail.transport.protocol = smtps
mail.smtp.starttls.enable = true
mail.smtps.port = 465
mail.smtps.host = smtp.gmail.com
mail.smtps.auth = true
答案 3 :(得分:0)
您可以在没有属性文件的情况下使用它。我的下面代码非常完美。使用它
只需调用此函数即可向客户端发送自动电子邮件。 参数“to”是您要向其发送电子邮件的电子邮件地址。
我通常在Maven项目中这样做。如果您正在使用maven项目,则导入以下依赖项。
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
要附加pdf,请参阅 https://www.tutorialspoint.com/java/java_sending_email.htm
private void sendMail(String to, String subject, String emailBody) throws MessagingException{
final String username = "youremail@gmail.com";
final String password = "emailPassword";
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");
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("shubham20.yeole@gmail.com"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
message.setSubject(subject);
message.setContent(emailBody, "text/html; charset=utf-8");
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}