如何用Java发送电子邮件?

时间:2022-02-25 18:15:34

I need to send e-mails from a servlet running within Tomcat. I'll always send to the same recipient with the same subject, but with different contents.

我需要从Tomcat中运行的servlet发送电子邮件。我总是会向同一个收件人发送相同的主题,但内容不同。

What's a simple, easy way to send an e-mail in Java?

用Java发送电子邮件的简单方法是什么?

Related:

How do you send email from a Java app using GMail?

如何使用GMail从Java应用程序发送电子邮件?

9 个解决方案

#1


29  

Here's my code for doing that:

这是我的代码:

import javax.mail.*;
import javax.mail.internet.*;

// Set up the SMTP server.
java.util.Properties props = new java.util.Properties();
props.put("mail.smtp.host", "smtp.myisp.com");
Session session = Session.getDefaultInstance(props, null);

// Construct the message
String to = "you@you.com";
String from = "me@me.com";
String subject = "Hello";
Message msg = new MimeMessage(session);
try {
    msg.setFrom(new InternetAddress(from));
    msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
    msg.setSubject(subject);
    msg.setText("Hi,\n\nHow are you?");

    // Send the message.
    Transport.send(msg);
} catch (MessagingException e) {
    // Error.
}

You can get the JavaMail libraries from Sun here: http://java.sun.com/products/javamail/

您可以从Sun获取JavaMail库:http://java.sun.com/products/javamail/

#2


23  

JavaMail can be a bit of a pain to use. If you want a simpler, cleaner, solution then have a look at the Spring wrapper for JavaMail. The reference docs are here:

使用JavaMail可能有点痛苦。如果您想要一个更简单,更清洁的解决方案,那么请查看Java包的Spring包装器。参考文档在这里:

http://static.springframework.org/spring/docs/2.5.x/reference/mail.html

However, this does mean you need Spring in your application, if that isn't an option then you could look at another opensource wrapper such as simple-java-mail:

但是,这确实意味着您需要在应用程序中使用Spring,如果这不是一个选项,那么您可以查看另一个开源包装器,例如simple-java-mail:

simplejavamail.org

Alternatively, you can use JavaMail directly, but the two solutions above are easier and cleaner ways to send email in Java.

或者,您可以直接使用JavaMail,但上面的两个解决方案是使用Java发送电子邮件的更简单,更简洁的方法。

#3


18  

Yet another option that wraps the Java Mail API is Apache's commons-email.

包装Java Mail API的另一个选项是Apache的commons-email。

From their User Guide.

来自他们的用户指南。

SimpleEmail email = new SimpleEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("Test message");
email.setMsg("This is a simple test of commons-email");
email.send();

#4


9  

To followup on jon's reply, here's an example of sending a mail using simple-java-mail.

要跟进jon的回复,这是一个使用简单java邮件发送邮件的示例。

The idea is that you don't need to know about all the technical (nested) parts that make up an email. In that sense it's a lot like Apache's commons-email, except that Simple Java Mail is a little bit more straightforward than Apache's mailing API when dealing with attachments and embedded images. Spring's mailing facility works as well but is a bit awkward in use (for example it requires an anonymous innerclass) and ofcourse you need to a dependency on Spring which gets you much more than just a simple mailing library, since it its base it was designed to be an IOC solution.

这个想法是你不需要知道构成电子邮件的所有技术(嵌套)部分。从这个意义上来说,它很像Apache的commons-email,除了在处理附件和嵌入式图像时,Simple Java Mail比Apache的邮件API更简单。 Spring的邮件工具也可以使用,但在使用时有点笨拙(例如它需要一个匿名的内部类),当然你需要依赖Spring,它不仅仅是一个简单的邮件库,因为它是它的基础设计成为IOC解决方案。

Simple Java Mail btw is a wrapper around the JavaMail API.

简单的Java Mail btw是JavaMail API的包装器。

final Email email = new Email();

email.setFromAddress("lollypop", "lolly.pop@somemail.com"); 
email.setSubject("hey");
email.addRecipient("C. Cane", "candycane@candyshop.org", RecipientType.TO);
email.addRecipient("C. Bo", "chocobo@candyshop.org", RecipientType.BCC); 
email.setText("We should meet up! ;)"); 
email.setTextHTML("<img src='cid:wink1'><b>We should meet up!</b><img src='cid:wink2'>");

// embed images and include downloadable attachments 
email.addEmbeddedImage("wink1", imageByteArray, "image/png");
email.addEmbeddedImage("wink2", imageDatesource); 
email.addAttachment("invitation", pdfByteArray, "application/pdf");
email.addAttachment("dresscode", odfDatasource);

new Mailer("smtp.host.com", 25, "username", "password").sendMail(email);
// or alternatively, pass in your own traditional MailSession object.
new Mailer(preconfiguredMailSession).sendMail(email);

#5


5  

I usually define my javamail session in the GlobalNamingResources section of tomcat's server.xml file so that my code does not depend on the configuration parameters:

我通常在tomcat的server.xml文件的GlobalNamingResources部分中定义我的javamail会话,这样我的代码就不依赖于配置参数:

<GlobalNamingResources>
    <Resource name="mail/Mail" auth="Container" type="javax.mail.Session"
              mail.smtp.host="localhost"/>
    ...
</GlobalNamingResources>

and I get the session via JNDI:

我通过JNDI得到了会话:

    Context context = new InitialContext();
    Session sess = (Session) context.lookup("java:comp/env/mail/Mail");

    MimeMessage message = new MimeMessage(sess);
    message.setFrom(new InternetAddress(from));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
    message.setSubject(subject, "UTF-8");
    message.setText(content, "UTF-8");
    Transport.send(message);

#6


3  

JavaMail is great if you can rely on an outside SMTP server. If, however, you have to be your own SMTP server, then take a look at Asprin.

如果您可以依赖外部SMTP服务器,那么JavaMail非常棒。但是,如果您必须是自己的SMTP服务器,请查看Asprin。

#7


1  

use the Java Mail library

使用Java Mail库

import javax.mail.*

...

Session mSession = Session.getDefaultInstance(new Properties());
Transport mTransport = null;
mTransport = mSession.getTransport("smtp");
mTransport.connect(cServer, cUser, cPass);
MimeMessage mMessage = new MimeMessage(mSession);
mTransport.sendMessage(mMessage,  mMessage.getAllRecipients());
mTransport.close();

This is a truncated version of the code I use to have an application send emails. Obviously, putting a body and recipients in the message before sending it is probably going to suit you better.

这是我用来让应用程序发送电子邮件的代码的截断版本。显然,在发送邮件之前将正文和收件人放在邮件中可能更适合您。

The maven repository location is artifactId: javax.mail, groupId: mail.

maven存储库位置是artifactId:javax.mail,groupId:mail。

#8


1  

Add java.mail jar into your class path if it is non maven project Add the below dependency into your pom.xml execute the code

如果java.mail jar是非maven项目,则将java.mail jar添加到您的类路径中。将以下依赖项添加到您的pom.xml中执行代码

 <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4</version>
    </dependency>

Below is the tested code

以下是经过测试的代码

import java.util.Date;
    import java.util.Properties;

    import javax.mail.Authenticator;
    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 MailSendingDemo {
        static Properties properties = new Properties();
        static {
            properties.put("mail.smtp.host", "smtp.gmail.com");
            properties.put("mail.smtp.port", "587");
            properties.put("mail.smtp.auth", "true");
            properties.put("mail.smtp.starttls.enable", "true");
        }
        public static void main(String[] args) {
            String returnStatement = null;
            try {
                Authenticator auth = new Authenticator() {
                    public PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication("yourEmailId", "password");
                    }
                };
                Session session = Session.getInstance(properties, auth);
                Message message = new MimeMessage(session);
                message.setFrom(new InternetAddress("yourEmailId"));            
                message.setRecipient(Message.RecipientType.TO, new InternetAddress("recepeientMailId"));
                message.setSentDate(new Date());
                message.setSubject("Test Mail");
                message.setText("Hi");
                returnStatement = "The e-mail was sent successfully";
                System.out.println(returnStatement);    
                Transport.send(message);
            } catch (Exception e) {
                returnStatement = "error in sending mail";
                e.printStackTrace();
            }
        }
    }

#9


-1  

Here is the simple Solution

这是简单的解决方案

Download these jars: 1. Javamail 2. smtp 3. Java.mail

下载这些jar:1。Javamail 2. smtp 3. Java.mail

Copy and paste the below code from [http://javapapers.com/core-java/java-email/][1]

从[http://javapapers.com/core-java/java-email/][1]复制并粘贴以下代码

Edit the ToEmail, Username and Password (Gmail User ID and Pwd)

编辑ToEmail,用户名和密码(Gmail用户ID和密码)

#1


29  

Here's my code for doing that:

这是我的代码:

import javax.mail.*;
import javax.mail.internet.*;

// Set up the SMTP server.
java.util.Properties props = new java.util.Properties();
props.put("mail.smtp.host", "smtp.myisp.com");
Session session = Session.getDefaultInstance(props, null);

// Construct the message
String to = "you@you.com";
String from = "me@me.com";
String subject = "Hello";
Message msg = new MimeMessage(session);
try {
    msg.setFrom(new InternetAddress(from));
    msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
    msg.setSubject(subject);
    msg.setText("Hi,\n\nHow are you?");

    // Send the message.
    Transport.send(msg);
} catch (MessagingException e) {
    // Error.
}

You can get the JavaMail libraries from Sun here: http://java.sun.com/products/javamail/

您可以从Sun获取JavaMail库:http://java.sun.com/products/javamail/

#2


23  

JavaMail can be a bit of a pain to use. If you want a simpler, cleaner, solution then have a look at the Spring wrapper for JavaMail. The reference docs are here:

使用JavaMail可能有点痛苦。如果您想要一个更简单,更清洁的解决方案,那么请查看Java包的Spring包装器。参考文档在这里:

http://static.springframework.org/spring/docs/2.5.x/reference/mail.html

However, this does mean you need Spring in your application, if that isn't an option then you could look at another opensource wrapper such as simple-java-mail:

但是,这确实意味着您需要在应用程序中使用Spring,如果这不是一个选项,那么您可以查看另一个开源包装器,例如simple-java-mail:

simplejavamail.org

Alternatively, you can use JavaMail directly, but the two solutions above are easier and cleaner ways to send email in Java.

或者,您可以直接使用JavaMail,但上面的两个解决方案是使用Java发送电子邮件的更简单,更简洁的方法。

#3


18  

Yet another option that wraps the Java Mail API is Apache's commons-email.

包装Java Mail API的另一个选项是Apache的commons-email。

From their User Guide.

来自他们的用户指南。

SimpleEmail email = new SimpleEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("Test message");
email.setMsg("This is a simple test of commons-email");
email.send();

#4


9  

To followup on jon's reply, here's an example of sending a mail using simple-java-mail.

要跟进jon的回复,这是一个使用简单java邮件发送邮件的示例。

The idea is that you don't need to know about all the technical (nested) parts that make up an email. In that sense it's a lot like Apache's commons-email, except that Simple Java Mail is a little bit more straightforward than Apache's mailing API when dealing with attachments and embedded images. Spring's mailing facility works as well but is a bit awkward in use (for example it requires an anonymous innerclass) and ofcourse you need to a dependency on Spring which gets you much more than just a simple mailing library, since it its base it was designed to be an IOC solution.

这个想法是你不需要知道构成电子邮件的所有技术(嵌套)部分。从这个意义上来说,它很像Apache的commons-email,除了在处理附件和嵌入式图像时,Simple Java Mail比Apache的邮件API更简单。 Spring的邮件工具也可以使用,但在使用时有点笨拙(例如它需要一个匿名的内部类),当然你需要依赖Spring,它不仅仅是一个简单的邮件库,因为它是它的基础设计成为IOC解决方案。

Simple Java Mail btw is a wrapper around the JavaMail API.

简单的Java Mail btw是JavaMail API的包装器。

final Email email = new Email();

email.setFromAddress("lollypop", "lolly.pop@somemail.com"); 
email.setSubject("hey");
email.addRecipient("C. Cane", "candycane@candyshop.org", RecipientType.TO);
email.addRecipient("C. Bo", "chocobo@candyshop.org", RecipientType.BCC); 
email.setText("We should meet up! ;)"); 
email.setTextHTML("<img src='cid:wink1'><b>We should meet up!</b><img src='cid:wink2'>");

// embed images and include downloadable attachments 
email.addEmbeddedImage("wink1", imageByteArray, "image/png");
email.addEmbeddedImage("wink2", imageDatesource); 
email.addAttachment("invitation", pdfByteArray, "application/pdf");
email.addAttachment("dresscode", odfDatasource);

new Mailer("smtp.host.com", 25, "username", "password").sendMail(email);
// or alternatively, pass in your own traditional MailSession object.
new Mailer(preconfiguredMailSession).sendMail(email);

#5


5  

I usually define my javamail session in the GlobalNamingResources section of tomcat's server.xml file so that my code does not depend on the configuration parameters:

我通常在tomcat的server.xml文件的GlobalNamingResources部分中定义我的javamail会话,这样我的代码就不依赖于配置参数:

<GlobalNamingResources>
    <Resource name="mail/Mail" auth="Container" type="javax.mail.Session"
              mail.smtp.host="localhost"/>
    ...
</GlobalNamingResources>

and I get the session via JNDI:

我通过JNDI得到了会话:

    Context context = new InitialContext();
    Session sess = (Session) context.lookup("java:comp/env/mail/Mail");

    MimeMessage message = new MimeMessage(sess);
    message.setFrom(new InternetAddress(from));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
    message.setSubject(subject, "UTF-8");
    message.setText(content, "UTF-8");
    Transport.send(message);

#6


3  

JavaMail is great if you can rely on an outside SMTP server. If, however, you have to be your own SMTP server, then take a look at Asprin.

如果您可以依赖外部SMTP服务器,那么JavaMail非常棒。但是,如果您必须是自己的SMTP服务器,请查看Asprin。

#7


1  

use the Java Mail library

使用Java Mail库

import javax.mail.*

...

Session mSession = Session.getDefaultInstance(new Properties());
Transport mTransport = null;
mTransport = mSession.getTransport("smtp");
mTransport.connect(cServer, cUser, cPass);
MimeMessage mMessage = new MimeMessage(mSession);
mTransport.sendMessage(mMessage,  mMessage.getAllRecipients());
mTransport.close();

This is a truncated version of the code I use to have an application send emails. Obviously, putting a body and recipients in the message before sending it is probably going to suit you better.

这是我用来让应用程序发送电子邮件的代码的截断版本。显然,在发送邮件之前将正文和收件人放在邮件中可能更适合您。

The maven repository location is artifactId: javax.mail, groupId: mail.

maven存储库位置是artifactId:javax.mail,groupId:mail。

#8


1  

Add java.mail jar into your class path if it is non maven project Add the below dependency into your pom.xml execute the code

如果java.mail jar是非maven项目,则将java.mail jar添加到您的类路径中。将以下依赖项添加到您的pom.xml中执行代码

 <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4</version>
    </dependency>

Below is the tested code

以下是经过测试的代码

import java.util.Date;
    import java.util.Properties;

    import javax.mail.Authenticator;
    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 MailSendingDemo {
        static Properties properties = new Properties();
        static {
            properties.put("mail.smtp.host", "smtp.gmail.com");
            properties.put("mail.smtp.port", "587");
            properties.put("mail.smtp.auth", "true");
            properties.put("mail.smtp.starttls.enable", "true");
        }
        public static void main(String[] args) {
            String returnStatement = null;
            try {
                Authenticator auth = new Authenticator() {
                    public PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication("yourEmailId", "password");
                    }
                };
                Session session = Session.getInstance(properties, auth);
                Message message = new MimeMessage(session);
                message.setFrom(new InternetAddress("yourEmailId"));            
                message.setRecipient(Message.RecipientType.TO, new InternetAddress("recepeientMailId"));
                message.setSentDate(new Date());
                message.setSubject("Test Mail");
                message.setText("Hi");
                returnStatement = "The e-mail was sent successfully";
                System.out.println(returnStatement);    
                Transport.send(message);
            } catch (Exception e) {
                returnStatement = "error in sending mail";
                e.printStackTrace();
            }
        }
    }

#9


-1  

Here is the simple Solution

这是简单的解决方案

Download these jars: 1. Javamail 2. smtp 3. Java.mail

下载这些jar:1。Javamail 2. smtp 3. Java.mail

Copy and paste the below code from [http://javapapers.com/core-java/java-email/][1]

从[http://javapapers.com/core-java/java-email/][1]复制并粘贴以下代码

Edit the ToEmail, Username and Password (Gmail User ID and Pwd)

编辑ToEmail,用户名和密码(Gmail用户ID和密码)