web-dev-qa-db-ja.com

Javaで電子メールを送信するにはどうすればよいですか?

Tomcat内で実行されているサーブレットから電子メールを送信する必要があります。私は常に同じ件名で、内容が異なる同じ受信者に送信します。

Javaで電子メールを送信するためのシンプルで簡単な方法は何ですか?

関連:

GMailを使用してJavaアプリからメールを送信するにはどうすればよいですか?

29
Steve McLeod

これを行うための私のコードは次のとおりです。

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 = "[email protected]";
String from = "[email protected]";
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.
}

ここでSunからJavaMailライブラリを入手できます: http://Java.Sun.com/products/javamail/

31
RichieHindle

JavaMailは、使用するのが少し面倒な場合があります。よりシンプルでクリーンなソリューションが必要な場合は、JavaMailのSpringラッパーをご覧ください。リファレンスドキュメントはこちらです:

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

ただし、これは、アプリケーションにSpringが必要であることを意味します。それがオプションでない場合は、simple-Java-mailなどの別のオープンソースラッパーを調べることができます。

simplejavamail.org

または、JavaMailを直接使用することもできますが、上記の2つのソリューションは、Javaで電子メールを送信するためのより簡単でクリーンな方法です。

23
Jon

Java Mail APIをラップするさらに別のオプションは Apacheのcommons-email です。

彼らから ユーザーガイド。

SimpleEmail email = new SimpleEmail();
email.setHostName("mail.myserver.com");
email.addTo("[email protected]", "John Doe");
email.setFrom("[email protected]", "Me");
email.setSubject("Test message");
email.setMsg("This is a simple test of commons-email");
email.send();
20
Steve K

Jonの返信をフォローアップするために、 simple-Java-mail を使用してメールを送信する例を次に示します。

アイデアは、電子メールを構成するすべての技術的な(ネストされた)部分について知る必要がないということです。その意味で、Apacheのcommons-emailによく似ていますが、添付ファイルや埋め込み画像を処理する場合、Simple Java MailはApacheのメールAPIよりも少し簡単です。 Springのメール機能も同様に機能しますが、使用が少し厄介です(たとえば、匿名の内部クラスが必要です)。もちろん、Springに依存する必要があります。これは、Springが設計されているため、単なるメールライブラリ以上のものを提供します。 IOCソリューションになります。

単純なJava Mail btwは、JavaMailAPIのラッパーです。

final Email email = new Email();

email.setFromAddress("lollypop", "[email protected]"); 
email.setSubject("hey");
email.addRecipient("C. Cane", "[email protected]", RecipientType.TO);
email.addRecipient("C. Bo", "[email protected]", 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);
9
user109771

私は通常、Tomcatのserver.xmlファイルのGlobalNamingResourcesセクションでjavamailセッションを定義して、コードが構成パラメーターに依存しないようにします。

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

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);
5
Maurice Perry

JavaMailは、外部のSMTPサーバーに依存できる場合に最適です。ただし、独自のSMTPサーバーである必要がある場合は、 Asprin を参照してください。

3
Yishai

Maven以外のプロジェクトの場合は、Java.mailjarをクラスパスに追加します。以下の依存関係をpom.xmlに追加してコードを実行します。

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

以下はテストされたコードです

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

Javaメールライブラリを使用する

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

これは、アプリケーションに電子メールを送信させるために使用するコードの切り捨てられたバージョンです。明らかに、メッセージを送信する前に本文と受信者をメッセージに入れることは、おそらくあなたにより適しているでしょう。

Mavenリポジトリの場所はartifactId:javax.mail、groupId:mailです。

1
Jherico