7

Java を使用して、電子メールの添付ファイルとして画像を送信できました。私は今、次のようにメール本文で同じ画像を送信しようとしています:

public static void main(String[] args) throws NoSuchProviderException, MessagingException {
    System.out.println("Sending mail...");
    Properties props = new Properties();
    props.setProperty("mail.smtp.starttls.enable", "true");
    props.setProperty("mail.transport.protocol", "smtp");
    props.setProperty("mail.smtp.auth", "true");
    props.setProperty("mail.smtp.host", "smtp.gmail.com");

props.setProperty("mail.smtp.port", "587");
    props.setProperty("mail.smtp.user", "mysusername");
    props.setProperty("mail.smtp.password", "mypassword");

    Session mailSession = Session.getDefaultInstance(props, null);
    mailSession.setDebug(true);
    Transport transport = mailSession.getTransport();

    MimeMessage message = new MimeMessage(mailSession);
    message.setSubject("HTML  mail with images");
    message.setFrom(new InternetAddress("myaddress@gmail.com"));
    message.setContent
      ("<h1>This is a test</h1>" 
       + "<img src=\"C:/Users/pc/Desktop/Photos/Shammah.PNG\">", 
       "text/html");
    message.addRecipient(Message.RecipientType.TO,
         new InternetAddress("receiver@simbatech.biz"));

    transport.connect();//This is line 46
    transport.sendMessage(message,
        message.getRecipients(Message.RecipientType.TO));
    transport.close();
}

私はこの出力を得ています:

Sending mail...
DEBUG: setDebug: JavaMail version 1.4ea
DEBUG: getProvider() returning        javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
Exception in thread "main" javax.mail.AuthenticationFailedException
at javax.mail.Service.connect(Service.java:306)
at javax.mail.Service.connect(Service.java:156)
at javax.mail.Service.connect(Service.java:105)
at image.in.body.ImageInBody.main(ImageInBody.java:46)
Java Result: 1

Gmail アカウントに正しいユーザー名とパスワードを使用しているのに、認証が失敗するのはなぜですか?

4

5 に答える 5

11

以下のコードを参照してください。

class SimpleMail2 {
    public static void main(String[] args) throws Exception{

        System.out.println("Sending mail...");
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");

        Session mailSession = Session.getDefaultInstance(props,
        new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("sender@gmail.com","password");
            }
        });
        Message message = new MimeMessage(mailSession);
        message.setFrom(new InternetAddress("sender@gmail.com"));
        message.setSubject("HTML  mail with images");
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("receiver@gmail.com"));
        message.setText("Dear Mail Crawler," + "\n\n No spam to my email, please!");

        MimeMultipart multipart = new MimeMultipart("related");
        BodyPart messageBodyPart = new MimeBodyPart();
        String htmlText = "<H1>Raghava chary</H1>" + "<img src=\"cid:image\">";
        messageBodyPart.setContent(htmlText, "text/html");
        multipart.addBodyPart(messageBodyPart);
        try {
            messageBodyPart = new MimeBodyPart();
            InputStream imageStream = SimpleMail2.class.getClass().getResourceAsStream("/ab/log.gif");
            DataSource fds = new ByteArrayDataSource(IOUtils.toByteArray(imageStream), "image/gif");
            messageBodyPart.setDataHandler(new DataHandler(fds));
            messageBodyPart.setHeader("Content-ID","<image>");
            multipart.addBodyPart(messageBodyPart);
            message.setContent(multipart);
            Transport.send(message);
            System.out.println("Done");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

org.apache.commons.io.jar.zipとaxiom-api-1.2.6.jarを追加し、mail.jarとactivation.jarを追加します

于 2013-02-12T12:37:49.760 に答える
8

次のように画像を宣言する必要があります。

<img src="cid:unique-name-or-id" />

イメージを MimeBodyPart としてロードし、unique-name-or-id を MimeBodyPart の FileName と一致させます。

于 2012-11-13T09:58:45.357 に答える
2

content-disposition インラインでマルチパート ボディを作成し、イメージを base64 でエンコードします。

詳細については、この SO を確認してください (Python で)埋め込み画像を含むマルチパート HTML メールの送信

于 2012-11-13T09:45:26.433 に答える
1

まず、この JavaMail FAQ よくある間違いのエントリ を参照してください。

次に、 Gmail に接続するためのサンプル コードを含むこの JavaMail FAQ エントリを参照してください。

「mail.smtp.password」プロパティがないことに注意してください。パスワードを指定していないため、認証に失敗しています。

于 2012-11-13T18:51:15.070 に答える
1

もう 1 つのよくある間違い (今日私が気になった点): 画像の Content-ID ヘッダーは <山かっこ> で囲む必要があります。そうしないと、一部のメール プログラム (gmail、OS X 10.10) は壊れますが、他のプログラム (Outlook、iOS <= 8.1) は壊れません。

于 2014-10-22T20:39:54.703 に答える