Отправка почты HTML использования сценария оболочки

Чтобы полностью ответить на ваш вопрос:

  1. Вы на самом деле неправильно используете сканер. Вот очень хороший ответ, который показывает несколько способов , как преобразовать InputStream в String . Единственное, что вам нужно знать, - это как получить InputStream для файла (проверьте код ниже). Как примечание, вы всегда должны помнить, чтобы закрыть свои ресурсы. Поэтому закройте ваш FileInputStream, если он больше не используется ( подробнее здесь ).
    File file = new File("your/file/path/file.ending");
    try (FileInputStream fis = new FileInputStream(file)) {
        // your code here
    } catch (FileNotFoundException e){
        e.printStackTrace();
    }

  1. Существует также несколько возможностей для создания и записи содержимого в файл. Посмотрите: Как сохранить строку в текстовом файле с помощью Java?

И чтобы подвести итог, я создал рабочий пример, использующий немного другой способ реализации шифрования цезаря и использующий Files.lines (... ) для чтения содержимого файлов и Files.write (...) для записи зашифрованного содержимого в новый файл:

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Scanner;
import java.util.stream.Stream;

public class CaesarCipher {

    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);

        System.out.print("What is the input file name? ");
        Path filePath = Paths.get(scanner.nextLine());

        System.out.print("What is the output file name? ");
        Path encodedFilePath = Paths.get(scanner.nextLine());

        System.out.print("Caesar cipher offset? ");
        final int offset = Integer.parseInt(scanner.nextLine());

        // Retrieve a a stream of the input file, where each line is mapped using the encrypt function
        Stream mappedFileStream = Files.lines(filePath).map(msg -> CaesarCipher.encrypt(msg, offset));

        // Write encrypted content to a new file using our mapped stream as an iterable
        Files.write(
                encodedFilePath,
                (Iterable) mappedFileStream::iterator,
                StandardCharsets.UTF_8,
                StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);

        // Decrypt the encoded file content and print it
        Files.lines(encodedFilePath)
                .map((fileLine) -> CaesarCipher.decrypt(fileLine, offset))
                .forEach(System.out::println);
    }

    public static String encrypt(String msg, int offset) {
        offset = offset % 26 + 26;
        StringBuilder encoded = new StringBuilder(msg.length());
        for (char i : msg.toCharArray()) {
            if (Character.isLetter(i)) {
                char base = Character.isUpperCase(i) ? 'A' : 'a';
                encoded.append((char) (base + (i - base + offset) % 26));
            } else {
                encoded.append(i);
            }
        }
        return encoded.toString();
    }

    public static String decrypt(String enc, int offset) {
        return encrypt(enc, 26 - offset);
    }
}

49
задан random 20 July 2011 в 15:59
поделиться

5 ответов

Сначала нужно составить сообщение. Самый минимум состоит из этих двух заголовков:

MIME-Version: 1.0
Content-Type: text/html

... и соответствующего тела сообщения:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title></title>
</head>
<body>

<p>Hello, world!</p>

</body>
</html>

Получив его, вы можете передать соответствующую информацию команде mail :

body = '...'

echo $body | mail \
-a "From: me@example.com" \
-a "MIME-Version: 1.0" \
-a "Content-Type: text/html" \
-s "This is the subject" \
you@example.com

Это упрощенный пример, так как вам также нужно позаботиться о кодировках, кодировках, максимальной длине строки ... Но в основном это идея.

Как вариант, вы можете написать свой сценарий на Perl или PHP, а не на простой оболочке.

Обновление

Сценарий оболочки - это, по сути, текстовый файл с окончанием строки Unix, который начинается со строки с именем shebang , которая сообщает оболочке, в какой интерпретатор он должен передать файл, следуйте некоторым командам в язык, который интерпретатор понимает и имеет разрешение на выполнение (в Unix это атрибут файла). Например, допустим, вы сохраняете следующее как hello-world :

#!/bin/sh

echo Hello, world!

Затем вы назначаете разрешение на выполнение:

chmod +x hello-world

И вы, наконец, можете запустить его:

./hello-world

Как бы то ни было, это не имеет отношения к оригинальный вопрос. Вам следует ознакомиться с базовыми сценариями оболочки, прежде чем выполнять с ними расширенные задачи. Вот пара ссылок о bash , популярной оболочке:

http://www.gnu.org/software/bash/manual/html_node/index.html

http: / /tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html

59
ответ дан 7 November 2019 в 11:21
поделиться

Можно использовать опцию-o в sendEmail для отправки электронного письма HTML.

-o message-content-type=html для определения типа контента электронной почты.

-o файл сообщений для добавления файла HTML к почтовому содержанию.

я попробовал эту опцию в сценарии оболочки, и она работает.

Вот полная команда:

/usr/local/bin/sendEmail -f sender@test.com -t "reciever@test.com" -s \
 smtp.test.com -u "Title" -xu sender@test.com -xp password \
 -o message-charset=UTF-8  \
 -o message-content-type=html \
 -o message-file=test.html
0
ответ дан 7 November 2019 в 11:21
поделиться

Теги включают 'sendmail', поэтому вот решение, использующее это:

(
echo "From: me@xyz.com "
echo "To: them@xyz.com "
echo "MIME-Version: 1.0"
echo "Content-Type: multipart/alternative; " 
echo ' boundary="some.unique.value.ABC123/server.xyz.com"' 
echo "Subject: Test HTML e-mail." 
echo "" 
echo "This is a MIME-encapsulated message" 
echo "" 
echo "--some.unique.value.ABC123/server.xyz.com" 
echo "Content-Type: text/html" 
echo "" 
echo "<html> 
<head>
<title>HTML E-mail</title>
</head>
<body>
<a href='http://www.google.com'>Click Here</a>
</body>
</html>"
echo "------some.unique.value.ABC123/server.xyz.com--"
) | sendmail -t

Обертка для sendmail может упростить эту работу, например mutt :

mutt -e 'set content_type="text/html"' me@mydomain.com -s "subject" <  message.html
47
ответ дан 7 November 2019 в 11:21
поделиться

Другой вариант - сценарий sendEmail http://caspian.dotconf.net/menu/Software/SendEmail/, он также позволяет вам установить тип сообщения как html и включить файл в качестве тела сообщения. Подробности смотрите по ссылке.

2
ответ дан 7 November 2019 в 11:21
поделиться

Другой вариант - использовать msmtp.

Что вам нужно, так это настроить ваш .msmtprc с чем-то вроде этого (в примере используется gmail):

account default
host smtp.gmail.com
port 587
from example@gmail.com
tls on
tls_starttls on
tls_trust_file ~/.certs/equifax.pem
auth on
user example@gmail.com
password <password>
logfile ~/.msmtp.log

Затем просто вызовите:

(echo "Subject: <subject>"; echo; echo "<message>") | msmtp <email@domain.tld>

в вашем скрипте.

Обновление: для HTML-почты вы должны поместить заголовки тоже, так что вы можете захотеть создать файл, подобный этому:

From: sender@domain.tld
To: email@domain.tld
Subject: Important message
Mime-Version: 1.0
Content-Type: text/html

<h1>Mail body will be here</h1>
The mail body <b>should</b> start after one blank line from the header.

И отправить его по почте, как

cat email-template | msmtp email@domain.tld

То же самое можно сделать и через командную строку, но может быть проще использовать файл.

2
ответ дан 7 November 2019 в 11:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: