AWS - извлечение шаблона электронной почты из корзины S3 с использованием java / js - PullRequest
0 голосов
/ 29 октября 2019

Мой вопрос, похоже, очень похож на AWS - с использованием шаблона электронной почты из корзины S3 , за исключением того, что вместо Python я использую java / springboot для отправки электронной почты из AWS SES и использую javascript / typescript длявнешний интерфейс. Я могу отправить электронное письмо с жестко закодированной темой и телом. Я хочу иметь возможность отправить электронное письмо с шаблоном из моей корзины S3. У моего приложения есть список шаблонов в корзине. Когда выбрано, отображается предварительный просмотр. Как я могу отправить выбранный шаблон в моем приложении?

# "send-email-templates.ts"
constructor(
    private templateService: TemplateService,
    private schoolService: SchoolService,
    private hireStageService: HireStageService,
    private emailSearchService: EmailSearchService,
    private router: Router,
    private _ngZone: NgZone,
    private candidateService: CandidateService,
    public dialog: MatDialog,
) { }

ngOnInit() {
    this.getSchools();
    this.getHireStages();
    this.isPreviewOpen = false;
    this.selectedTemplateName = null;
    this.getAllTemplates();
}

triggerResize() {
    this._ngZone.onStable.pipe(take(1)).subscribe(() => this.autosize.resizeToFitContent(true));
}

createNewTemp() {
    this.router.navigate([`/create_template`])
}

// Send email template to multiple emails after search filter
sendEmail() {
            this.dialog.open(DialogOverviewExampleDialog, {
        width: '250px'
    });
    let candidateEmails = (<HTMLInputElement>document.getElementById("emailList")).value
    let subject = this.sendForm.get('subjectForm').value
    let body = "HARDCODED BODY"
    this.candidateService.sendEmailWithoutPositions(candidateEmails, subject, body).subscribe(() => {
        this.router.navigate(['/send_email']);
    });
}

searchCandidates() {
    this.emailSearchService.searchCandidates(this.searchForm.get('namesForm').value,
        this.searchForm.get('majorsForm').value, this.schools.toString(),
        this.hireStages.toString(), this.searchForm.get('startDateForm').value,
        this.searchForm.get('endDateForm').value)
        .subscribe(listOfEmails => {
            console.log(listOfEmails);
           (<HTMLInputElement>document.getElementById('emailList')).value = <string> listOfEmails;
        })
}

//Send email to new candidate
sendEmail(candidateEmail: string, positionId: number[], subject: string, body: string) {
    let details:emailDetails = new emailDetails();
    details.to = candidateEmail;
    details.positionId = positionId;
    details.subject = subject;
    details.body = body;
    return this.http.post<emailDetails>(`${this.context.getOutgoingEmailUrl()}`, details)
}

// Send email to string of search/filtered candidate emails
sendEmailWithoutPositions(candidateEmails: string, subject: string, body: string) {
    let details:emailDetails2 = new emailDetails2();
    details.to = candidateEmails;
    details.subject = subject;
    details.body = body;
    return this.http.post<emailDetails2>(`${this.context.getOutgoingEmailUrl()}`, details)
}

HTML

    <mat-grid-tile colspan="6" rowspan="4">
        <div class='search'>
            <form [formGroup]='searchForm' autocomplete='off' novalidate>
                <mat-form-field class="nameSearch">
                    <span matPrefix>Name:&nbsp;</span>
                    <input matInput id='namesForm' placeholder="&nbsp;Enter candidate name" formControlName='namesForm'>
                </mat-form-field>
                <mat-form-field class="majorSearch">
                    <span matPrefix>Major:&nbsp;</span>
                    <input matInput id='majorsForm' placeholder="&nbsp;Enter candidate major" formControlName="majorsForm">
                </mat-form-field>

                <tr>
                    <td>
                        <mat-form-field *ngIf="schoolSource" class="schools">
                            <mat-label>Schools</mat-label>
                            <mat-chip-list #chipList>
                                <mat-chip *ngFor="let school of schools" [selectable]="true" [removable]="true"
                                    (removed)="removeSchool(school)">
                                    {{ school }}
                                    <mat-icon matChipRemove *ngIf="removable">cancel</mat-icon>
                                </mat-chip>
                                <input input='schoolsForm' placeholder="Choose school(s)" #schoolInput [formControl]="schoolCtrl"
                                    [matAutocomplete]="auto" [matChipInputFor]="chipList"
                                    [matChipInputSeparatorKeyCodes]="separatorKeysCodes"
                                    [matChipInputAddOnBlur]="addOnBlur" formControlName='schoolsForm'>
                            </mat-chip-list>

                            <mat-autocomplete #auto (optionSelected)="selectedSchool($event)">
                                <mat-option *ngFor="let school of schoolSource" [value]='schoolId'>
                                    {{ school.schoolName }}
                                </mat-option>
                            </mat-autocomplete>
                        </mat-form-field>
                    </td>
                    <td>
                        <mat-form-field *ngIf="hireStageSource" class="hireStages">
                            <mat-label>Hire Stage</mat-label>
                            <mat-chip-list #chipList1>
                                <mat-chip *ngFor="let hireStage of hireStages" [selectable]="true" [removable]="true"
                                    (removed)="removeStage(hireStage)">
                                    {{ hireStage }}
                                    <mat-icon matChipRemove *ngIf="removable">cancel</mat-icon>
                                </mat-chip>
                                <input id='stagesForm' placeholder="Choose Hire Stage(s)" #hireStageInput [formControl]="hireStageCtrl"
                                    [matAutocomplete]="auto1" [matChipInputFor]="chipList1"
                                    [matChipInputSeparatorKeyCodes]="separatorKeysCodes"
                                    [matChipInputAddOnBlur]="addOnBlur" formControlName='stagesForm'>
                            </mat-chip-list>

                            <mat-autocomplete #auto1 (optionSelected)="selectedStage($event)">
                                <mat-option *ngFor="let hireStage of hireStageSource" [value]='stageId'>
                                    {{ hireStage.stageName }}
                                </mat-option>
                            </mat-autocomplete>
                        </mat-form-field>
                <tr>
                    <div class="dates">
                        <mat-form-field class="startDate">
                            <input matInput id='startDateForm' [matDatepicker]="picker" placeholder="Start date"
                                name="startDate" formControlName='startDateForm'>
                            <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
                            <mat-datepicker #picker></mat-datepicker>
                        </mat-form-field>

                        <mat-form-field class="endDate">
                            <input matInput id='endDateForm'[matDatepicker]="picker2" placeholder="End date"
                                name="endDate" formControlName='endDateForm'>
                            <mat-datepicker-toggle matSuffix [for]="picker2"></mat-datepicker-toggle>
                            <mat-datepicker #picker2></mat-datepicker>
                        </mat-form-field>
                            <button class="addEmail" mat-raised-button color = "primary" (click) = "searchCandidates()">Add</button>
                    </div>
                </tr>
                </td>
            </form>
        </div>
    </mat-grid-tile>

    <mat-grid-tile colspan="4" rowspan="4">
        <div class='send'>
            <form [formGroup]='sendForm' autocomplete='off' novalidate name="form">
                <tr>
                    <button class="newTemplateButt" mat-raised-button color = "primary" (click) = "createNewTemp()">Create New Template</button>
                </tr>
                <tr>
                    <mat-form-field class="sendToList">
                        <mat-label>Candidate Emails will be listed here</mat-label>
                        <textarea   id = 'emailList'
                                    matInput
                                    cdkTextareaAutosize
                                    #autosize = "cdkTextareaAutosize"
                                    cdkAutosizeMinRows = "1"
                                    cdkAutosizeMaxRows = "8"></textarea>
                    </mat-form-field>
                </tr>
                <tr>
                    <mat-form-field class = "subjectLine">
                        <span matPrefix>Subject:&nbsp;</span>
                        <input matInput id='subjectLine' formControlName='subjectForm'>
                    </mat-form-field>
                </tr>
                <button mat-raised-button color = "primary" class = "sendEmail" (click) = "sendEmail()">Send Email</button>
            </form>
        </div>
    </mat-grid-tile>
</mat-grid-list>

<div class="email-templates" [style.display]="isPreviewOpen ? 'grid' : 'flex'">
    <app-email-templates-list [templates]="templateList" [selectedTemplate]="selectedTemplateName" (display)="displayPreviewHandler($event)"></app-email-templates-list>```
    <app-email-templates-preview [previewStatus]="isPreviewOpen" [selectedTemplate]="selectedTemplateName"></app-email-templates-preview>
</div>

1 Ответ

0 голосов
/ 30 октября 2019
sendEmail() {
            this.dialog.open(DialogOverviewExampleDialog, {
        width: '250px'
    });
    let candidateEmails = (<HTMLInputElement>document.getElementById("emailList")).value
    let subject = this.sendForm.get('subjectForm').value
    console.log(this.selectedTemplateName)
    this.templateService.getTemplate(this.selectedTemplateName).subscribe((templateData : any) => {
        console.log(templateData.Body)
        console.log(templateData.Body.data)
        let body = importTemplate(templateData.Body.data).toString();
        console.log(body)
        this.candidateService.sendEmailWithoutPositions(candidateEmails, subject, body).subscribe(() => {
            this.router.navigate(['/send_email']);
        });
    })
}

Сейчас отправляются шаблоны, но изображения не отображаются. Все еще изучаю эту проблему. Изменить: изображения не отправлялись, потому что они были закодированы в base64. При просмотре источника всех изображений в результатах поиска картинок Google все они показывали кодировку base64. Я заметил, что когда я обращался к источнику этих изображений, он давал мне более конкретный src, такой как https: //......jpg. Когда я перетаскивал это исходное изображение в свой шаблон, сохранял и отправлял, он отказывался от кодировки base64, и, следовательно, изображения теперь отображаются в моем почтовом ящике Gmail при отправке из моего приложения.

...